[jedit] 02/03: Imported Upstream version 5.3.0+dfsg

Tony Mancill tmancill at moszumanska.debian.org
Sun Jan 3 04:47:39 UTC 2016


This is an automated email from the git hooks/post-receive script.

tmancill pushed a commit to branch master
in repository jedit.

commit d134efb1479b728fb59ea39f12d38c60e85722aa
Author: tony mancill <tmancill at debian.org>
Date:   Sat Jan 2 20:38:58 2016 -0800

    Imported Upstream version 5.3.0+dfsg
---
 .idea/libraries/Compile_Dependencies.xml           |   15 +
 .idea/libraries/Runtime_Dependencies.xml           |   15 +
 build.xml                                          |   42 +-
 doc/CHANGES.txt                                    |  239 +-
 doc/FAQ/faq-install.xml                            |  516 ++--
 doc/FAQ/faq-use.xml                                | 1149 +++++----
 doc/FAQ/faq.xml                                    |    4 +-
 doc/releasing-jedit.txt                            |  200 +-
 doc/users-guide/basics.xml                         |   11 +
 doc/users-guide/customizing.xml                    |   15 +-
 doc/users-guide/installing-modes.xml               |   18 +-
 doc/users-guide/plugin-implement.xml               |  124 +-
 doc/users-guide/starting.xml                       |   29 +-
 doc/users-guide/users-guide.xml                    |   18 +-
 doc/welcome.html                                   |    2 +-
 doc/whatsnew/news.xml                              |   11 +-
 jEdit.iml                                          |    3 +-
 keymaps/Alan_keys.props                            |  403 ++++
 macros/C/Include_Guard.bsh                         |    5 +-
 macros/Clipboard/Cut_Lines.bsh                     |    5 +-
 macros/Clipboard/Cut_Lines_Containing.bsh          |    5 +-
 macros/Editing/Duplicate_Lines_Above.bsh           |   11 -
 macros/Editing/Duplicate_Lines_Below.bsh           |   11 -
 macros/Editing/Greedy_Backspace.bsh                |    5 +-
 macros/Editing/Greedy_Delete.bsh                   |    5 +-
 macros/Editing/Move_Lines_Down.bsh                 |   94 +-
 macros/Editing/Move_Lines_Up.bsh                   |  114 +-
 macros/Files/Insert_Selection.bsh                  |    7 +-
 macros/Java/Create_Constructor.bsh                 |    3 -
 macros/Java/Get_Class_Name.bsh                     |    5 -
 macros/Java/Get_Package_Name.bsh                   |    7 +-
 macros/Java/Make_Get_and_Set_Methods.bsh           |    3 -
 macros/Misc/Display_Abbreviations.bsh              |    3 +-
 macros/Misc/Display_Shortcuts.bsh                  |    1 +
 macros/Misc/Show_Threads.bsh                       |    3 +-
 macros/Properties/Insert_Buffer_Properties.bsh     |    6 +-
 macros/Text/Add_Prefix_and_Suffix.bsh              |    5 +-
 macros/Text/Color_Picker.bsh                       |    5 +-
 macros/Text/Compose_Tag.bsh                        |    3 -
 macros/Text/Duplicate_Line.bsh                     |   12 +-
 macros/Text/Insert_Date.bsh                        |    5 +-
 macros/Text/Insert_Tag.bsh                         |    5 +-
 macros/Text/Reverse_Lines.bsh                      |    5 +-
 misc/clojure/README.txt                            |   62 +
 misc/clojure/keywords.clj                          |  176 ++
 misc/clojure/keywords.csv                          |  856 +++++++
 misc/clojure/run                                   |   38 +
 modes/ans-forth94.xml                              |  586 +++++
 modes/antlr4.xml                                   |  131 +
 modes/catalog                                      |  434 ++--
 modes/cfscript.xml                                 |   26 +-
 modes/clojure.xml                                  | 1407 ++++++++---
 modes/go.xml                                       |  331 ++-
 modes/kotlin.xml                                   |  168 ++
 modes/markdown.xml                                 |  232 ++
 modes/mustache.xml                                 |   51 +
 modes/patch.xml                                    |   24 +-
 modes/props.xml                                    |   69 +-
 modes/rust.xml                                     |  299 +++
 modes/scala.xml                                    |  288 ++-
 org/gjt/sp/jedit/Abbrevs.java                      |    9 +-
 org/gjt/sp/jedit/AbstractOptionPane.java           |    4 +-
 org/gjt/sp/jedit/ActionSet.java                    |    8 +-
 org/gjt/sp/jedit/BeanShell.java                    |   14 +-
 org/gjt/sp/jedit/BeanShellFacade.java              |   14 +-
 org/gjt/sp/jedit/Buffer.java                       |   67 +-
 org/gjt/sp/jedit/Debug.java                        |    3 +-
 org/gjt/sp/jedit/EBMessage.java                    |    6 +-
 org/gjt/sp/jedit/EditAction.java                   |   20 +-
 org/gjt/sp/jedit/EditBus.java                      |    6 +-
 org/gjt/sp/jedit/EditPane.java                     |   66 +-
 org/gjt/sp/jedit/EditPlugin.java                   |   12 +-
 org/gjt/sp/jedit/EditServer.java                   |    5 +-
 org/gjt/sp/jedit/GUIUtilities.java                 |  244 +-
 org/gjt/sp/jedit/JEditActionContext.java           |    8 +-
 org/gjt/sp/jedit/JEditActionSet.java               |   21 +-
 org/gjt/sp/jedit/MiscUtilities.java                |   31 +-
 org/gjt/sp/jedit/Mode.java                         |   35 +-
 org/gjt/sp/jedit/OptionPane.java                   |    6 +-
 org/gjt/sp/jedit/PluginJAR.java                    |  177 +-
 org/gjt/sp/jedit/PropertyManager.java              |    2 +-
 org/gjt/sp/jedit/ServiceManager.java               |    4 +-
 org/gjt/sp/jedit/View.java                         |   20 +-
 org/gjt/sp/jedit/actions.xml                       |   10 -
 .../sp/jedit/browser/VFSDirectoryEntryTable.java   |   11 +-
 .../jedit/browser/VFSDirectoryEntryTableModel.java |   14 +-
 org/gjt/sp/jedit/browser/VFSFileNameField.java     |    2 +-
 org/gjt/sp/jedit/buffer/BufferUndoListener.java    |    6 +-
 org/gjt/sp/jedit/buffer/FoldHandler.java           |    4 +-
 org/gjt/sp/jedit/buffer/JEditBuffer.java           |  139 +-
 org/gjt/sp/jedit/bufferset/BufferSetManager.java   |    8 +-
 org/gjt/sp/jedit/default.abbrevs                   |  366 +--
 org/gjt/sp/jedit/gui/AboutDialog.java              |    2 +-
 org/gjt/sp/jedit/gui/AddModeDialog.java            |  193 ++
 org/gjt/sp/jedit/gui/BufferSwitcher.java           |   28 +-
 org/gjt/sp/jedit/gui/ColorWellButton.java          |   12 +-
 org/gjt/sp/jedit/gui/CompletionPopup.java          |    1 +
 org/gjt/sp/jedit/gui/DefaultInputHandler.java      |    9 +-
 org/gjt/sp/jedit/gui/DockableWindowContainer.java  |    2 +-
 org/gjt/sp/jedit/gui/EnhancedDialog.java           |   70 +-
 org/gjt/sp/jedit/gui/FilesChangedDialog.java       |    3 +-
 org/gjt/sp/jedit/gui/FilteredTableModel.java       |    5 +-
 org/gjt/sp/jedit/gui/FloatingWindowContainer.java  |   16 +-
 org/gjt/sp/jedit/gui/FontSelectorDialog.java       |    6 +-
 org/gjt/sp/jedit/gui/KeyEventTranslator.java       |   16 +-
 org/gjt/sp/jedit/gui/KeyEventWorkaround.java       |   65 +-
 org/gjt/sp/jedit/gui/ListModelEditor.java          |    6 +-
 org/gjt/sp/jedit/gui/OptionsDialog.java            |    3 +-
 org/gjt/sp/jedit/gui/PanelWindowContainer.java     |    5 +-
 org/gjt/sp/jedit/gui/TaskMonitor.java              |    1 +
 org/gjt/sp/jedit/gui/TipOfTheDay.java              |    6 +-
 org/gjt/sp/jedit/gui/VariableGridLayout.java       |   20 +-
 .../gui/statusbar/MemoryStatusWidgetFactory.java   |    5 +-
 org/gjt/sp/jedit/help/HelpIndex.java               |    6 +-
 org/gjt/sp/jedit/help/HelpTOCPanel.java            |    1 +
 org/gjt/sp/jedit/help/HelpViewer.java              |   28 +-
 org/gjt/sp/jedit/input/TextAreaInputHandler.java   |    7 -
 org/gjt/sp/jedit/io/LocalFileSaveTask.java         |    2 +-
 org/gjt/sp/jedit/io/VFS.java                       |    4 +-
 org/gjt/sp/jedit/io/VFSFile.java                   |   32 +-
 org/gjt/sp/jedit/io/VFSManager.java                |   62 +-
 org/gjt/sp/jedit/jEdit.java                        |   74 +-
 org/gjt/sp/jedit/jedit.props                       |   12 +-
 org/gjt/sp/jedit/jedit_gui.props                   |  344 +--
 .../sp/jedit/menu/EnhancedCheckBoxMenuItem.java    |   10 +-
 org/gjt/sp/jedit/menu/EnhancedMenuItem.java        |   27 +-
 org/gjt/sp/jedit/menu/MarkersProvider.java         |   14 +-
 org/gjt/sp/jedit/menu/RecentFilesProvider.java     |    2 +
 org/gjt/sp/jedit/msg/ViewUpdate.java               |    9 +-
 org/gjt/sp/jedit/options/AbbrevsOptionPane.java    |    3 +-
 .../sp/jedit/options/BrowserColorsOptionPane.java  |    3 +-
 org/gjt/sp/jedit/options/EditingOptionPane.java    |  172 +-
 org/gjt/sp/jedit/options/GeneralOptionPane.java    |    8 +
 org/gjt/sp/jedit/options/LargeFilesOptionPane.java |  117 +
 org/gjt/sp/jedit/options/ShortcutsOptionPane.java  |    3 +-
 .../sp/jedit/options/SyntaxHiliteOptionPane.java   |    6 +-
 org/gjt/sp/jedit/options/ViewOptionPane.java       |   42 +-
 org/gjt/sp/jedit/package.html                      |    4 +-
 org/gjt/sp/jedit/pluginmgr/InstallPanel.java       |  220 +-
 org/gjt/sp/jedit/pluginmgr/ManagePanel.java        |  247 +-
 org/gjt/sp/jedit/pluginmgr/PluginList.java         |   98 +-
 org/gjt/sp/jedit/pluginmgr/PluginManager.java      |    9 +-
 org/gjt/sp/jedit/pluginmgr/Roster.java             |   64 +-
 .../jeditresource/PluginResURLConnection.java      |   14 +-
 org/gjt/sp/jedit/search/HyperSearchResults.java    |    3 +-
 org/gjt/sp/jedit/search/PatternSearchMatcher.java  |   35 +-
 org/gjt/sp/jedit/syntax/DisplayTokenHandler.java   |   10 +-
 org/gjt/sp/jedit/syntax/ModeProvider.java          |  162 +-
 org/gjt/sp/jedit/textarea/ChunkCache.java          |   19 +-
 org/gjt/sp/jedit/textarea/Gutter.java              |    4 +-
 org/gjt/sp/jedit/textarea/StandaloneTextArea.java  |   14 +-
 org/gjt/sp/jedit/textarea/StructureMatcher.java    |   15 +-
 org/gjt/sp/jedit/textarea/TextArea.java            |   26 +-
 .../sp/jedit/textarea/TextAreaMouseHandler.java    |    9 +-
 org/gjt/sp/jedit/textarea/TextAreaPainter.java     |  102 +-
 org/gjt/sp/util/EnhancedTreeCellRenderer.java      |   10 +-
 org/gjt/sp/util/StandardUtilities.java             |   23 +-
 org/gjt/sp/util/Task.java                          |    3 +-
 org/jedit/core/MigrationService.java               |    8 +-
 org/jedit/keymap/KeymapImpl.java                   |    3 +-
 org/jedit/localization/jedit_en.props              |   48 +-
 org/jedit/localization/jedit_fr.props              |    2 +-
 org/jedit/localization/jedit_ko.props              | 2519 ++++++++++++++++++++
 org/jedit/localization/package.html                |   22 +
 org/jedit/options/OptionGroupPane.java             |    1 +
 org/jedit/options/TabbedOptionDialog.java          |    2 +-
 166 files changed, 11139 insertions(+), 3686 deletions(-)

diff --git a/.idea/libraries/Compile_Dependencies.xml b/.idea/libraries/Compile_Dependencies.xml
new file mode 100644
index 0000000..2d0a404
--- /dev/null
+++ b/.idea/libraries/Compile_Dependencies.xml
@@ -0,0 +1,15 @@
+<component name="libraryTable">
+  <library name="Compile Dependencies">
+    <CLASSES>
+      <root url="file://$PROJECT_DIR$/lib/compile" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="file://$PROJECT_DIR$/lib/javadoc" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="file://$PROJECT_DIR$/lib/sources" />
+    </SOURCES>
+    <jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" />
+    <jarDirectory url="file://$PROJECT_DIR$/lib/sources" recursive="false" type="SOURCES" />
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Runtime_Dependencies.xml b/.idea/libraries/Runtime_Dependencies.xml
new file mode 100644
index 0000000..660837c
--- /dev/null
+++ b/.idea/libraries/Runtime_Dependencies.xml
@@ -0,0 +1,15 @@
+<component name="libraryTable">
+  <library name="Runtime Dependencies">
+    <CLASSES>
+      <root url="file://$PROJECT_DIR$/lib/runtime" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="file://$PROJECT_DIR$/lib/javadoc" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="file://$PROJECT_DIR$/lib/sources" />
+    </SOURCES>
+    <jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" />
+    <jarDirectory url="file://$PROJECT_DIR$/lib/sources" recursive="false" type="SOURCES" />
+  </library>
+</component>
\ No newline at end of file
diff --git a/build.xml b/build.xml
index f34934f..b2cd1e5 100644
--- a/build.xml
+++ b/build.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0"?>
 <project name="jedit"
 	 default="build"
 	 xmlns:mod="antlib:de.masters_of_disaster.ant.tasks"
@@ -418,22 +417,30 @@
 		       compiler="modern"
 		       encoding="UTF-8"
 		       includeAntRuntime="false">
-			<classpath refid="classpath.compile"/>
+			<classpath id="classpath.compile">
+				<fileset dir="${lib.dir}/compile" includes="*.jar"/>
+			</classpath>
 			<compilerarg line="${config.build.compilerarg}"/>
 		</javac>
 	</target>
 
 	<target name="test"
 		depends="init,retrieve,compile,compile-test"
-		description="run unit tests"
-		unless="skip.tests">
+		description="run unit tests">
 		<delete dir="${build.dir}/test/raw-reports"/>
 		<mkdir dir="${build.dir}/test/raw-reports"/>
-		<junit printsummary="true"
+		<junit fork="true"
+		       forkmode="once"
+		       printsummary="true"
 		       failureproperty="tests.failed"
+		       includeantruntime="false"
+		       showoutput="true"
 		       enabletestlistenerevents="true">
 			<classpath refid="classpath.test"/>
 			<classpath location="${classes.dir}/test"/>
+			<classpath location="${ant.library.dir}/ant.jar"/>
+			<classpath location="${ant.library.dir}/ant-junit.jar"/>
+			<classpath location="${ant.library.dir}/ant-junit4.jar"/>
 			<formatter type="xml"/>
 			<batchtest todir="${build.dir}/test/raw-reports">
 				<fileset dir="test"/>
@@ -449,7 +456,7 @@
 	</target>
 
 	<target name="build"
-		depends="init,retrieve,setup,compile"
+		depends="init,retrieve,setup,compile,test"
 		description="build the jEdit JAR-file with full debug-information">
 		<mkdir dir="${jar.location}"/>
 		<jar destfile="${jar.location}/${jar.filename}"
@@ -504,7 +511,6 @@
 				</copy>
 			</contrib:then>
 		</contrib:if>
-		<antcall target="test" />
 	</target>
 
 	<target name="build-exe-launcher"
@@ -571,7 +577,7 @@
 				<fileset dir="${lib.dir}/launch4j"
 					 includes="*.jar"/>
 			</classpath>
-		 </taskdef>
+		</taskdef>
 		<launch4j:create configFile="${classes.dir}/package-files/windows/jedit.launch4j.xml"
 				 outfile="${jar.location}/jedit.exe"/>
 	</target>
@@ -833,15 +839,13 @@
 				 includes="api/**/*.html"/>
 			<filterchain>
 				<tokenfilter>
-					<replacestring
-						from="<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">"
-						to="<TD BGCOLOR="#00008B" CLASS="NavBarCell1Rev">"/>
+					<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"/>
+					<replaceregex pattern="(<SCRIPT type="text/javascript">.*?</SCRIPT>|onload=".*?")"
+						      flags="gs"/>
 				</tokenfilter>
 			</filterchain>
 		</copy>
@@ -1265,9 +1269,9 @@
 		</exec>
 		<exec executable="ln"
 		      failonerror="true">
-			<arg value="-sF" />
-			<arg file="/Applications" />
-			<arg file="/Volumes/jEdit/ " />
+			<arg value="-sF"/>
+			<arg file="/Applications"/>
+			<arg file="/Volumes/jEdit/"/>
 		</exec>
 		<copy file="package-files/osx/DS_Store"
 		      tofile="/Volumes/jEdit/.DS_Store"
@@ -1636,7 +1640,7 @@
 					   properties/**
 					   startup/**
 					   ${jar.filename}"
-				excludes="jars/MacOSX.jar"/>
+				 excludes="jars/MacOSX.jar"/>
 		</mod:calculatesize>
 		<copy todir="${dist.dir}/classes/package-files/linux/deb"
 		      encoding="UTF-8"
@@ -1922,7 +1926,7 @@ Press Return key to continue...
 				fIn = new BufferedInputStream(new FileInputStream(new File (project.getProperty("dist.dir"), "Release")));
 				while ((ch = fIn.read()) >= 0)
 				{
-				    sGen.update((byte)ch);
+					sGen.update((byte)ch);
 				}
 				out = new BCPGOutputStream(new ArmoredOutputStream(new BufferedOutputStream(new FileOutputStream(new File (project.getProperty("dist.dir"), "Release.gpg")))));
 				sGen.generate().encode(out);
diff --git a/doc/CHANGES.txt b/doc/CHANGES.txt
index 1fb826b..e761109 100644
--- a/doc/CHANGES.txt
+++ b/doc/CHANGES.txt
@@ -1,213 +1,156 @@
-jEdit 5.2 version history
-       (changes since jEdit 5.1.0)
+jEdit 5.3 version history
+       (changes since jEdit 5.2.0)
 :encoding=UTF-8:
 
-{{{ Version 5.2.0
+{{{ Version 5.3.0
 
-Thanks to Björn "Vampire" Kautler, Makarius, Dale Anson, Alan Ezust,
-Matt Galligan, Eric Le Lay, Makarius, and Matthieu Casanova for contributing to
-this release.
+Thanks to Björn "Vampire" Kautler, Alan Ezust, Makarius, Jakub Holý,
+Mark Corbin, Matt Galligan, Kevin Hunter Kesling, Darien Brown,
+Matthieu Casanova, Sergey Mashkov, Dale Anson, Kevin Leblanc,
+Marcelo Vanzin, Jordan Miner, yaraba, Marc M. Adkins, and Eric Le Lay for
+contributing to this release.
 
 {{{ Bug Fixes
 
-- EnhancedDialog does not throw NullPointerExceptions anymore when checking
-  whether a pressed key is the buffer close shortcut. (Björn "Vampire" Kautler)
+- JEditBuffer.isFoldEnd() was unable to detect the fold end when it was the
+  last line (#3917 - Matthieu Casanova)
 
-- When using extra vertical line spacing and a selection foreground color, the
-  selected text was painted twice, once with the extra spacing, once without.
-  Now the selected text is drawn correctly. (Björn "Vampire" Kautler)
+- More accurate wrap margin calculation (Patch#555 - Makarius)
 
-- Make the TextArea a JPanel instead of a JComponent, so that it draws its
-  background and set the background color to the Gutter background color. This
-  prevents the parent component to shine through, which would e. g. show blue
-  edges with the BufferTabs plugin installed and active.
-  (Björn "Vampire" Kautler)
+- Fix AWT thread-safety issue in VFSManager.error(). (Marcelo Vanzin)
 
-- Fix a bug preventing from removing an unloaded plugin
-  (#3877 - Matthieu Casanova)
+- Order of unsorted buffers now preserved in View.getBuffers()
+  (Patch # 548 - Kevin Leblanc)
 
-- The native splashscreen is removed as it was not possible to disable it
-  (#3876 - Matthieu Casanova)
+- Support for negative line spacing (Patch #535 - Makarius)
 
-- Bugfix in EditPane.java related to file status checks.
-  (Patch #534 - Matt Galligan)
+- Fix bug #3671: autodetect text file encoding in HelpViewer
+  (patch #540 - Eric Le Lay)
 
-- Fix for bug #3389 in BufferSwitcher.java where look and feel was locked to
-  Metal. (Dale Anson)
+- Fix bug #3881, non-capturing lookahead in regex search didn't work.
+  (Dale Anson)
 
-- Fix for bug #3893 where PluginResURLConnection.openStream returning null for
-  non existing resources made jEdit hang on Java 8, Mac OS 10.10. (Eric Le Lay)
+- Fix bug #3184: File browser completion dives into wrong directory
+  (Eric Le Lay)
 
-- Fix for Bugs #3895, #3897: Invalid HelpIndex URLs on windows.
-  (Alan Ezust,  Eric Le Lay)
+- Fix bug #2833 Plugin jars dependencies not removed (Eric Le Lay)
 
-}}}
-{{{ Miscellaneous
-- MiscUtilities.openInDesktop() works with URIs on Windows now. (Alan Ezust)
-
-- Upgrade Launch4J to the latest version 3.5.0. This makes it possible to UTF-8
-  encode the config file and build the EXE launcher on Mac OS again, removing
-  the need for Rosetta being installed, which is not supported anymore anyway
-  since Mac OS 10.7. (Björn "Vampire" Kautler)
+- Fix bug #3911, text area was scrolling to the left when saving. (Dale Anson)
 
-}}}
-{{{ API Changes
+- Fix bug #3599 Key typing in Install panel. Search Field gets focus on show
+  and when one types '/' or a letter in the list. (Eric Le Lay)
 
-- DockableWindowContainer interface is now public (Patch #528 - Makarius)
-
-- PluginResURLConnection.openStream() is garanteed to return non-null stream;
-  PluginResURLConnection.connect() and PluginResURLConnection.openStream()
-  throw an IOException when the resource is not found. (Eric Le Lay)
+- Fix bug #2877 "Hide installed" checkbox in Install panel. Don't re-install
+  unloaded plugins (Eric Le Lay)
 
 }}}
-{{{ Editing
+{{{ UI Improvements
 
+- Handling of NUMPAD keys cleanup (Patch #567 - Makarius)
 
-}}}
+- Scalable GUI for tip-of-the-day (Makarius)
 
-}}}
+- Scalable ColorWell icon according to UI font (Makarius)
 
-{{{ Version 5.2pre1
+- Proper L&F font for syntax style table (Patch #558 - Makarius)
 
-Thanks to Björn "Vampire" Kautler, Matthieu Casanova, Dale Anson, Thomas Meyer,
-Patrick Eibl, László Schmidt, Zsombor Franczia, Bence Pintér, Makarius,
-Benjamin Zengin, Yihua Zhang, Marc Häfner, EdorFaus, Jordan Miner,
-Thiemo Kellner, Tim Blackler, Alan Ezust, and Eric Le Lay for contributing to
-this release.
+- Proper row height default for JTable, JTree with 4K displays
+  (Patches #557, #559, #562, #563 - Makarius)
 
-{{{ Bug Fixes
-
-- Fix for bug #3843: Russian localization breaks Search dialog
-
-- Fixed Whole word search (bug #3824, patch #516 - Benjamin Zengin)
-
-- Fixed the systray not added on EDT thread (Matthieu Casanova)
+- More font size choices for 4K and higher-res displays (Patch# 549 - Makarius)
 
-- Fix the integration with Unity and other Linux Desktop Environments,
-  broken by patch #464 (Björn "Vampire" Kautler)
+- EOL marker character is a localizable property (view.eolMarkerChar),
+  and an arrow (↩) instead of period (.) (#3902 - Alan Ezust)
 
-- Reload optionally dependent plugins when a plugin is unloaded.
-  (bug #3807 - Dale Anson)
+- Proper button margins for Nimbus L&F (Patch #538 - Makarius)
 
-- Applied patch #513 (Makarius), plus some additional cleanup of setting
-  the look and feel (Dale Anson)
+- Floating dockables as JDialog (Patch #537 - Makarius)
 
-- Fixed a bug in pluginmanager: transitive deps not installed when filtering
-  (bug #3825 - Eric Le Lay)
+- CompletionPopup should accept TAB for completion selection
+  (Patch # 525 - Jakub Holý)
 
-- Fix java installer bug: Installing from jedit5.1.0install.jar failure
-  (bug #3837 - Eric Le Lay)
-
-- HelpIndex includes .txt files again. (Bug #3896 - Alan Ezust)
-
-}}}
-{{{ API Changes
+- Separated sorting of Buffer Sets and Buffer Switcher (Dale Anson)
 
-- jEdit now depends on Java 1.7
+- Font properties were not applied after change in Appearances settings
+  (Bug #3919 - Dale Anson)
 
-- StandardUtilities.objectsEqual() is deprecated as Objects.equals() does the
-  same job in Java 7 (Matthieu Casanova)
+- Allow columns to be rearranged in FSB (Feature request 489, 40, and old
+  tracker 1442812 - Dale Anson)
 
-- New method: VFSFile.getModified() which allows sorting by date in the FSB
-  for other VFSs (plugin patch #161 Yihua Zhang)
+- Align gutter numbers with lines when using additional vertical line spacing.
+  (Bug #3717 - Dale Anson)
 
-- GUIUtilities.getShortcutLabel() has a second boolean argument to specify
-  whether platform modifier symbols are desired or not. (patch #514 Makarius)
+- Added option to hide open files from recent file list (FR #481 - Dale Anson)
 
-- Removed deprecated (ambiguous) overloads of IOUtilities.closeQuietly().
+- UI adjustment to allow adding new mode files by point and click.
+  (FR # 471 - Dale Anson)
 
-- View.getBuffers() returns an array that is now sorted according to View
-  option. (Alan Ezust)
+- No error message when PluginManager doesn't find a file to be removed and
+  show files to be removed in alphabetical order (end of Bug #3530 - Eric
+  Le Lay)
 
-- New status "REMOVED" added to PluginUpdate message. (Dale Anson)
+- Plugin Manager Manage Panel sortable on all columns and all directions
+  (Eric Le Lay)
 
 }}}
-{{{ UI improvements
-
-- Relative line offsets are allowed in "Goto Line" dialog. (Patch #526,
-  Feature Request #286, Tim Blackler)
-
-- OptionsDialog now remembers and restores the last selected pane
-  under more circumstances. See Project Options Dialog for example.
-  (Alan Ezust)
-
-- KP_ARROW keys now behave the same way as the regular arrow keys,
-  with modifiers, on all platforms. (startup/startup.bsh:100 - Alan Ezust)
-
-- Focus the text area when scroll bar is clicked (patch #521 - Jordan Miner)
-
-- Selecting line from gutter should move caret (patch #520 - Jordan Miner)
-
-- Fix for the scroll click suppression (patch #505 - EdorFaus)
-
-- Important speedup of LogViewer (Matthieu Casanova)
-
-- Support for shortcuts to "copy" the error in Error widget (Matthieu Casanova)
-
-- The bufferSwitcher now supports Drag&Drop (patch #515 - Yihua Zhang)
-
-- Added "loading" icon for task status bar widget (request #474 -
-  Matthieu Casanova)
+{{{ Miscellaneous
 
-- The TextArea will not scroll anymore when dragging files on jEdit
-  (Matthieu Casanova)
+- New Korean translation file (Patch #551 - yaraba)
 
-- EnhancedDialog instances (Search/Replace, Options, Open) now can be closed
-  using a single-key close-buffer.shortcut. (patch #497, request #454 -
-  László Schmidt, Zsombor Franczia, Bence Pintér)
+- Resize performance improvement (Patch #547 - Sergey Mashkov)
 
-- Plugin dependencies are shown in the plugin manager details pane for all three
-  tabs. (request #469 - Dale Anson)
+- Properties are sorted when saved (Feature Request #342, Patch #536 - Makarius)
 
-- Increased the scrolling speed in option pane (Matthieu Casanova)
+- Configure the JUnit task to fork off the Ant process, with manually adding the
+  needed Ant libraries. This ensures that there are no unwanted classpath
+  entries during test execution (Plugin Bug #1732 - Björn "Vampire" Kautler)
 
-- In plugin manager's install panel plugin dependencies are unchecked
-  if they are not required (Eric Le Lay)
+}}}
+{{{ API Changes
 
-- Use a native splash screen if available (patch #519 - Eric Le Lay)
+- View now sends ViewUpdate message on EditBus when full screen mode is toggled.
+  This is useful to plugins that may need to adjust their appearance when the
+  screen mode is toggled. (Dale Anson)
 
-- Improved layout manager for text area (patch #518 - Dale Anson)
+- close-all sends BufferClosing events on EditBus for each buffer closed.
+  This is useful to plugins that record closed files. (patch #550, Eric Le Lay)
 
-- "Copy link to clipboard" popup menu in HelpViewer (Eric Le Lay)
+- org.gjt.sp.util.StandardUtilities#compareStrings accepts null Strings
+  (Eric Le Lay)
 
 }}}
 {{{ Editing
 
-- Patch to toggle word completion of words with digits.
-  (patch #503, Patrick Eibl)
+- Updates to Clojure mode (Marc M. Adkins, patch #565)
 
-- New PowerCenter Parameter File format (Patch # 524, Thiemo Kellner)
+- More conventional color scheme for diffs and changesets
+  (Patch #560 - Makarius)
 
-- Several fixes for html mode: (Dale Anson/Marc Häfner)
-  patch #504 HTML mode: Fix mode properties in <script> blocks.
-  bug #3850 Html edit mode
-  bug #3842 HTML syntax highlighting error: & in href
-  bug #3839 Syntax highlight is wrong for some HTML file
+- Updates to Scala Mode (Patch #554 - Makarius)
 
-}}}
-{{{ Miscellaneous
+- New mode for rust (Patches #553, #556 - Jordan Miner)
+
+- New mode for Kotlin syntax (Patch #552 - Sergey Mashkov)
+
+- Updates to cfscript mode (Patch #531 - Darien Brown)
 
-- MiscUtilities.expandVariables() converts from Windows to Linux-style paths
-  when necessary (the reverse was already true). (Alan Ezust)
+- New mode for ANS Forth 1994 (Patch #530 - Mark Corbin)
 
-- New macros: Go To Offset, Reverse Selection (patch #501, #502 Thomas Meyer)
+- New mode for mustache templates (Patch #532 - Kevin Hunter Kesling)
 
-- Removed some no longer needed pre-Java7 MacOSX key handling workaround code
-  (patch #511, #512, Makarius, Alan Ezust)
+- New mode for Antlr 4 (Dale Anson)
 
-- Make the OS X application bundle work with Oracle Java 7
-  (bug #3743, #3841, #3862 - Björn "Vampire" Kautler)
+- Updates to properties mode (Bug #2640 - Dale Anson)
 
-- Add copyright tag to the OS X application bundle (Björn "Vampire" Kautler)
+- Updated Go mode (Feature request 496, ahlearn). This also fixes bug #3921.
 
-- Add UTI to the document type in the OS X application bundle
-  (Björn "Vampire" Kautler)
+- Allow editing, but not saving, of read only files.
+  (Feature request #422 - Dale Anson)
 
-- Bundle version 1.3 of the MacOSX plugin (Björn "Vampire" Kautler)
+- Added Markdown mode from Peter Lynch (FR 495 - Dale Anson)
 
-- Customize the look of the DMG root folder to provide a simple yet convenient
-  installation GUI for OS X users and to tell them how to work-around Gatekeeper
-  blocking jEdit (bug #3821, #3757 - Björn "Vampire" Kautler)
+- Better mode selection for files that match multiple modes, also fixes/applies 
+  patch #571. (Dale Anson)
 
 }}}
 
diff --git a/doc/FAQ/faq-install.xml b/doc/FAQ/faq-install.xml
index 6a16a86..ce4ed50 100644
--- a/doc/FAQ/faq-install.xml
+++ b/doc/FAQ/faq-install.xml
@@ -1,260 +1,262 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <section id="installation">
-    <title>Installation Questions</title>
-    <!-- jEdit buffer-local properties:                      -->
-    <!-- :indentSize=2:noTabs=false:maxLineLen=90:tabSize=2: -->
-    <!-- :xml.root=faq.xml:                                  -->
-    <!-- jEdit FAQ                                           -->
-
-    <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.7. 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 version 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. </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>
+		<title>Installation Questions</title>
+		<!-- jEdit buffer-local properties:                      -->
+		<!-- :indentSize=2:noTabs=false:maxLineLen=90:tabSize=2: -->
+		<!-- :xml.root=faq.xml:                                  -->
+		<!-- jEdit FAQ                                           -->
+
+		<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.7. 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>
+										<para> Or, install the Updater plugin, which can download and
+										install point releases or daily builds. </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 version 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. </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.7 of the Java platform, and therefore may
+										not be compatible with 3rd party virtual machines.</para>
+								</answer>
+						</qandaentry>
+				</qandadiv>
+		</qandaset>
 </section>
diff --git a/doc/FAQ/faq-use.xml b/doc/FAQ/faq-use.xml
index f5fc1b7..fd6e93b 100644
--- a/doc/FAQ/faq-use.xml
+++ b/doc/FAQ/faq-use.xml
@@ -1,588 +1,581 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <section id="usage">
-    <title>Usage Questions</title>
-
-    <!-- jEdit buffer-local properties:                      -->
-    <!-- :indentSize=2:noTabs=false:tabSize=2: -->
-    <!-- :xml.root=faq.xml:                                  -->
-    <!-- jEdit FAQ                                           -->
-
-    <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<guimenuitem>Global Options</guimenuitem>,
-                    <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 <guimenuitem>Global Options</guimenuitem>, 
-                    then under <guimenuitem>Saving & Backup</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> 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
-                    <ulink url="../users-guide/global-opts.html#encodings-pane">
-                    <guimenuitem>Encoding</guimenuitem></ulink> pane of the
-                    Global Options; if you do not, jEdit uses
-                    
-                    <emphasis role="bold">encoding autodetectors</emphasis> to decide which encoding
-                    to open a file in. 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>
+		<title>Usage Questions</title>
+
+		<!-- jEdit buffer-local properties:                      -->
+		<!-- :indentSize=2:noTabs=false:tabSize=2:maxLineLen=90: -->
+		<!-- :xml.root=faq.xml:                                  -->
+		<!-- jEdit FAQ                                           -->
+
+		<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<guimenuitem>Global Options</guimenuitem>,
+										<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 <guimenuitem>Global Options</guimenuitem>,
+										then under <guimenuitem>Saving & Backup</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> 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
+										<ulink url="../users-guide/global-opts.html#encodings-pane">
+										<guimenuitem>Encoding</guimenuitem></ulink> pane of the
+										Global Options; if you do not, jEdit uses
+
+										<emphasis role="bold">encoding autodetectors</emphasis> to decide
+										which encoding to open a file in. 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="toggle-auto-indent">
-                    <para>How do I toggle jEdit's auto-indent behavior? </para>
-                </question>
-                <answer>
-                   <para> By default, the <literal>Return</literal> key is bound to
-                   the <guimenuitem>Insert Newline and Indent</guimenuitem> action.
-                   If you bind it to <guimenuitem>Insert Newline</guimenuitem> from
-                   <guimenuitem>Global Options - Shortcuts</guimenuitem>, that will
-                   disable the auto-indent behavior. There is no way to "toggle"
-                   this feature. </para>
-                </answer>
-            </qandaentry>
-            <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>Select <guimenuitem>Global Options</guimenuitem>, 
-                    <guimenuitem>Gutter</guimenuitem> option pane, and check 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 built-in Abbreviations feature (<guimenu>Global Options</guimenu> <guimenuitem>Abbreviations</guimenuitem>) as well as 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-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,
-                    <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>File</guimenu>><guisubmenu>Reload with Encoding
-                    </guisubmenu> action.</para>
-
-                    <para>With respect to menu labels, message strings and other
-                    GUI elements, the jEdit project team now supports localization files for different languages.
-                    How well they are maintained is up to the individual members of the community who help to maintain them. </para>
-                </answer>
-            </qandaentry>
-        </qandadiv>
-
-        <!--********************************************************* Source -->
-
-        <qandadiv id="source-compile">
-            <title>Compiling source code</title>
+								<question id="toggle-auto-indent">
+										<para>How do I toggle jEdit's auto-indent behavior? </para>
+								</question>
+								<answer>
+									 <para> By default, the <literal>Return</literal> key is bound to
+									 the <guimenuitem>Insert Newline and Indent</guimenuitem> action.
+									 If you bind it to <guimenuitem>Insert Newline</guimenuitem> from
+									 <guimenuitem>Global Options - Shortcuts</guimenuitem>, that will
+									 disable the auto-indent behavior. There is no way to "toggle"
+									 this feature. </para>
+								</answer>
+						</qandaentry>
+						<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>Select <guimenuitem>Global Options</guimenuitem>,
+										<guimenuitem>Gutter</guimenuitem> option pane, and check 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 built-in Abbreviations feature (<guimenu>Global Options</guimenu> <guimenuitem>Abbreviations</guimenuitem>) as well as 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-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,
+										<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>File</guimenu>><guisubmenu>Reload with Encoding
+										</guisubmenu> action.</para>
+
+										<para>With respect to menu labels, message strings and other
+										GUI elements, the jEdit project team now supports localization files for different languages.
+										How well they are maintained is up to the individual members of the community who help to maintain them. </para>
+								</answer>
+						</qandaentry>
+				</qandadiv>
+
+				<!--********************************************************* Source -->
+
+				<qandadiv id="source-compile">
+						<title>Compiling source code</title>
 
 			<qandaentry>
-                <question id="jedit-compile">
-                    <para>How do you set the classpath for compiling Java files in jEdit?</para>
-                </question>
-                <answer>
-                    <para>The classpath can be set from ProjectViewer's project properties
-                    on a per-project basis. The ClassPath plugin provides this option pane
-                    to ProjectViewer. JavaSideKick uses it for completion, and other Java
-                    plugins should also. At the time of writing, the JCompiler plugin needs
-                    to be updated to use it, for example.
-                    </para>
-                </answer>
-            </qandaentry>
-
-            <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. When JCompiler is updated,
-                    you can use that again. Many Java projects
-                    can be built with Apache Ant, and that is how we build jEdit.
-                    You can use the <quote>Ant</quote> commandos from the
-                    <application>Console</application> plugin to run ant from jEdit,
-                    and parse the error messages for ErrorList. Also, the
-                    <application>Antelope</application> or
-                    <application>AntFarm</application> plugins provide a more
-                    Eclipse-like GUI front-end for Apache Ant.
-                    Apache Ant uses 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>
-
-            <qandaentry>
-                <question id="settings-emacsctrle">
-                    <para>How do I get Emacs-like key bindings out of the box? </para>
-                </question>
-
-                <answer>
-                    <para>As of jEdit 5.1, it is much easier than before:  <guimenuitem> Global Options - Shortcuts - Choose Keymap: Emacs</guimenuitem>. Customize it by setting your own shortcuts to make it more like your flavor of Emacs. Emacs macros are contributed by Brian Clapper. 
-                    </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 the <guimenuitem>Global Options</guimenuitem>, 
+								<question id="jedit-compile">
+										<para>How do you set the classpath for compiling Java files in jEdit?</para>
+								</question>
+								<answer>
+
+									<para>The classpath can be set from ProjectViewer's project properties
+									on a per-project basis. The <ulink
+									url="/Classpath.jar!/index.html">ClassPath plugin</ulink> provides this
+									option pane to ProjectViewer. JavaSideKick uses it for completion, and
+									other Java plugins should also. </para>
+
+								</answer>
+						</qandaentry>
+
+						<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. When JCompiler is updated,
+										you can use that again. Many Java projects
+										can be built with Apache Ant, and that is how we build jEdit.
+										You can use the <quote>Ant</quote> commandos from the
+										<application>Console</application> plugin to run ant from jEdit,
+										and parse the error messages for ErrorList. Also, the
+										<application>Antelope</application> or
+										<application>AntFarm</application> plugins provide a more
+										Eclipse-like GUI front-end for Apache Ant.
+										Apache Ant uses 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>
+
+						<qandaentry>
+								<question id="settings-emacsctrle">
+										<para>How do I get Emacs-like key bindings out of the box? </para>
+								</question>
+
+								<answer>
+										<para>As of jEdit 5.1, it is much easier than before:  <guimenuitem> Global Options - Shortcuts - Choose Keymap: Emacs</guimenuitem>. Customize it by setting your own shortcuts to make it more like your flavor of Emacs. Emacs macros are contributed by Brian Clapper.
+										</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 the <guimenuitem>Global Options</guimenuitem>,
 		<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="antialiased-text-everywhere">
-                    <para>How can I get antialiased text everywhere, even dockables and menus? </para>
-                </question>
-                <answer>
-                   <para>
-                   See the <ulink url="../users-guide/jvm-options.html">page on JVM options</ulink> in the users guide.  
-                   </para>
-                   
-                   <para> On Mac OS X, the jEdit.app bundle already provides certain antialiasing properties in
-                   <literal>Contents/Info.plist</literal> to enable that by default.</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>
+								</answer>
+						</qandaentry>
+						<qandaentry>
+								<question id="antialiased-text-everywhere">
+										<para>How can I get antialiased text everywhere, even dockables and menus? </para>
+								</question>
+								<answer>
+									<para>
+										See the <ulink url="../users-guide/jvm-options.html">page on JVM options</ulink> in the users guide.
+									</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>
 </section>
diff --git a/doc/FAQ/faq.xml b/doc/FAQ/faq.xml
index 07bc53a..add42e0 100644
--- a/doc/FAQ/faq.xml
+++ b/doc/FAQ/faq.xml
@@ -86,9 +86,9 @@
 
             <revision>
                 <revnumber>1.4</revnumber>
-                <date>2006,2014</date>
+                <date>2006,2015</date>
                 <author> <firstname>Alan </firstname> <surname>Ezust </surname></author>
-                <revremark>Updates for jEdit 4.3-5.2 releases</revremark>
+                <revremark>Updates for jEdit 4.3-5.3 releases</revremark>
             </revision>
         </revhistory>
 
diff --git a/doc/releasing-jedit.txt b/doc/releasing-jedit.txt
index f4415c3..9cdaa4d 100644
--- a/doc/releasing-jedit.txt
+++ b/doc/releasing-jedit.txt
@@ -15,17 +15,17 @@ Workflow
 
 1. Execute the BeanShell snippet at the end of this file ("Utilities -> BeanShell -> Evaluate Selection"). This will replace the version tags in this document by actual version numbers for easy copy & paste.
 
-2. Review https://svn.code.sf.net/p/jedit/svn/jEdit/branches/5.2.x/doc/CHANGES.txt for formatting errors (like missing newline characters, wrong indentation or empty blocks), fix them and check them in.
+2. Review https://svn.code.sf.net/p/jedit/svn/jEdit[ifbranch]/branches[/ifbranch]/[branch]/doc/CHANGES.txt for formatting errors (like missing newline characters, wrong indentation or empty blocks), fix them and check them in.
 
 3. Tag the sourcecode for release in the SVN repository by doing
-        svn copy https://svn.code.sf.net/p/jedit/svn/jEdit/branches/5.2.x https://svn.code.sf.net/p/jedit/svn/jEdit/tags/jedit-5-2-0 -m "Tagging 5.2.0 for release."
+        svn copy https://svn.code.sf.net/p/jedit/svn/jEdit[ifbranch]/branches[/ifbranch]/[branch] https://svn.code.sf.net/p/jedit/svn/jEdit/tags/[tag] -m "Tagging [version] for release."
    with the correct version in the second URL and in the commit message
 
 4. To be sure to work with the exact tagged source, check out the newly tagged source in a new directory by doing
-        svn checkout https://svn.code.sf.net/p/jedit/svn/jEdit/tags/jedit-5-2-0
-   no matter where. You will find the source in a subfolder jedit-5-2-0 where you executed the command
+        svn checkout https://svn.code.sf.net/p/jedit/svn/jEdit/tags/[tag]
+   no matter where. You will find the source in a subfolder [tag] where you executed the command
 
-5. Copy build.properties from your jEdit source directory to the newly created jedit-5-2-0 source directory if needed. If you don't have it, then create it if needed. You find a template called build.properties.sample in the root directory.
+5. Copy build.properties from your jEdit source directory to the newly created [tag] source directory if needed. If you don't have it, then create it if needed. You find a template called build.properties.sample in the root directory.
    To give an example, in build.properties I customized the following properties:
     - wine.executable=wine
     - winepath.executable=winepath
@@ -37,89 +37,89 @@ Workflow
 
 6.1. Build the distribution files by doing
           ant dist
-     in the jedit-5-2-0 directory
-     In the newly created directory jedit-5-2-0/dist you find 13 files:
-      - jedit5.2.0manual-a4.pdf
-      - jedit5.2.0manual-letter.pdf
-      - jedit5.2.0source.tar.bz2
-      - jedit5.2.0install.jar
-      - jedit-5.2.0-noarch-1sao.tgz
-      - jedit_5.2.0_all.deb
-      - jedit5.2.0install.exe or jedit5.2.0-dist-win-finish.tar.bz2
-      - jedit5.2.0install.dmg or jedit5.2.0-dist-mac-finish.tar.bz2
-      - Packages
+     in the [tag] directory
+     In the newly created directory [tag]/dist you find [ifdevel]8[/ifdevel][iffinal]13[/iffinal] files:
+      - jedit[version]manual-a4.pdf
+      - jedit[version]manual-letter.pdf
+      - jedit[version]source.tar.bz2
+      - jedit[version]install.jar
+      - jedit-[version]-noarch-1sao.tgz
+      - jedit_[version]_all.deb
+      - jedit[version]install.exe or jedit[version]-dist-win-finish.tar.bz2
+      - jedit[version]install.dmg or jedit[version]-dist-mac-finish.tar.bz2
+[iffinal]      - Packages
       - Packages.gz
       - Packages.bz2
       - Release
       - Release.gpg
-
-6.2. If you have jedit5.2.0-dist-win-finish.tar.bz2 in your jedit-5-2-0/dist folder you probably don't run a Windows box and don't have wine installed and set up, so please hand over this file to someone (e. g. <Björn "Vampire" Kautler> Vampire at jEdit.org) who does and ask him to unpack the file and run
+[/iffinal]
+6.2. If you have jedit[version]-dist-win-finish.tar.bz2 in your [tag]/dist folder you probably don't run a Windows box and don't have wine installed and set up, so please hand over this file to someone (e. g. <Björn "Vampire" Kautler> Vampire at jEdit.org) who does and ask him to unpack the file and run
           ant dist-win-finish
-     and to hand over the resulting file jedit5.2.0install.exe to you. The requirements for this are described in README.SRC.txt
+     and to hand over the resulting file jedit[version]install.exe to you. The requirements for this are described in README.SRC.txt
 
-6.3. If you have jedit5.2.0-dist-mac-finish.tar.bz2 in your jedit-5-2-0/dist folder you probably don't run a Mac OS X box, so please hand over this file to someone (e. g. Björn "Vampire" Kautler <Vampire at jEdit.org>) who does and ask him to unpack the file and run
+6.3. If you have jedit[version]-dist-mac-finish.tar.bz2 in your [tag]/dist folder you probably don't run a Mac OS X box, so please hand over this file to someone (e. g. Björn "Vampire" Kautler <Vampire at jEdit.org>) who does and ask him to unpack the file and run
           ant dist-mac-finish
-     and to hand over the resulting file jedit5.2.0install.dmg to you. The requirements for this are described in README.SRC.txt
-
-6.4. After you received the final distribution files jedit5.2.0install.exe and jedit5.2.0install.dmg you can delete jedit5.2.0-dist-win-finish.tar.bz2 and jedit5.2.0-dist-mac-finish.tar.bz2
+     and to hand over the resulting file jedit[version]install.dmg to you. The requirements for this are described in README.SRC.txt
 
+6.4. After you received the final distribution files jedit[version]install.exe and jedit[version]install.dmg you can delete jedit[version]-dist-win-finish.tar.bz2 and jedit[version]-dist-mac-finish.tar.bz2
+[iffinal]
 6.5. If you don't have Release.gpg, you didn't have setup a GPG secring. Either create a GPG secring, run
           ant dist-sign-deb-Release
      , upload the public key to a public keyserver and make sure your key is mentioned on http://jedit.org/index.php?page=download&platform=unix#option_two so the users know the key is valid for signing jEdit releases. Alternatively send Release to someone whose key is already mentioned on the download page (e. g. Björn "Vampire" Kautler <Vampire at jEdit.org>) and ask him to put Release in the dist folder, to run
           ant dist-sign-deb-Release
      and to hand over the resulting file Release.gpg to you. The second way is preferable if you only create a release once or from time to time as a new key means the user will get confused and has to react for verifying and installing the new key.
-
+[/iffinal]
 7. - Connect to the SourceForge servers via one of the methods described in https://sourceforge.net/apps/trac/sourceforge/wiki/Release%20files%20for%20download
-   - Add the sub-folder "5.2.0" under "/home/frs/project/j/je/jedit/jedit"
-   - Upload the 8 final distribution files starting with "jedit" to the newly created folder on the SourceForge servers
-   - Upload the 5 remaining distribution files not starting with "jedit" to the folder "/home/frs/project/j/je/jedit" on the SourceForge servers.
-
-8. - Go to https://sourceforge.net/projects/jedit/files/jedit/5.2.0/
+   - Add the sub-folder "[version]" under "/home/frs/project/j/je/jedit/jedit[ifdevel]-devel[/ifdevel]"
+   - Upload the 8 final distribution files [iffinal]starting with "jedit" [/iffinal]to the newly created folder on the SourceForge servers
+[iffinal]   - Upload the 5 remaining distribution files not starting with "jedit" to the folder "/home/frs/project/j/je/jedit" on the SourceForge servers.
+[/iffinal]
+8. - Go to https://sourceforge.net/projects/jedit/files/jedit[ifdevel]-devel[/ifdevel]/[version]/
    - Make the following settings for each file after clicking on the respective "i" icon
-        - jedit_5.2.0_all.deb
+        - jedit_[version]_all.deb
             - Download Button: Debian Installer
             - Default Download For: <none>
-        - jedit5.2.0source.tar.bz2
+        - jedit[version]source.tar.bz2
             - Download Button: Source Package
             - Default Download For: <none>
-        - jedit5.2.0install.jar
+        - jedit[version]install.jar
             - Download Button: Java based Installer
-            - Default Download For: linux, bsd, solaris, others
-        - jedit5.2.0manual-letter.pdf
+            - Default Download For: [ifdevel]<none>[/ifdevel][iffinal]linux, bsd, solaris, others[/iffinal]
+        - jedit[version]manual-letter.pdf
             - Download Button: Manual in Letter Paper size
             - Default Download For: <none>
-        - jedit5.2.0manual-a4.pdf
+        - jedit[version]manual-a4.pdf
             - Download Button: Manual in A4 Paper size
             - Default Download For: <none>
-        - jedit5.2.0install.dmg
+        - jedit[version]install.dmg
             - Download Button: Mac OS X Installer
-            - Default Download For: mac
-        - jedit5.2.0install.exe
+            - Default Download For: [ifdevel]<none>[/ifdevel][iffinal]mac[/iffinal]
+        - jedit[version]install.exe
             - Download Button: Windows Installer
-            - Default Download For: windows
-        - jedit-5.2.0-noarch-1sao.tgz
+            - Default Download For: [ifdevel]<none>[/ifdevel][iffinal]windows[/iffinal]
+        - jedit-[version]-noarch-1sao.tgz
             - Download Button: Slackware Installer
             - Default Download For: <none>
 
 9. Update the website in the following places and also update this state in SVN:
-    - Open sftp://elberry,jedit@web.sourceforge.net/home/project-web/jedit/htdocs/download.html e. g. in jEdit with installed FTP plugin and update the website for the new release, means the filenames, filesizes and amount of pages in the User's Guides
-    - Open sftp://elberry,jedit@web.sourceforge.net/home/project-web/jedit/htdocs/jEdit-version.txt e. g. in jEdit with installed FTP plugin and update the versions in the file, which is needed by the LatestVersion Plugin
-    - Open sftp://elberry,jedit@web.sourceforge.net/home/project-web/jedit/htdocs/CHANGES52.txt e. g. in jEdit with installed FTP plugin and copy the contents of jedit-5-2-0/doc/CHANGES.txt to this file
-    - Open sftp://elberry,jedit@web.sourceforge.net/home/project-web/jedit/htdocs/index.php e. g. in jEdit with installed FTP plugin and update the version number and the Last Site Update date
-    - Open sftp://elberry,jedit@web.sourceforge.net/home/project-web/jedit/htdocs/devel.html e. g. in jEdit with installed FTP plugin and add a line for 5.2.0 in the Release Schedule
+    - Open sftp://[sourceForgeUsername],jedit at web.sourceforge.net/home/project-web/jedit/htdocs/download.html e. g. in jEdit with installed FTP plugin and update the website for the new release, means the filenames, filesizes and amount of pages in the User's Guides
+    - Open sftp://[sourceForgeUsername],jedit at web.sourceforge.net/home/project-web/jedit/htdocs/jEdit-version.txt e. g. in jEdit with installed FTP plugin and update the versions in the file, which is needed by the LatestVersion Plugin
+    - Open sftp://[sourceForgeUsername],jedit at web.sourceforge.net/home/project-web/jedit/htdocs/CHANGES[major][minor].txt e. g. in jEdit with installed FTP plugin and copy the contents of [tag]/doc/CHANGES.txt to this file
+    - Open sftp://[sourceForgeUsername],jedit at web.sourceforge.net/home/project-web/jedit/htdocs/index.php e. g. in jEdit with installed FTP plugin and update the version number and the Last Site Update date
+    - Open sftp://[sourceForgeUsername],jedit at web.sourceforge.net/home/project-web/jedit/htdocs/devel.html e. g. in jEdit with installed FTP plugin and add a line for [version] in the Release Schedule
 
 10. Update the plugin wizard
      - Go to http://plugins.jedit.org/wiz/release_list.php?package_id=24
      - Find or create the entry for this jEdit Release
-          The entry may already exist but have an invalid date 
-          if a plugin was released that depends on it. 
-     - Switch "Head of Branch" to "main"
+          The entry may already exist but have an invalid date
+          if a plugin was released that depends on it.
+     - Switch "Head of Branch" to "[ifdevel]devel[/ifdevel][iffinal]main[/iffinal]"
      - Check the "Remove" checkbox for the jEdit dependency
      - Switch the "Low Version" of the JDK dependency to "1.7 [jdk-1.7]"
      - Click "Update Dependencies"
      - Click "Create Release"
 
-11. Send an announcement eMail to the jEdit-announce list. The announcement should contain some announcing text and in the end the contents of jedit-5-2-0/doc/CHANGES.txt for this release.
+11. Send an announcement eMail to the jEdit-announce list. The announcement should contain some announcing text and in the end the contents of [tag]/doc/CHANGES.txt for this release.
     You have to be set up to be able to post to jEdit-announce list.
     The mail should automatically get forwarded to the jedit-users list, but for that you have to be subscribed to that list too.
 
@@ -133,12 +133,12 @@ Workflow
      - Send a mail to the Community Growth Hacker of SourceForge for promotion of the release, currently this is Rich Bowen <communityteam at sourceforge.net>
      - Send a mail to Heise for inclusion in the weekly Heise Developer Snapshots at developer at ix.de
 
-14. Delete the jedit-5-2-0 folder
+14. Delete the [tag] folder
 
 15. Update the version number on the release branch
      - Add the following section to doc/CHANGES.txt
 
-{{{ Version 5.2.1
+{{{ Version [nextVersion]
 
 Thanks to  for contributing to this release.
 
@@ -161,23 +161,101 @@ Thanks to  for contributing to this release.
 
 }}}
      - Update the build number in org/gjt/sp/jedit/jEdit.java getBuild() method to
-            return "05.02.99.01";
+            return "[nextBuild]";
      - Submit your changes by doing
-            svn commit -m "Update the version number to 5.2.1"
+            svn commit -m "Update the version number to [nextVersion]"
        in the root source directory
-
+[ifbranch]
 16. If the release is from the latest release branch, clean up doc/CHANGES.txt on trunk.
      - Update the version number which is the base of CHANGES.txt.
-            "changes since jEdit 5.2.0"
-     - Remove all entries which have been released in 5.2.0.
-       The entries to be removed are tagged with "[merged into 5.2.x]".
+            "changes since jEdit [version]"
+     - Remove all entries which have been released in [version].
+       The entries to be removed are tagged with "[merged into [branch]]".
      - Submit your changes by doing
-            svn commit -m "Update the base version of CHANGES.txt to 5.2.0" doc/CHANGES.txt
+            svn commit -m "Update the base version of CHANGES.txt to [version]" doc/CHANGES.txt
        in trunk.
-
+[/ifbranch]
 ====================================================================================================
-Variables replaced
-
+import java.util.regex.Pattern;
+file = new File(new File(buffer.getPath()).getParentFile(), "../org/gjt/sp/jedit/jEdit.java");
+fileChars = new char[file.length()];
+reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
+reader.read(fileChars, 0, fileChars.length);
+reader.close();
+pattern = Pattern.compile("public static String getBuild\\(\\)[^}]+return \"([^\"]{11})\"");
+matcher = pattern.matcher(new String(fileChars));
+matcher.find();
+build = matcher.group(1);
+major = Integer.parseInt(build.substring(0,2));
+minor = Integer.parseInt(build.substring(3,5));
+beta = Integer.parseInt(build.substring(6,8));
+micro = Integer.parseInt(build.substring(9,11));
+branch = Macros.input(view, "Current branch or \"trunk\" (\"t\" is also possible)?", major + "." + minor + ".x");
+if (branch == null) {
+    return;
+}
+branch = "t".equals(branch) ? "trunk" : branch;
+tag = "jedit-"
+      + major
+      + "-" + minor
+      + (beta != 99 ? "-pre" + beta : "-" + micro);
+version = major
+          + "." + minor
+          + (beta != 99 ? "pre" + beta : "." + micro);
+nextVersion = major
+              + "." + minor
+              + (beta != 99 ? "pre" + (beta + 1) : "." + (micro + 1));
+nextBuild = String.format("%02d.%02d.%02d.%02d",
+                          new Object[] { Integer.valueOf(major),
+                                         Integer.valueOf(minor),
+                                         Integer.valueOf(beta == 99 ? beta : beta + 1),
+                                         Integer.valueOf(beta == 99 ? micro + 1 : micro) });
+sourceForgeUsername = Macros.input(view, "Your SourceForge Username?", "vampire0");
+if (sourceForgeUsername == null) {
+    return;
+}
+SearchAndReplace.setBeanShellReplace(false);
+SearchAndReplace.setIgnoreCase(false);
+SearchAndReplace.setRegexp(false);
+SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
+buffer.beginCompoundEdit();
+SearchAndReplace.setSearchString("[branch]");
+SearchAndReplace.setReplaceString(branch);
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("[tag]");
+SearchAndReplace.setReplaceString(tag);
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("[version]");
+SearchAndReplace.setReplaceString(version);
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("[major]");
+SearchAndReplace.setReplaceString(Integer.toString(major));
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("[minor]");
+SearchAndReplace.setReplaceString(Integer.toString(minor));
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("[nextVersion]");
+SearchAndReplace.setReplaceString(nextVersion);
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("[nextBuild]");
+SearchAndReplace.setReplaceString(nextBuild);
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("[sourceForgeUsername]");
+SearchAndReplace.setReplaceString(sourceForgeUsername);
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setRegexp(true);
+SearchAndReplace.setBeanShellReplace(true);
+SearchAndReplace.setSearchString("\\[ifdevel\\]((?:.|\n)*?)\\[/ifdevel\\]");
+SearchAndReplace.setReplaceString(beta != 99 ? "_1" : "");
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("\\[iffinal\\]((?:.|\n)*?)\\[/iffinal\\]");
+SearchAndReplace.setReplaceString(beta != 99 ? "" : "_1");
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("\\[ifbranch\\]((?:.|\n)*?)\\[/ifbranch\\]");
+SearchAndReplace.setReplaceString(branch.equals("trunk") ? "" : "_1");
+SearchAndReplace.replaceAll(view);
+textArea.replaceSelection("Variables replaced\n");
+buffer.endCompoundEdit();
 ====================================================================================================
 
 :wrap=soft:maxLineLen=0:folding=indent:
diff --git a/doc/users-guide/basics.xml b/doc/users-guide/basics.xml
index f36e951..0e1505c 100644
--- a/doc/users-guide/basics.xml
+++ b/doc/users-guide/basics.xml
@@ -254,6 +254,17 @@
         <guimenu>(Global|View|EditPane) Buffer Set</guimenu>.
         A change to the bufferset scope affects all editpanes immediately.
         </para>
+        
+        <bridgehead>Sorting of Buffer Sets and Buffer Switchers</bridgehead>
+        
+        <para>Buffer Switchers and Buffer Sets can be sorted independently. Both can be
+        sorted by name or by path. Both can be left unsorted. Possibly the most useful
+        combination is to sort the Buffer Switchers and leave the Buffer Sets unsorted. 
+        In this case, it is easy to find the buffer to work with in the Buffer Switcher
+        since the buffer names are sorted alphabetically, and leaving the Buffer Set unsorted
+        means the "go to previous" and "go to next" actions follow the order in which the
+        buffers were last used rather than by name. However, some users prefer Buffer
+        Sets to also be sorted by name or path, so jEdit supports multiple sorting methods.</para>
 
     </section>
 
diff --git a/doc/users-guide/customizing.xml b/doc/users-guide/customizing.xml
index a289b87..6291d00 100644
--- a/doc/users-guide/customizing.xml
+++ b/doc/users-guide/customizing.xml
@@ -223,15 +223,12 @@
     <section id="global-opts">
         <title>The Global Options Dialog Box</title>
 
-        <para><guimenu>Utilities</guimenu>><guimenuitem>Options</guimenuitem>
-        displays the options dialog box.
-        It has 2 tabs, the first one is <guimenu>Global Options</guimenu>.
-        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>
+        <para><guimenu>Utilities</guimenu>><guimenuitem>Options</guimenuitem> displays
+        the options dialog. It has 2 tabs, the first is <guimenu>Global Options</guimenu>.
+        This tab contains several options panes, each containing a set of related options.
+        Use the list on the left splitter to switch between panes. Only panes created by
+        jEdit are described here; <guimenuitem>Plugin Options</guimenuitem> panes are
+        created and documented by the plugins themselves. </para>
 
         <section id="general-pane">
             <title>The General Pane</title>
diff --git a/doc/users-guide/installing-modes.xml b/doc/users-guide/installing-modes.xml
index 5f0d1b1..7ab902f 100644
--- a/doc/users-guide/installing-modes.xml
+++ b/doc/users-guide/installing-modes.xml
@@ -4,6 +4,17 @@
     <!-- jEdit buffer-local properties: -->
     <!-- :indentSize=2:noTabs=true: -->
     <!-- :xml.root=users-guide.xml: -->
+    <para>The easiest way to install a new mode locally is to use the Editing 
+    dialog found under Utilities - Global Options. At the bottom of this dialog
+    is an "Add Mode" button. Clicking this button shows a dialog to add a mode
+    to jEdit. Simply fill in the blanks and the mode file will be put in the
+    proper place and the catalog file will be updated appropriately. Modes added
+    this way can be removed by selecting the mode in the Editing dialog, then
+    clicking the "Delete Mode" button. This button will only appear for modes
+    that exist in the user settings directory. Core modes, that is, those modes
+    distributed with jEdit cannot be deleted this way. The details of adding a
+    mode by hand are below.
+    </para>
     <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.
@@ -52,7 +63,12 @@
         <listitem>
             <para><literal>FILE_NAME_GLOB</literal> - files whose names match
             this glob pattern will be opened in this edit mode.
-            This can also specify full paths, if the glob pattern contains a path separator character. <literal>FILE_NAME_GLOB</literal> can be specified in the <literal>modes/catalog</literal> file, or the mode file itself. See the <literal>FILE_NAME_GLOB</literal> for <literal>apacheconf.xml</literal> in <literal>modes/catalog</literal> for an example of full path filename globbing.
+            This can also specify full paths, if the glob pattern contains a 
+            path separator character. <literal>FILE_NAME_GLOB</literal> can be 
+            specified in the <literal>modes/catalog</literal> file, or the mode 
+            file itself. See the <literal>FILE_NAME_GLOB</literal> for 
+            <literal>apacheconf.xml</literal> in <literal>modes/catalog</literal> 
+            for an example of full path filename globbing.
             </para>
         </listitem>
 
diff --git a/doc/users-guide/plugin-implement.xml b/doc/users-guide/plugin-implement.xml
index c6a5936..9a54647 100644
--- a/doc/users-guide/plugin-implement.xml
+++ b/doc/users-guide/plugin-implement.xml
@@ -184,8 +184,8 @@
             <listitem>
                 <informalexample>
                     <programlisting>public class QuickNotepadPlugin extends EditPlugin {
-	public static final String NAME = "quicknotepad";
-	public static final String OPTION_PREFIX = "options.quicknotepad.";
+  public static final String NAME = "quicknotepad";
+  public static final String OPTION_PREFIX = "options.quicknotepad.";
 }
 </programlisting>
                 </informalexample>
@@ -206,26 +206,26 @@
                     <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>
+  <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>
@@ -260,15 +260,15 @@ plugin.QuickNotepadPlugin.version=4.5
 plugin.QuickNotepadPlugin.docs=index.html
 
 # we only have one dependency, jEdit 4.5
-# See jEdit.getBuild() to understand version numbering scheme. 
+# See jEdit.getBuild() to understand version numbering scheme.
 plugin.QuickNotepadPlugin.depend.0=jedit 4.05.99.00
 
 # quicknotepad's plugin menu - a list of actions or separators
 plugin.QuickNotepadPlugin.menu=quicknotepad \
-	- \
-	quicknotepad.choose-file \
-	quicknotepad.save-file \
-	quicknotepad.copy-to-buffer
+  - \
+  quicknotepad.choose-file \
+  quicknotepad.save-file \
+  quicknotepad.copy-to-buffer
 
 # action labels for actions supplied by dockables.xml
 quicknotepad.label=QuickNotepad
@@ -454,15 +454,15 @@ options.quicknotepad.filepath=</programlisting>
         </tip>
 
 
-      <section id="localizationfiles"> 
+      <section id="localizationfiles">
       <title> Localization Files </title>
-      
+
       <para> In addition to property files ending in <literal>.props</literal>,
       you will find property files with the names like       <literal>lang_de.properties</literal>. Each of these files provides
-      localized strings for a particular locale. In the example above, it is for the German locale. These files are loaded by jEdit automatically when that locale is in use. They need to have a different filename extension from the other property files so they can be treated differently from 
+      localized strings for a particular locale. In the example above, it is for the German locale. These files are loaded by jEdit automatically when that locale is in use. They need to have a different filename extension from the other property files so they can be treated differently from
       the regular properties. </para>
       </section>
-      
+
     </section>
     <section id="plugin-implement-editbus">
         <title>The EditBus</title>
@@ -577,34 +577,34 @@ else if(msg instanceof ViewUpdate) {
 
         <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>
+  <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>
 
         <tip> <title> Actions in jEdit core </title>
         <para> You can see how each action in jEdit core is implemented by
         inspecting the <literal>actions.xml</literal> file that is there. </para>
-        </tip>        
-        
+        </tip>
+
         <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">
@@ -665,9 +665,9 @@ else if(msg instanceof ViewUpdate) {
 <!DOCTYPE DOCKABLES SYSTEM "dockables.dtd">
 
 <DOCKABLES>
-	<DOCKABLE NAME="quicknotepad">
-		new QuickNotepad(view, position);
-	</DOCKABLE>
+  <DOCKABLE NAME="quicknotepad">
+    new QuickNotepad(view, position);
+  </DOCKABLE>
 </DOCKABLES></programlisting>
         </informalexample>
 
@@ -698,12 +698,12 @@ else if(msg instanceof ViewUpdate) {
         also contains the public interface you should use for getting, showing,
         hiding, and other interactions with the plugin's top-level
         windows.</para>
-        
-        
+
+
         <tip> <title> jEdit's dockables </title> <para> jEdit has its own
         <literal>dockables.xml</literal> file that you can inspect to see how
         jEdit creates its own dockables. </para> </tip>
-        
+
     </section>
 
     <section id="plugin-implement-services">
@@ -734,7 +734,7 @@ else if(msg instanceof ViewUpdate) {
     </SERVICE>
   [...]
 </SERVICES>
-    
+
 </programlisting>
         </informalexample>
 
@@ -756,7 +756,7 @@ else if(msg instanceof ViewUpdate) {
         attributes mean, as well as how to register and use services.
         You can also inspect the <literal>services.xml</literal> file of jEdit
         core to see what services are offered by jEdit itself. </para>
-        
+
     </section>
 
     <section id="plugin-implement-quicknotepad">
@@ -1223,7 +1223,7 @@ else if(msg instanceof ViewUpdate) {
             </listitem>
         </itemizedlist>
 
-        <para>Because this build file and the one of most plugins import a
+        <para>Because this build file and those used by 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
diff --git a/doc/users-guide/starting.xml b/doc/users-guide/starting.xml
index 2c5fe35..03767e5 100644
--- a/doc/users-guide/starting.xml
+++ b/doc/users-guide/starting.xml
@@ -371,12 +371,12 @@
             </informaltable>
         </section>
     </section>
-    <section id="jvm-options"> 
+    <section id="jvm-options">
     <title> Java Virtual Machine Options </title>
 
       <para> To enable AntiAliasing in the TextArea, see <xref
       linkend="text-area-pane" />. </para>
-    
+
       <para> It is possible to pass command line options to the Java
       Virtual Machine (JVM). These options can change certain things about how
       Java runs, such as the maximum heap size, or whether antialiasing is used
@@ -391,19 +391,23 @@
       parameter must be the last <literal>java</literal> option, followed
       immediately by the path to <filename>jedit.jar</filename> and then any
       jEdit command line options.</para>
-      
+
       <para> On a Windows install that uses <literal>jEdit.exe</literal>, the
       JVM options are located in a separate file, called
       <literal>jEdit.l4j.ini</literal>. Create or edit this file in the same
       directory as <literal>jEdit.exe</literal> and place one JVM option per
       line. </para>
-      
+
+      <para> On Mac OS X, the jEdit.app bundle gets JVM options from a file called
+      <literal>Contents/Info.plist</literal>, which can be edited with a text editor.
+      </para>
+
       <para> There is no complete list of options to <literal>java</literal>,
       since it can vary from one platform to another. Some of can be found by
       typing the commands <literal>java -?</literal> or <literal>man
       java</literal>. Common JVM options that are used with jEdit and work on
       all platforms are: </para>
-      
+
       <informaltable>
         <tgroup cols="2">
             <colspec colnum="1" colwidth="1.5in" />
@@ -427,10 +431,10 @@
               </row>
               <row>
                   <entry><userinput>-Djedit.home=/path/to/jedit</userinput>
-                  </entry> 
+                  </entry>
                   <entry> Sets/overrides the java System property
                   <literal>jedit.home</literal> to be the path to the jEdit
-                  install. This tells jEdit where to find its site properties, 
+                  install. This tells jEdit where to find its site properties,
                   default keymaps, macros, edit modes, and documentation. You can override
                   this setting to create a custom install that is shared by multiple
                   users. See <xref linkend="sitepropertiesfiles"/> for more information.
@@ -438,12 +442,13 @@
                   </row>
               <row>
                   <entry><userinput>-mx768m</userinput></entry>
-                  <entry> Sets maximum heap size to 768 megabytes. 
+                  <entry> Sets maximum heap size to 768 megabytes.
                   Adjust this value depending on your own personal needs /
-                  plugins. </entry> 
+                  plugins. On at least one platform, <literal>-Xmx768m</literal> works
+                  when <literal>-mx768m</literal> does not (or vice-versa). </entry>
               </row>
-            </tbody> 
+            </tbody>
           </tgroup>
-       </informaltable>      
-    </section>    
+       </informaltable>
+    </section>
 </chapter>
diff --git a/doc/users-guide/users-guide.xml b/doc/users-guide/users-guide.xml
index 571aac0..5a0b658 100644
--- a/doc/users-guide/users-guide.xml
+++ b/doc/users-guide/users-guide.xml
@@ -5,7 +5,7 @@
 <book id="users-guide"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude"  xsi:noNamespaceSchemaLocation='http://www.docbook.org/xsd/4.4/docbook.xsd'>
     <bookinfo>
-        <title>jEdit 5.2 User's Guide</title>
+        <title>jEdit 5.3 User's Guide</title>
 
         <legalnotice>
             <title>Legal Notice</title>
@@ -22,7 +22,7 @@
         <author>
            <othername> The jEdit all-volunteer developer team </othername>
         </author>
-        
+
         <revhistory>
            <revision>
                 <revnumber>1.0 - 4.3</revnumber>
@@ -30,17 +30,17 @@
                 <author> <firstname>Slava</firstname> <surname>Pestov</surname> </author>
                 <revremark>Initial HTML document</revremark>
             </revision>
-            
+
             <revision>
                <revnumber>3.2 - 4.1</revnumber>
                <date>2001-2002</date>
                <author> <firstname>John</firstname><surname>Gellene</surname> </author>
                <revremark> Initial DocBook version. Initial versions of Plugin Guide and Macro Guide. </revremark>
                </revision>
-            
+
             <revision>
-              <revnumber>4.3 - 5.2</revnumber>
-              <date>2005-2014</date>
+              <revnumber>4.3 - 5.3</revnumber>
+              <date>2005-2015</date>
               <author><firstname>Alan</firstname><surname>Ezust</surname></author>
               <revremark> Maintainer. </revremark>
             </revision>
@@ -130,10 +130,10 @@
             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>Where applicable, this section will also explain how jEdit's
-            source code is similar. Therefore, this is also a good introduction to 
-            to jEdit development. </para>   
+            source code is similar. Therefore, this is also a good introduction to
+            to jEdit development. </para>
 
         </partintro>
 
diff --git a/doc/welcome.html b/doc/welcome.html
index 1ffe460..5883d00 100644
--- a/doc/welcome.html
+++ b/doc/welcome.html
@@ -4,7 +4,7 @@
 
 <center>
 <img src="jedit.png" width="128" height="128">
-<h2>Welcome to jEdit 5.2</h2>
+<h2>Welcome to jEdit 5.3</h2>
 </center>
 <p> Useful menu commands: </p>
 <ul>
diff --git a/doc/whatsnew/news.xml b/doc/whatsnew/news.xml
index a0d1fd5..34c27c1 100644
--- a/doc/whatsnew/news.xml
+++ b/doc/whatsnew/news.xml
@@ -4,24 +4,21 @@
      xmlns:xi="http://www.w3.org/2001/XInclude"
      xsi:noNamespaceSchemaLocation='http://www.docbook.org/xsd/4.4/docbook.xsd'>
 
-    <title> What's new in jEdit 5.2 </title>
+    <title> What's new in jEdit 5.3 </title>
     <articleinfo>
-        <date> 2014 </date>
+        <date> 2015 </date>
     </articleinfo>
 
 
     <para> This is a time-based release, scheduled to come out about 1 year after
-    jEdit 5.1, and is a collection of enhancements, bug fixes and patches
+    jEdit 5.2, and is a collection of enhancements, bug fixes and patches
     submitted by the community. Detailed changes can be found in the <ulink
     url="../CHANGES.txt">Detailed Change Log</ulink>.
     </para>
 
-    <para> There are no major new features in this release. You can think of it mostly as
-    a bugfix release, although there are quite a lot of UI enhancements also. </para>
-
     <para> With continued support from the community, we will keep releasing a newer
     version each year that can accurately bring together the fruits of everyone's labor.
-    Thank you to each and every one of the contributors who helped make 5.2 the best
+    Thank you to each and every one of the contributors who helped make 5.3 the best
     version of jEdit ever.
     </para>
 
diff --git a/jEdit.iml b/jEdit.iml
index 45c09fe..a7eb163 100644
--- a/jEdit.iml
+++ b/jEdit.iml
@@ -16,7 +16,8 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" scope="TEST" name="Test Dependencies" level="project" />
-    <orderEntry type="library" name="Test Dependencies" level="project" />
+    <orderEntry type="library" name="Compile Dependencies" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Runtime Dependencies" level="project" />
   </component>
 </module>
 
diff --git a/keymaps/Alan_keys.props b/keymaps/Alan_keys.props
new file mode 100644
index 0000000..37d8377
--- /dev/null
+++ b/keymaps/Alan_keys.props
@@ -0,0 +1,403 @@
+#jEdit's keymap Alan
+#Thu Aug 14 11:07:15 PDT 2014
+collapse-fold.shortcut=A+BACK_SPACE
+jdiff.next-diff.shortcut=C+q C+n
+select-all.shortcut=A+a
+old/Xml-Lint.shortcut=C+x C+l
+delete.shortcut=DELETE
+projectviewer.shortcut2=A+p A+p
+combined-options.shortcut=A+o
+navigator.back.shortcut=A+KP_LEFT
+navigator-push-position.shortcut=C+m C+EQUALS
+vfs.browser.shortcut=CA+f
+projectviewer.actions.activate.projectM.shortcut=A+p m
+toggle-dual-diff.shortcut=C+q d
+xml-chars-to-entities.shortcut=C+x C+e
+vfs.browser.home.shortcut=~
+select-next-page.shortcut2=AS+a
+debugger-finish.shortcut=C+q F9
+insert-tab.shortcut=C+i
+chdir-pv-root.shortcut=A+c A+r
+projectviewer.actions.activate.slackerdoc.shortcut=A+p l
+console-clear.shortcut=A+c A+c
+unsplit.shortcut=C+1
+quick-search.shortcut=A+,
+commando-compile.shortcut=C+F9
+copy-string-register.shortcut=C+r C+c
+SuperAbbrevs.tab.shortcut=TAB
+prev-buffer.shortcut=C+PAGE_UP
+xfind-prev.shortcut=C+q p
+indent.shortcut=C+x C+b
+project-run.shortcut=C+F5
+project-compile.shortcut=F9
+projectviewer.actions.activate.course-material.shortcut=A+p t
+projectviewer.actions.activate.Oopdocbook-trunk.shortcut2=A+q o
+perspective-save.shortcut=C+w s
+Editing/Duplicate_Lines_Below.shortcut=C+w b
+projectviewer.actions.activate.course-material.git.shortcut=A+p t
+antfarm-toggle.shortcut=CA+OPEN_BRACKET
+console.shell.BeanShell-show.shortcut=A+c b
+markersets-jump-to-marker.shortcut=C+m C+g
+Files/Browse_Buffer_Directory.shortcut=CA+b
+jtools.import-class-at-caret.shortcut=A+i
+document-end.shortcut=C+END
+open-moin-page.shortcut=C+x C+w
+delete-start-line.shortcut=CS+BACK_SPACE
+Emacs/Emacs_Kill_Line.shortcut=C+k
+projectviewer.actions.activate.Xml.shortcut=A+p x
+select-next-line.shortcut2=AS+k
+cut.shortcut=CS+x
+RunPython.shortcut=C+9
+projectviewer.actions.activate.oopdocbook-trunk.shortcut=A+p o
+projectviewer.actions.activate.amarok.shortcut=A+p a
+prev-word-std-after.shortcut2=C+LEFT
+select-next-char.shortcut2=AS+l
+projectviewer.actions.activate.z10player.shortcut=A+p z
+shift-left.shortcut=S+TAB
+select-next-page.shortcut=S+PAGE_DOWN
+unescape-unicode-selection.shortcut=C+u C+u
+select-next-paragraph.shortcut=CS+DOWN
+vfs.browser.next.shortcut=A+Right
+markersets-prev-marker.shortcut=C+m C+p
+projectviewer.actions.activate.desktop.shortcut=A+p d
+close-buffer.shortcut2=CS+w
+end.shortcut=END
+navigator.forwardFile.shortcut=C+x C+RIGHT
+projectviewer.actions.activate.resume.shortcut=A+p r
+expand-abbrev.shortcut2=C+;
+projectviewer.actions.activate.courseware.shortcut=A+ESCAPE i
+sidekick.parser.ctags-switch.shortcut=A+s c
+navigator-swap-caret-and-top.shortcut=C+m s
+DictPluginMenu.shortcut=A+l
+recent-buffer.shortcut=A+PAGE_UP
+prev-textarea.shortcut=C+x p
+cpp/Include_Guard.shortcut=CA+i
+fastopen.shortcut=C+x C+o
+projectviewer.actions.activate.Console.shortcut=A+p c
+fastopenwindow.show.shortcut=A+BACK_QUOTE
+scroll-down-line.shortcut=C+SLASH
+vfs.browser.rename.shortcut=F2
+editpane-close-buffer.shortcut=C+w C+b
+sidekick.parser.outline-switch.shortcut=A+s o
+exit.shortcut=C+q C+q
+next-char.shortcut=RIGHT
+console.shell.System-show.shortcut=A+c s
+debugger-watches-toggle.shortcut=C+q e
+next-fold.shortcut=C+m C+f
+vertical-paste-string-register.shortcut=C+r C+p
+latextools-compile.shortcut=F8
+navigator-push-position.shortcut2=C+m a
+debugger-show-variables-toggle.shortcut=C+q v
+recentbufferswitcher.shortcut=C+TAB
+console.shell.JavaScript-show.shortcut=A+c j
+delete.shortcut2=C+d
+resplit.shortcut=C+4
+scriptengine.plugin.evaluate.buffer.shortcut=C+q b
+projectviewer.shortcut=CA+p
+prev-paragraph.shortcut=C+UP
+projectviewer.actions.activate.Qt5.1beta1-src.shortcut=A+p q
+vfs.browser.delete.shortcut=DELETE
+shortcutSaver-action2.shortcut=C+x C+l
+Files/Next_Dirty_Buffer.shortcut=C+x C+d
+projectviewer.actions.activate.qt5-git.shortcut=A+p q
+ctags-interface-preview-toggle.shortcut=C+q C+t
+jexplorer-selAtCursor.shortcut=A+e
+buffertabs.toggle-vis.shortcut2=CA+t
+vfs.browser.new-directory.shortcut=INSERT
+find-prev.shortcut=S+F3
+projectviewer.actions.activate.qtbook.shortcut=A+p b
+Text/Insert_Date.shortcut=A+d
+jimporter.import-class-at-point.shortcut=A+i
+projectviewer.actions.activate.Aptana.shortcut=A+p a
+buffertabs.toggle-vis.shortcut=CS+t
+expand-all-folds.shortcut2=CS+ENTER
+format-paragraph.shortcut2=A+j
+projectviewer.actions.activate.Qt-4.7.0.shortcut=A+p q
+show-call-tree.shortcut=CS+t
+next-word-std.shortcut2=A+f
+projectviewer.actions.activate.jedit.git.shortcut=A+p j
+select-prev-line.shortcut=S+UP
+prev-word-std-after.shortcut=A+b
+commando.xmllint.shortcut=C+x C+l
+updater-update-daily.shortcut=C+x C+u
+debugger-until.shortcut=C+q F6
+buffer-options.shortcut=M+p
+projectviewer.actions.activate.5.0.x.shortcut=A+p 5
+projectviewer_jarmaker_dialog.shortcut=C+r C+j
+Emacs-Ctrl-K.shortcut=C+k
+copy.shortcut2=CS+c
+Toggle_Header_Source.shortcut=A+h
+projectviewer.actions.activate.qt5.shortcut=A+p q
+Editing/Duplicate_Lines_Above.shortcut=C+w u
+Editing/Go_to_Offset.shortcut=CS+g
+set-view-title.shortcut=A+F2
+JumpPlugin.workspacejump.shortcut=F5
+ctags-interface-complete-from-db.shortcut=CS+SPACE
+close-docking-area.shortcut=ESCAPE
+scroll-down-page.shortcut=A+SLASH
+SuperAbbrevs.shiftTab.shortcut=S+TAB
+overwrite.shortcut=INSERT
+projectviewer.actions.activate.KeePass.shortcut=A+p k
+git_commit.shortcut=C+x C+g
+insert-literal.shortcut=C+6
+next-page.shortcut=PAGE_DOWN
+debugger-toggle-breakpoint.shortcut=C+F8
+next-textarea.shortcut2=C+x C+n
+select-next-word-std.shortcut=CS+RIGHT
+quicknotepad.shortcut=A+q
+lucene.search-word-at-caret.shortcut=F6
+redo.shortcut=CS+z
+select-document-end.shortcut=CS+END
+tabs-to-spaces.shortcut=C+x C+t
+match-bracket.shortcut2=C+m C+b
+codeaid.complete.shortcut=C+SPACE
+next-textarea.shortcut=C+x n
+sidekick.parser.xml-switch.shortcut=A+s x
+xml-match-tag.shortcut=CS+M
+Clipboard/Cut_Lines.shortcut=C+m C+k
+projectviewer.actions.activate.m3uplayer.shortcut=A+p m
+action-bar.shortcut=C+ENTER
+insert-newline.shortcut=S+ENTER
+projectviewer.actions.activate.rats.shortcut=A+p r
+shortcutSaver-action4.shortcut=F2
+insert-newline-indent.shortcut=ENTER
+docbook/xref.shortcut=C+r C+x
+prev-char.shortcut2=C+b
+close-buffer.shortcut=C+w C+w
+xfind-replace-dialog.shortcut=C+r C+f
+git_blame.shortcut=C+x C+b
+projectviewer.actions.activate.qt-x11-opensource-src-4.5.1.shortcut=A+p q
+select-document-home.shortcut=CS+HOME
+spell-check-selection.shortcut=F7
+quick-search.shortcut2=C+BACK_SLASH
+combined-options.shortcut2=C+F12
+Editing/Emacs-Ctrl-K.shortcut=C+k
+debugger-next.shortcut=C+q n
+projectviewer.actions.activate.Qt-4.6.1.shortcut=A+p q
+layout-load.shortcut=C+w l
+global-close-buffer.shortcut2=C+x c
+vfs.browser.reload.shortcut=F5
+projectviewer-toggle.shortcut2=S+F2
+projectviewer.actions.activate.oopdocbook.git.shortcut=A+p o
+Emacs/Emacs_Insert_File.shortcut=C+x C+i
+prev-line.shortcut=UP
+join-lines.shortcut=C+x C+j
+projectviewer.actions.activate.qt-4.7-src.shortcut=A+p q
+backspace.shortcut=BACK_SPACE
+projectviewer.actions.activate.FTP.shortcut=A+p f
+sql.publishSelection.shortcut=C+x C+s
+console.shortcut=A+x
+open-file.shortcut=C+o
+unsplit-current.shortcut=C+0
+copy-append-string-register.shortcut=C+r C+a
+Interface/Splitpane_Grow.shortcut=C+x C+6
+projectviewer.actions.activate.Oopdocbook-trunk.shortcut=A+ESCAPE o
+docker.popup.bottom-dock.shortcut=KP_DOWN
+openit.find-file-in-source-path.shortcut=A+ESCAPE
+navigator.forward.shortcut=A+KP_RIGHT
+updater-update-default.shortcut=C+x C+u
+vfs.browser.previous.shortcut=A+Left
+vfs.browser.synchronize.shortcut=-
+expand-abbrev.shortcut=C+SEMICOLON
+expand-all-folds.shortcut=CA+RIGHT
+new-plain-view.shortcut=CA+n
+projectviewer_set-active.shortcut=A+DOWN
+emacs/Emacs-Ctrl-K.shortcut=C+k
+show-context-menu.shortcut=CONTEXT_MENU
+select-prev-paragraph.shortcut=CS+UP
+new-view.shortcut=CS+n
+include_common.pri.shortcut=C+INSERT
+docker.popup.top-dock.shortcut=KP_UP
+select-home.shortcut2=AS+z
+Paste_Plugins_List.shortcut=C+x C+i
+collapse-all-folds.shortcut=CA+LEFT
+options.shortcuts.shortcut2=Alternative shortcut
+delete-end-line.shortcut=CS+DELETE
+session-manager.shortcut=C+m C+s
+next-buffer.shortcut=C+PAGE_DOWN
+assistant.shortcut=F2
+console.shell.ssh-show.shortcut=A+c h
+synchroscroll.synchroScroll.shortcut=C+q s
+scroll-and-center=C+l
+Xml-Match.shortcut=C+x C+m
+select-prev-char.shortcut=S+LEFT
+sidekick.parser.java-switch.shortcut=A+s j
+navigator.backFile.shortcut=C+x C+LEFT
+copy.shortcut=C+c
+record-macro.shortcut=C+m C+r
+smart-end.shortcut=C+e
+next-paragraph.shortcut=C+DOWN
+Editing/Move_Lines_Down.shortcut=C+m C+d
+projectviewer.actions.activate.ProjectViewer.shortcut=A+p p
+next-word-std.shortcut=C+RIGHT
+jdiff.prev-diff.shortcut=C+q C+p
+JumpPlugin.tagsjump.shortcut=C+x C+j
+paste.shortcut2=C+v
+projectviewer.actions.activate.QtMobility.shortcut=A+p m
+show-references.shortcut=CS+r
+debugger-program-output-toggle.shortcut=C+q o
+python-compile.shortcut=C+0
+pythonpanel.shortcut=C+8
+projectviewer.actions.activate.4.5.x.shortcut=A+p 4
+navigator.gotoLine.shortcut=C+g
+commando.make.shortcut=C+F10
+toggle-dock-areas.shortcut=F12
+navigator-pop-position.shortcut=C+m -
+debugger-go.shortcut=C+q F5
+eval-selection.shortcut=A+e
+escape-unicode-selection.shortcut=C+u C+e
+save.shortcut=C+s
+projectviewer.actions.activate.jEdit-trunk.shortcut=A+p j
+select-prev-word.shortcut=CS+LEFT
+smart-home.shortcut=C+a
+smart-open.shortcut=C+x C+o
+help.shortcut=F1
+sidekick-prev-asset.shortcut=C+j C+p
+indexterm.shortcut=CA+t
+ebrowse.buffer.shortcut=C+x C+o
+shortcutSaver-action1.shortcut=C+x C+m
+git_grep_sel.shortcut=C+F6
+codeaid.showMethodDoc.shortcut=S+F1
+new-file-in-mode.shortcut=A+n
+Redo.shortcut=C+F4
+prev-line.shortcut2=C+p
+xsearch-dockable.shortcut=C+r C+r
+error-list-toggle.shortcut2=C+x e
+Splitpane_Grow.shortcut=C+x C+6
+docbook/slackerxsd.shortcut=C+x C+a
+expand-fold.shortcut=AS+ENTER
+projectviewer.actions.activate.infocus.shortcut=A+p i
+select-prev-page.shortcut=S+PAGE_UP
+cpp/Toggle_Header_Source.shortcut=A+h
+Editing/Move_Lines_Up.shortcut=C+m C+u
+chdir-pv-selected.shortcut=A+c A+n
+split-horizontal.shortcut=C+2
+expand-one-level.shortcut=A+ENTER
+select-next-line.shortcut=S+DOWN
+Interface/Decrease_Font_Size.shortcut=C+SUBTRACT
+perspective-load.shortcut=C+w l
+print.shortcut=PRINTSCREEN
+projectviewer.actions.activate.SVNPlugin.shortcut=A+p s
+fastopen.show.shortcut=C+x C+o
+junit.dock.shortcut=C+x C+j
+toggle-rect-select.shortcut=A+BACK_SLASH
+Next_Char2.shortcut=C+x C+q
+select-none.shortcut=C+w n
+cscopefinder-find-calling.shortcut=CS+r
+match-bracket.shortcut=C+m C+m
+tt-region.shortcut=C+t
+xml-match-tag.shortcut2=CS+m
+ctags-interface-jump-to-tag.shortcut=CS+d
+prev-char.shortcut=LEFT
+Files/Send_Buffer_To_Next_Split.shortcut=C+w C+b
+Emacs/Emacs_Upcase_Word.shortcut=A+u
+vfs.browser.up.shortcut=A+Up
+white-space.toggle-remove-trailing-white-space.shortcut=C+w C+r
+Interface/Increase_Font_Size.shortcut=C+ADD
+Interface/Reset_TextArea.shortcut=C+x C+r
+closeall-except-active.shortcut=C+w C+c
+closeall-bufferset.shortcut=C+x C+a
+cut-string-register.shortcut=C+r C+x
+home.shortcut=HOME
+docker.popup.right-dock.shortcut=KP_RIGHT
+toggle-buffer-switcher.shortcut=C+w C+s
+undo.shortcut=C+z
+select-end.shortcut=S+END
+sidekick-next-asset.shortcut=C+j C+n
+delete-word-std.shortcut=C+DELETE
+Cut_Selection_or_Line.shortcut=C+k
+jcompiler-compilepkg.shortcut=F10
+jimporter.options.shortcut=A+k
+codebrowser-toggle.shortcut=CA+c
+last-macro.shortuct=C+m C+l
+projectviewer.actions.activate.xml.shortcut=A+p x
+Splitpane_Grow2.shortcut=C+x C+6
+scroll-and-center.shortcut=C+l
+shortcutSaver-action3.shortcut=C+SPACE
+insert-tab-indent.shortcut=TAB
+paste.shortcut=C+y
+next-line.shortcut2=C+n
+next-char.shortcut2=C+f
+projectviewer_parent-group.shortcut=A+UP
+new-view.shortcut2=CS+N
+error-list-toggle.shortcut=CA+e
+projectviewer.actions.activate.mmjbamarok.shortcut=A+ESCAPE m
+transpose-chars.shortcut=C+t
+projectviewer.actions.activate.qt-mobility.shortcut=A+p m
+memento-toggle.shortcut=C+t
+XmlLint.shortcut=C+x C+l
+navigator-pop-position.shortcut2=C+m C+MINUS
+backspace-word-std-after.shortcut=C+BACK_SPACE
+layout-save.shortcut=C+w s
+markersets-toggle-marker.shortcut=C+m C+a
+toggle-full-screen.shortcut=F11
+vfs.browser.roots.shortcut=/
+prev-word.shortcut=C+LEFT
+select-home.shortcut=S+HOME
+projectviewer_wrapper_edit.shortcut=CS+F12
+console.shell.Python-show.shortcut=A+c p
+close-view.shortcut=C+w C+v
+docker.popup.left-dock.shortcut=KP_LEFT
+ebrowse.markendcut.shortcut=CS+k
+save.shortcut2=C+x C+BACK_SLASH
+vfs.browser.new-file.shortcut=C+n
+projectviewer.actions.activate.Updater.shortcut=A+p u
+projectviewer.actions.activate.icsqt.shortcut=A+p i
+projectviewer.actions.activate.GitPlugin.shortcut=A+p g
+scriptengine.plugin.evaluate.selection.shortcut=C+q s
+exit.shortcut2=C+x C+c
+projectviewer.actions.activate.nokia-training-trunk.shortcut=A+p n
+Xml-Match.shortcut2=CS+m
+jtools.check-imports-current.shortcut=A+c
+hypersearch.shortcut=C+PERIOD
+markersets-next-marker.shortcut=C+m C+n
+prev-page.shortcut=PAGE_UP
+cplusplus/Toggle_Header_Source.shortcut=A+h
+codeaid.goToDeclaration.shortcut=A+g
+Properties/Create_Plugin_Announcement.shortcut2=C+q c
+projectviewer.actions.activate.Qt4.7-src.shortcut=A+p q
+xml/Xml-Lint.shortcut2=C+X C+L
+debugger-show-locals-toggle.shortcut=C+q l
+next-line.shortcut=DOWN
+clear-register.shortcut=C+r C+l
+goto-line.shortcut=C+g
+navigator.back.shortcut2=A+LEFT
+projectviewer.actions.activate.qt-mobility-opensource-src-1.2.0.shortcut=A+p m
+Reset_TextArea_dev.shortcut=C+x C+r
+docker.toggle-docks.shortcut=F12
+save-as.shortcut=C+x C+w
+ctags-interface-change-db-settings.shortcut=C+F11
+jindex-open-sel.shortcut=F2
+find.shortcut=C+r C+r
+select-prev-word-std-after.shortcut=CS+LEFT
+jtadebug.reset.shortcut=F5
+marker-set-manager-toggle.shortcut=C+m C+t
+shortcutSaver-action5.shortcut=AS+i
+document-home.shortcut=C+HOME
+reload.shortcut=F5
+python-debug.shortcut=C+9
+activator.reloader.shortcut=CA+r
+sidekick-tree-toggle.shortcut2=C+F2
+select-prev-page.shortcut2=AS+q
+select-block.shortcut=C+OPEN_BRACKET
+sidekick-tree.shortcut=CA+s
+Emacs/Emacs_Downcase_Word.shortcut=A+l
+C/Toggle_Header_Source.shortcut2=CA+h
+indexterm.shortcut2=A+t
+cut.shortcut2=C+x C+x
+split-vertical.shortcut=C+3
+debugger-gdb-output-toggle.shortcut=C+q g
+error-list-next-error.shortcut=F4
+Toggle_Header_Source2.shortcut=A+h
+projectviewer.actions.activate.nemo.shortcut=A+p n
+select-end.shortcut2=AS+x
+scroll-up-line.shortcut=C+QUOTE
+name.shortcut=A+2
+prev-textarea.shortcut2=C+x C+p
+find.shortcut2=CS+f
+navigator.forward.shortcut2=A+RIGHT
+paste-string-register.shortcut=C+r C+v
+find-next.shortcut=F3
+projectviewer.actions.activate.Oopdocbook.shortcut=A+ESCAPE o
+select-next-char.shortcut=S+RIGHT
+select-prev-char.shortcut2=AS+j
diff --git a/macros/C/Include_Guard.bsh b/macros/C/Include_Guard.bsh
index 6e73d42..9d3d27b 100644
--- a/macros/C/Include_Guard.bsh
+++ b/macros/C/Include_Guard.bsh
@@ -21,7 +21,7 @@
  * 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 $
+ * $Id: Include_Guard.bsh 23971 2015-08-08 19:37:35Z daleanson $
  *
  * Notes on use:
  *
@@ -68,7 +68,4 @@ void includeGuard()
     textArea.setCaretPosition(pos + pos1);
 }
 
-if( buffer.isReadOnly() ) 
-    Macros.error(view, "Buffer is read-only.");
-else 
     includeGuard();
diff --git a/macros/Clipboard/Cut_Lines.bsh b/macros/Clipboard/Cut_Lines.bsh
index 39b7e33..8fa090c 100644
--- a/macros/Clipboard/Cut_Lines.bsh
+++ b/macros/Clipboard/Cut_Lines.bsh
@@ -6,7 +6,7 @@
 * Copyright (C) 2003 Ollie Rutherfurd <oliver at jedit.org>
 * Copyright (c) 2008 encorejane at users.sourceforge.net
 *
-* $Id: Cut_Lines.bsh 22664 2013-01-09 13:16:00Z kpouer $
+* $Id: Cut_Lines.bsh 23971 2015-08-08 19:37:35Z daleanson $
 */
 
 cutLines(){
@@ -23,9 +23,6 @@ cutLines(){
 	Registers.cut(textArea,'$');
 }
 
-if(buffer.isReadOnly())
-	Toolkit.getDefaultToolkit().beep();
-else
 	cutLines();
 
 /*
diff --git a/macros/Clipboard/Cut_Lines_Containing.bsh b/macros/Clipboard/Cut_Lines_Containing.bsh
index 6a6270d..3c677c3 100644
--- a/macros/Clipboard/Cut_Lines_Containing.bsh
+++ b/macros/Clipboard/Cut_Lines_Containing.bsh
@@ -4,7 +4,7 @@
  * 
  * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
  *
- * $Id: Cut_Lines_Containing.bsh 21353 2012-03-14 09:46:51Z jojaba_67 $
+ * $Id: Cut_Lines_Containing.bsh 23971 2015-08-08 19:37:35Z daleanson $
  */
 
 // Localization
@@ -35,7 +35,4 @@ cutLinesContaining(){
 	view.getStatus().setMessageAndClear(count + " " + LinesCutMessage);
 }
 
-if(buffer.isReadOnly())
-	Toolkit.getDefaultToolkit().beep();
-else
 	cutLinesContaining();
diff --git a/macros/Editing/Duplicate_Lines_Above.bsh b/macros/Editing/Duplicate_Lines_Above.bsh
index 5333ff5..1e440f4 100644
--- a/macros/Editing/Duplicate_Lines_Above.bsh
+++ b/macros/Editing/Duplicate_Lines_Above.bsh
@@ -29,17 +29,6 @@ final static String NotEditableMessage = jEdit.getProperty("macro.rs.general.Err
 // Process
 void duplicateLinesAbove()
 {
-	/*
-	 * Guard for readonly files because Buffer.insert()
-	 * ignores the flag
-	 *
-	 */
-	if(buffer.isReadOnly())
-	{
-		Macros.error(view, NotEditableMessage);
-		return;
-	}
-
 	selections = textArea.getSelectedLines();
 	if(selections.length == 0){
 		selections = new int [] {textArea.getCaretLine()};
diff --git a/macros/Editing/Duplicate_Lines_Below.bsh b/macros/Editing/Duplicate_Lines_Below.bsh
index 21f29ca..73472b2 100644
--- a/macros/Editing/Duplicate_Lines_Below.bsh
+++ b/macros/Editing/Duplicate_Lines_Below.bsh
@@ -31,17 +31,6 @@ final static String NotEditableMessage = jEdit.getProperty("macro.rs.general.Err
 // Process
 void duplicateLinesBelow()
 {
-	/*
-	 * Guard for readonly files becuase Buffer.insert()
-	 * ignores the flag
-	 *
-	 */
-	if(buffer.isReadOnly())
-	{
-		Macros.error(view, NotEditableMessage);
-		return;
-	}
-
 	selections = textArea.getSelectedLines();
 	if(selections.length == 0){
 		selections = new int [] {textArea.getCaretLine()};
diff --git a/macros/Editing/Greedy_Backspace.bsh b/macros/Editing/Greedy_Backspace.bsh
index 654a954..ab92df6 100644
--- a/macros/Editing/Greedy_Backspace.bsh
+++ b/macros/Editing/Greedy_Backspace.bsh
@@ -7,7 +7,7 @@
  *
  * Copyright (C) 2002-2004 Ollie Rutherfurd <oliver at jedit.org>
  *
- * $Id: Greedy_Backspace.bsh 5230 2005-07-20 13:31:08Z orutherfurd $
+ * $Id: Greedy_Backspace.bsh 23971 2015-08-08 19:37:35Z daleanson $
  */
 
 /**
@@ -74,8 +74,5 @@ void greedyBackspace(View view, boolean onlyFullTabs)
 		textArea.backspace();
 }
 
-if(buffer.isReadOnly())
-	Toolkit.getDefaultToolkit().beep();
-else
 	greedyBackspace(view,true);
 
diff --git a/macros/Editing/Greedy_Delete.bsh b/macros/Editing/Greedy_Delete.bsh
index dfcbf40..37e5c46 100644
--- a/macros/Editing/Greedy_Delete.bsh
+++ b/macros/Editing/Greedy_Delete.bsh
@@ -7,7 +7,7 @@
  *
  * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
  *
- * $Id: Greedy_Delete.bsh 5230 2005-07-20 13:31:08Z orutherfurd $
+ * $Id: Greedy_Delete.bsh 23971 2015-08-08 19:37:35Z daleanson $
  */
 
 /**
@@ -80,8 +80,5 @@ void greedyDelete(View view, boolean onlyFullTabs)
 		textArea.delete();
 }
 
-if(buffer.isReadOnly())
-	Toolkit.getDefaultToolkit().beep();
-else
 	greedyDelete(view,true);
 
diff --git a/macros/Editing/Move_Lines_Down.bsh b/macros/Editing/Move_Lines_Down.bsh
index f22beb8..57caa07 100644
--- a/macros/Editing/Move_Lines_Down.bsh
+++ b/macros/Editing/Move_Lines_Down.bsh
@@ -33,13 +33,6 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 final static String NotEditableMessage = jEdit.getProperty("macro.rs.general.ErrorNotEditableDialog.message", "Buffer is not editable");
 final static String NoMultipleSelectionError = jEdit.getProperty("macro.rs.MoveLines.NoMultipleSelection.error", "Line move does not work with multiple selection.");
 
-// check buffer read-only status
-if (buffer.isReadOnly())
-{
-	Macros.error( view, NotEditableMessage );
-	return;
-}
-
 // get the current selection or the current line if no selection
 Selection[] selections = textArea.getSelection();
 
@@ -50,55 +43,66 @@ if (selections.length > 1)
 	return;
 }
 
-int lineStart; 
-int lineEnd;
-if (selections.length == 0)
-{
-	lineStart = textArea.getCaretLine();
-	lineEnd = lineStart;
+// the approach is to get the line immediately following the selection
+// and insert it immediately preceeding the selection
+int startLine;
+int endLine;
+int nextLine;
+int insertionPoint;
+
+if (selections.length == 0) {
+	// nothing is selected, so use the line containing the caret
+	startLine = textArea.getCaretLine();
+	endLine = startLine;
 }
-else
-{
-	lineEnd = selections[0].getEndLine();
-	lineStart = selections[0].getStartLine();
+else {
+	startLine = textArea.getLineOfOffset(selections[0].getStart());
+	endLine = textArea.getLineOfOffset(selections[0].getEnd());
+	// limit to lines that are actually selected
+	if (textArea.getLineStartOffset(endLine) == selections[0].getEnd()) {
+		-- endLine;	
+	}
 }
 
-if (lineEnd == buffer.getLineCount() - 1)
-	return;
+insertionPoint = textArea.getLineStartOffset(startLine);
+nextLine = endLine + 1;
 
-int start_offset = textArea.getLineStartOffset(lineStart);
+if (nextLine == buffer.getLineCount()) {
+	// at bottom, can't move further down.
+	return;	
+}
 
-int nextLine = lineEnd + 1;
+// get the text of the line immediately following the selection, this is the 
+// text to be moved
 String nextLineText = buffer.getLineText(nextLine);
-int nextLineLength = nextLineText.length();
 
-boolean lastLine = nextLine == buffer.getLineCount() - 1;
+// need to check if the next line is also the last line in the buffer
+boolean nextIsLast = nextLine == buffer.getLineCount() - 1;
 
-if (lastLine)
-	buffer.remove(buffer.getLineStartOffset(nextLine), nextLineLength);
-else
-	buffer.remove(buffer.getLineStartOffset(nextLine), nextLineLength + 1);
-String lineSeparator = buffer.getStringProperty( "lineSeparator" );
-buffer.insert(start_offset, nextLineText + lineSeparator);
+// remove the next line from the buffer
+int removalStart = buffer.getLineStartOffset(nextLine);
+int removalLength = nextIsLast? buffer.getLineLength(nextLine) : buffer.getLineStartOffset(nextLine + 1) - removalStart;
+buffer.remove(removalStart, removalLength);
 
-if (lastLine)
-{
-	buffer.remove(buffer.getLength() - 1, 1);
+// then insert the next line immediately before the selection
+String lineSeparator = buffer.getStringProperty("lineSeparator");
+buffer.insertIndented(insertionPoint, nextLineText + lineSeparator);
+if (nextIsLast) {
+	buffer.remove(buffer.getLength() - 1, 1);	
 }
-	
+
+// indent the selection	
 Mode mode = buffer.getMode();
-String[] indentProps = new String[]{"indentOpenBrackets", "indentOpenBrackets",
-	"unalignedOpenBrackets", "unalignedCloseBrackets", "indentNextLine", 
-	"unindentThisLine", "electricKeys", "doubleBracketIndent", 
-	"lineUpClosingBracket"};
-for (String name : indentProps) 
-{
-	if (mode.getProperty(name) != null)
-	{
-		buffer.indentLines(lineStart + 1, lineEnd + 1);
-		break;
-	}
+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;
+    }
+}
+if (shouldIndent) {
+	buffer.indentLines(startLine + 1, endLine + 1);	
 }
-
 
 
diff --git a/macros/Editing/Move_Lines_Up.bsh b/macros/Editing/Move_Lines_Up.bsh
index 4f21ef3..47fe18a 100644
--- a/macros/Editing/Move_Lines_Up.bsh
+++ b/macros/Editing/Move_Lines_Up.bsh
@@ -1,5 +1,5 @@
 /*
-Move_Lines_Down.bsh - Beanshell macro to move a selection of lines down by one
+Move_Lines_Up.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
@@ -33,13 +33,6 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 final static String NotEditableMessage = jEdit.getProperty("macro.rs.general.ErrorNotEditableDialog.message", "Buffer is not editable");
 final static String NoMultipleSelectionError = jEdit.getProperty("macro.rs.MoveLines.NoMultipleSelection.error", "Line move does not work with multiple selection.");
 
-// check buffer read-only status
-if (buffer.isReadOnly())
-{
-	Macros.error( view, NotEditableMessage );
-	return;
-}
-
 // get the current selection or the current line if no selection
 Selection[] selections = textArea.getSelection();
 
@@ -50,62 +43,71 @@ if (selections.length > 1)
 	return;
 }
 
-int oldCaretPosition = textArea.getCaretPosition();
-int lineStart; 
-int lineEnd;
-if (selections.length == 0)
-{
-	lineStart = textArea.getCaretLine();
-	lineEnd = lineStart;
+// the approach is to remove the line immediately preceding the selection
+// and insert it immediately following the selection
+int startLine;
+int endLine;
+int prevLine;
+int insertionPoint;
+int insertionLine;
+
+if (selections.length == 0) {
+	// nothing is selected, so use the line containing the caret
+	startLine = textArea.getCaretLine();
+	endLine = startLine;
 }
-else
-{
-	lineStart = selections[0].getStartLine();
-
-	lineEnd = selections[0].getEndLine();
+else {
+	startLine = textArea.getLineOfOffset(selections[0].getStart());
+	endLine = textArea.getLineOfOffset(selections[0].getEnd());
+	// limit to lines that are actually selected
+	if (textArea.getLineStartOffset(endLine) == selections[0].getEnd()) {
+		-- endLine;	
+	}
+}
+if (startLine == 0) {
+	// already at top, can't move further up
+	return;	
 }
 
-if (lineStart == 0)
-	return;
-
-int end_offset = textArea.getLineEndOffset(lineEnd);
-
-int prevLine = lineStart - 1;
-int prevLineStartOffset = buffer.getLineStartOffset(prevLine);
+// get the text of the line immediately preceding the selection, this is the 
+// text to be moved
+prevLine = startLine - 1;
 String prevLineText = buffer.getLineText(prevLine);
-Log.log(Log.DEBUG, this , "prev=" + prevLineText + " endOFfset=" + end_offset);
-int prevLineLength = prevLineText.length();
 
-boolean lastLine = lineEnd == buffer.getLineCount() - 1;
-
-String lineSeparator = buffer.getStringProperty( "lineSeparator" );
-
-if (lastLine)
-	buffer.insert(end_offset - 1, lineSeparator + prevLineText);
-else
-
-	buffer.insert(end_offset, prevLineText + lineSeparator);
-
-buffer.remove(prevLineStartOffset, prevLineLength + 1);
-
-if (selections.length == 0)
-{
-	textArea.setCaretPosition(oldCaretPosition - prevLineLength - 1);
+// remove the previous line from the buffer
+int removalStart = buffer.getLineStartOffset(prevLine);
+int removalLength = buffer.getLineStartOffset(startLine) - buffer.getLineStartOffset(prevLine);
+buffer.remove(removalStart, removalLength);
+
+// then insert the previous line immediately after the selection
+insertionLine = endLine;
+boolean endLineIsLast = endLine == buffer.getLineCount() - 1;
+String lineSeparator = buffer.getStringProperty("lineSeparator");
+if (endLineIsLast) {
+	insertionPoint = buffer.getLength();
+	buffer.insertIndented(insertionPoint, lineSeparator + prevLineText);
+}
+else {
+	insertionPoint = textArea.getLineStartOffset(insertionLine);
+	buffer.insertIndented(insertionPoint, prevLineText + lineSeparator);
 }
 
+// indent the selection	
 Mode mode = buffer.getMode();
-String[] indentProps = new String[]{"indentOpenBrackets", "indentOpenBrackets",
-	"unalignedOpenBrackets", "unalignedCloseBrackets", "indentNextLine", 
-	"unindentThisLine", "electricKeys", "doubleBracketIndent", 
-	"lineUpClosingBracket"};
-for (String name : indentProps) 
-{
-	if (mode.getProperty(name) != null)
-	{
-		buffer.indentLines(lineStart - 1, lineEnd - 1);
-		break;
-	}
+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;
+    }
+}
+if (shouldIndent) {
+	buffer.indentLines(startLine - 1, endLine - 1);	
 }
 
-
+// reselect
+textArea.selectNone();
+selection = new Selection.Range(textArea.getLineStartOffset(prevLine), insertionPoint);
+textArea.addToSelection(selection);
 
diff --git a/macros/Files/Insert_Selection.bsh b/macros/Files/Insert_Selection.bsh
index 3039126..f02ec1c 100644
--- a/macros/Files/Insert_Selection.bsh
+++ b/macros/Files/Insert_Selection.bsh
@@ -7,7 +7,7 @@
  *
  * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
  *
- * $Id: Insert_Selection.bsh 22845 2013-03-16 08:28:12Z thomasmey $
+ * $Id: Insert_Selection.bsh 23971 2015-08-08 19:37:35Z daleanson $
  */
 
 insertSelected(View view, String path){
@@ -28,16 +28,11 @@ insertSelected(View view, String path){
 	}
 }
 
-if(buffer.isReadOnly()){
-	Toolkit.getDefaultToolkit().beep();
-}
-else{
 	String selected = view.getTextArea().getSelectedText();
 	if(selected == null || selected.indexOf('\n') != -1)
 		Toolkit.getDefaultToolkit().beep();
 	else
 		insertSelected(view,selected);
-}
 
 /*
 
diff --git a/macros/Java/Create_Constructor.bsh b/macros/Java/Create_Constructor.bsh
index 4c7b1c1..659b204 100644
--- a/macros/Java/Create_Constructor.bsh
+++ b/macros/Java/Create_Constructor.bsh
@@ -236,7 +236,4 @@ void parseSelection()
   textArea.indentSelectedLines();
 }
 
-if( buffer.isReadOnly() )
-	Macros.error( view, NotEditableMessage );
-else
 	parseSelection();
diff --git a/macros/Java/Get_Class_Name.bsh b/macros/Java/Get_Class_Name.bsh
index 91a035e..3294e9b 100644
--- a/macros/Java/Get_Class_Name.bsh
+++ b/macros/Java/Get_Class_Name.bsh
@@ -119,9 +119,4 @@ String getClassName()
 }
 
 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/macros/Java/Get_Package_Name.bsh b/macros/Java/Get_Package_Name.bsh
index f48277c..79ef091 100644
--- a/macros/Java/Get_Package_Name.bsh
+++ b/macros/Java/Get_Package_Name.bsh
@@ -22,7 +22,7 @@
  *
  * Based on code contributed by Richard Wan
  *
- * $Id: Get_Package_Name.bsh 21381 2012-03-15 20:02:15Z jojaba_67 $
+ * $Id: Get_Package_Name.bsh 23971 2015-08-08 19:37:35Z daleanson $
  *
  * Checked for jEdit 4.0 API
  *
@@ -98,10 +98,6 @@ String determinePackageName(String path)
     return packagePath;
 }
 
-if( buffer.isReadOnly() )
-	Macros.error( view, NotEditableMessage );
-else
-{
 	// main routine
 	if(!testClassPath())
 	{
@@ -116,7 +112,6 @@ else
 		}
 		else textArea.setSelectedText(result);
 	}
-}
 
 /*
 	Macro index data (in DocBook format)
diff --git a/macros/Java/Make_Get_and_Set_Methods.bsh b/macros/Java/Make_Get_and_Set_Methods.bsh
index d8b4f31..e15f4e3 100644
--- a/macros/Java/Make_Get_and_Set_Methods.bsh
+++ b/macros/Java/Make_Get_and_Set_Methods.bsh
@@ -423,7 +423,4 @@ void displayPrompt() {
 
 
 final static String NotEditableMessage = jEdit.getProperty("macro.rs.general.ErrorNotEditableDialog.message", "Buffer is not editable");
-if ( buffer.isReadOnly() )
-    Macros.error( view, NotEditableMessage );
-else
     displayPrompt();
\ No newline at end of file
diff --git a/macros/Misc/Display_Abbreviations.bsh b/macros/Misc/Display_Abbreviations.bsh
index 9eb949c..73a9f09 100644
--- a/macros/Misc/Display_Abbreviations.bsh
+++ b/macros/Misc/Display_Abbreviations.bsh
@@ -19,7 +19,7 @@
  * 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 21917 2012-07-03 12:10:15Z kpouer $
+ * $Id: Display_Abbreviations.bsh 23920 2015-05-22 08:03:45Z ezust $
  *
  * requires JDK 1.2, jEdit3.0
  *
@@ -153,6 +153,7 @@ void showAbbrevs()
 	columnNames.addElement(new String(AbbreviationLabel));
 	columnNames.addElement(new String(ExpansionLabel));
 	table = new JTable();
+	table.setRowHeight(GUIUtilities.defaultRowHeight());
 	table.setModel(new DefaultTableModel(data, columnNames));
 	table.setRowSelectionAllowed(true);
 	/* 	The next line prevents the table from being edited.
diff --git a/macros/Misc/Display_Shortcuts.bsh b/macros/Misc/Display_Shortcuts.bsh
index ee16aff..8495936 100644
--- a/macros/Misc/Display_Shortcuts.bsh
+++ b/macros/Misc/Display_Shortcuts.bsh
@@ -157,6 +157,7 @@ void showShortcuts(View view)
 	Collections.sort(v, new StandardUtilities.StringCompare());
 
 	table = new JTable(v, makeRow( NameLabel, Shortcut1Label, Shortcut2Label));
+	table.setRowHeight(GUIUtilities.defaultRowHeight());
 	table.getColumnModel().getColumn(0).setPreferredWidth(200);
 	table.setRowSelectionAllowed(true);
 	/* 	The next line prevents the table from being edited.
diff --git a/macros/Misc/Show_Threads.bsh b/macros/Misc/Show_Threads.bsh
index 2f9f710..e7bb185 100644
--- a/macros/Misc/Show_Threads.bsh
+++ b/macros/Misc/Show_Threads.bsh
@@ -22,7 +22,7 @@
  * Version 1.0
  * requires JDK 1.1, jEdit3.1
  *
- * $Id: Show_Threads.bsh 21353 2012-03-14 09:46:51Z jojaba_67 $
+ * $Id: Show_Threads.bsh 23923 2015-05-22 14:10:47Z ezust $
  */
 
 
@@ -120,6 +120,7 @@ JFrame createThreadsFrame() {
 
 
 	tree = new JTree(createModel());
+	tree.setRowHeight(0);
 	tree.putClientProperty("JTree.lineStyle", "Angled");
 	tree.addKeyListener(this);
 
diff --git a/macros/Properties/Insert_Buffer_Properties.bsh b/macros/Properties/Insert_Buffer_Properties.bsh
index d331f96..bf84682 100644
--- a/macros/Properties/Insert_Buffer_Properties.bsh
+++ b/macros/Properties/Insert_Buffer_Properties.bsh
@@ -24,7 +24,7 @@
  * 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 22807 2013-02-20 18:20:47Z kerik-sf $
+ * $Id: Insert_Buffer_Properties.bsh 23971 2015-08-08 19:37:35Z daleanson $
  */
 
 import java.awt.BorderLayout;
@@ -97,6 +97,7 @@ BufferLocalPropertiesDialog(View view){
 	_entries.copyInto(entries);
 
 	checkBox = new JCheckBoxList(entries);
+	checkBox.setRowHeight(GUIUtilities.defaultRowHeight());
 	checkBox.addKeyListener(this);
 	content.add(new JScrollPane(checkBox),
 		BorderLayout.CENTER);
@@ -209,9 +210,6 @@ BufferLocalPropertiesDialog(View view){
 	dialog.setVisible(true);
 }
 
-if(buffer.isReadOnly())
-	Macros.error(view, NotEditableMessage);
-else
 	BufferLocalPropertiesDialog(view);
 
 /*
diff --git a/macros/Text/Add_Prefix_and_Suffix.bsh b/macros/Text/Add_Prefix_and_Suffix.bsh
index bcff9ff..f957bfc 100644
--- a/macros/Text/Add_Prefix_and_Suffix.bsh
+++ b/macros/Text/Add_Prefix_and_Suffix.bsh
@@ -21,7 +21,7 @@
  * 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 21353 2012-03-14 09:46:51Z jojaba_67 $
+ * $Id: Add_Prefix_and_Suffix.bsh 23971 2015-08-08 19:37:35Z daleanson $
  *
  * Notes on use:
  *
@@ -142,9 +142,6 @@ void prefixSuffixDialog(View view)
 
 // this single line of code is the script's main routine
 // it calls the methods and exits
-if(buffer.isReadOnly())
-	Macros.error(view, NotEditableMessage);
-else
 	prefixSuffixDialog(view);
 
 /*
diff --git a/macros/Text/Color_Picker.bsh b/macros/Text/Color_Picker.bsh
index a557695..d59fe45 100644
--- a/macros/Text/Color_Picker.bsh
+++ b/macros/Text/Color_Picker.bsh
@@ -17,7 +17,7 @@
  * 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 21353 2012-03-14 09:46:51Z jojaba_67 $
+ * $Id: Color_Picker.bsh 23971 2015-08-08 19:37:35Z daleanson $
  */
 
 // Localization
@@ -34,9 +34,6 @@ else
 color = JColorChooser.showDialog(view, ColorPickerLabel, color);
 
 if (color != null){
-	if(buffer.isReadOnly())
-		Macros.error(view, NotEditableMessage);
-	else
 		textArea.setSelectedText(SyntaxUtilities.getColorHexString(color));
 }
 
diff --git a/macros/Text/Compose_Tag.bsh b/macros/Text/Compose_Tag.bsh
index 3cd22d8..be27f39 100644
--- a/macros/Text/Compose_Tag.bsh
+++ b/macros/Text/Compose_Tag.bsh
@@ -21,9 +21,6 @@ void composeTag()
     textArea.setCaretPosition(caret + text.length() + 2);
 }
 
-if(buffer.isReadOnly())
-	Macros.error(view, NotEditableMessage);
-else
 	composeTag();
 
 /*
diff --git a/macros/Text/Duplicate_Line.bsh b/macros/Text/Duplicate_Line.bsh
index 962cee4..9c607b6 100644
--- a/macros/Text/Duplicate_Line.bsh
+++ b/macros/Text/Duplicate_Line.bsh
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
  *
- * $Id: Duplicate_Line.bsh 21353 2012-03-14 09:46:51Z jojaba_67 $
+ * $Id: Duplicate_Line.bsh 23971 2015-08-08 19:37:35Z daleanson $
  *
  * Checked for jEdit 4.0 API
  *
@@ -30,16 +30,6 @@ final static String NotEditableMessage = jEdit.getProperty("macro.rs.general.Err
  
 void duplicateLine()
 {
-	/*
-	 * Guard for readonly files becuase Buffer.insert()
-	 * ignores the flag
-	 *
-	 */
-	if(buffer.isReadOnly())
-	{
-		Macros.error(view, NotEditableMessage);
-		return;
-	}
 	line = textArea.getCaretLine();
 	offset = textArea.getLineEndOffset(line);
 	// handle last line differently
diff --git a/macros/Text/Insert_Date.bsh b/macros/Text/Insert_Date.bsh
index 64e3b12..3aa87af 100644
--- a/macros/Text/Insert_Date.bsh
+++ b/macros/Text/Insert_Date.bsh
@@ -19,7 +19,7 @@
  * 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 21353 2012-03-14 09:46:51Z jojaba_67 $
+ * $Id: Insert_Date.bsh 23971 2015-08-08 19:37:35Z daleanson $
  */
 
 // Inserts the current date and Internet Time at the caret position
@@ -60,9 +60,6 @@ void insertDate()
 		+ " @" + (int)swatch + " /" + InternetTimeLabel + "/");
 }
 
-if(buffer.isReadOnly())
-	Macros.error(view, NotEditableMessage);
-else
 	insertDate();
 
 /*
diff --git a/macros/Text/Insert_Tag.bsh b/macros/Text/Insert_Tag.bsh
index d51331d..beaf30b 100644
--- a/macros/Text/Insert_Tag.bsh
+++ b/macros/Text/Insert_Tag.bsh
@@ -20,7 +20,7 @@
  * 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 21353 2012-03-14 09:46:51Z jojaba_67 $
+ * $Id: Insert_Tag.bsh 23971 2015-08-08 19:37:35Z daleanson $
  */
 // Localization
 final static String EnterNameTagLabel = jEdit.getProperty("macro.rs.InsertTag.EnterNameTag.label", "Enter name of tag:");
@@ -75,9 +75,6 @@ void insertTag()
 		textArea.setCaretPosition(caret);
 } 
 
-if(buffer.isReadOnly())
-	Macros.error(view, NotEditableMessage);
-else
 	insertTag();
 
 /*
diff --git a/macros/Text/Reverse_Lines.bsh b/macros/Text/Reverse_Lines.bsh
index 93d621c..1d47491 100644
--- a/macros/Text/Reverse_Lines.bsh
+++ b/macros/Text/Reverse_Lines.bsh
@@ -9,7 +9,7 @@
  * :mode=beanshell:tabSize=4:indentSize=4:maxLineLen=0:noTabs=false:
  * :indentOnTab=true:indentOnEnter=true:folding=explicit:collapseFolds=1:
  *
- * $Id: Reverse_Lines.bsh 21353 2012-03-14 09:46:51Z jojaba_67 $
+ * $Id: Reverse_Lines.bsh 23971 2015-08-08 19:37:35Z daleanson $
  */
 
 // Localization
@@ -80,9 +80,6 @@ void reverseLines(textArea)
 	}
 }
 
-if(buffer.isReadOnly())
-	Macros.error(view, NotEditableMessage);
-else
 	reverseLines(textArea);
 
 /*
diff --git a/misc/clojure/README.txt b/misc/clojure/README.txt
new file mode 100644
index 0000000..49bbd6b
--- /dev/null
+++ b/misc/clojure/README.txt
@@ -0,0 +1,62 @@
+The misc/clojure directory is concerned with verifying modes/clojure.xml.
+
+This is something only of interest to Clojure users who are also jEdit
+maintainers. If you come looking because the clojure.xml file seems out
+of date you might want to check out the jEdit code and use this tool
+to examine the situation and update it as required by some new Clojure release.
+
+When a Clojure version is released, run the tool in misc/clojure and examine
+the resulting tabular results. Make changes to the current modes/clojure.xml.
+Re-run the tool to check your work. Check in the new modes/clojure.xml file
+(and misc/clojure/keywords.csv file as documentation?) as a patch.
+
+misc/clojure/keywords.clj
+
+The Clojure script misc/clojure/keywords.clj checks through all of
+main Clojure namespaces, comparing the symbols therein to the current
+modes/clojure.xml file, then generates a CSV file representing the results.
+
+misc/clojure/run
+
+On a linux system the run shell script will execute the script when called as:
+
+    $ cd misc/clojure
+    $ ./run
+
+This should generate a new misc/clojure/keywords.csv file suitable for loading
+into a spreadsheet program or post-processing or whatever.
+
+The rightmost column in the table is the most important. Symbols that are not
+covered at all are in the rightmost column as '[unknown]'. Some symbols are
+'(ignored)' or '(deprecated)'. Most are marked as one of the jEdit mode
+symbol types (e.g. :KEYWORD1, :LITERAL3, or :OPERATOR). Other columns list
+the containing namespace, symbol name, and the type of the symbol.
+
+Within the misc/clojure/run script is a symbol representing the location
+of the Clojure jar file for your system. Check that and edit as necessary.
+
+runnin in a repl
+
+Use load-file within a repl to execute the misc/clojure/keywords.clj script.
+The script will execute and spew the csv output into your repl.
+
+When running the misc/clojure/keywords.clj file in a repl there is a symbol
+at the top of misc/clojure/keywords.clj representing the location of the
+working jEdit directory. Normally the misc/clojure/run script provides this.
+To load the script directly into a repl the default value in the Clojure script
+must be properly set.
+
+notes
+
+Spewing out a new modes/clojure.xml file from misc/clojure/keywords.csv
+initially seemed like a good idea but later seemed like too much fiddly work.
+Manually editing the modes/clojure.xml file takes some time but should be
+a rare occurence, corresponding to major releases of Clojure.
+
+A full leiningen installation seemed redundant for a tool that only a Clojure
+afficionado will ever use. The result is these hacky instructions. In attempting
+an elegant laziness I perhaps doom future maintainers to editing two files.
+Mea culpa. Feel free to patch in a project.clj file or whatever.
+
+Regarding instructions for Windows, Mac, whatever. Please feel free to add some.
+
diff --git a/misc/clojure/keywords.clj b/misc/clojure/keywords.clj
new file mode 100644
index 0000000..ffcb1da
--- /dev/null
+++ b/misc/clojure/keywords.clj
@@ -0,0 +1,176 @@
+(ns tools.keywords
+  "Generate a table showing Clojure symbols, their characteristics, and how
+   they are referenced in the Clojure mode file clojure.xml.
+   Provides information about current keyword coverage in the mode file and
+   supports manual update and normalization of clojure.xml"
+  (:gen-class)
+  (:require [clojure.xml :as xml]
+            [clojure.zip :as zip])
+  (:import [java.io FileInputStream]
+           [javax.xml.parsers SAXParser SAXParserFactory]))
+
+;;; Point this at your jEdit working directory.
+(def ^:private jedit-dir "/home/marc/Work/jedit")
+
+(def ^:private column-headers
+  "Column headers for output"
+  "namespace,symbol,type,keyword")
+
+(def ^:private namespaces
+  "List of namespaces to be checked for symbols." [
+  'clojure.core
+  'clojure.data
+  'clojure.data.xml
+  'clojure.data.zip.xml
+  'clojure.edn
+  'clojure.inspector
+  'clojure.instant
+  'clojure.java.browse
+  'clojure.java.io
+  'clojure.java.javadoc
+  'clojure.java.shell
+  'clojure.main
+  'clojure.pprint
+  'clojure.reflect
+  'clojure.repl
+  'clojure.set
+  'clojure.stacktrace
+  'clojure.string
+  'clojure.template
+  'clojure.test
+  'clojure.walk
+  'clojure.xml
+  'clojure.zip])
+
+(def ^:private deprecated-keywords
+  "Keywords that are marked as deprecated in documentation."
+  #{"add-classpath"})
+
+(def ^:private ignored-keywords
+  "Keywords that are purposely ignored."
+  #{"*allow-unresolved-vars*" "*assert*"
+    "*fn-loader*" "*math-context*" "*source-path*"
+    "*use-context-classloader*" "*verbose-defrecords*"
+    "await1"
+    "chunk" "chunk-append" "chunk-buffer" "chunk-cons"
+    "chunk-first" "chunk-next" "chunk-rest" "chunked-seq?"
+    "-cache-protocol-fn" "-reset-methods"
+    "coll?"
+    "default-streams-impl"
+    "EMPTY-NODE"
+    "find-protocol-impl" "find-protocol-method"
+    "method-sig"
+    "pop-thread-bindings" "push-thread-bindings"
+    "print-ctor" "print-method" "print-simple"
+    "special-symbol?" "thread-bound?"})
+
+(def ^:private special-forms
+  "Special forms are not values of any namespace, hence this separate list."
+  ["def" "if" "do" "quote" "var"
+   "fn" "loop" "recur" "throw" "try"
+   "." "new" "set"])
+
+(defn- predefined-map
+  "Return merged map of all deprecated and ignorable keywords."
+  []
+  (merge
+    (into {} (map (fn [keywd] [keywd "(deprecated)"]) deprecated-keywords))
+    (into {} (map (fn [keywd] [keywd "(ignored)"])    ignored-keywords))))
+
+(defn- string->keyword
+  "If string begins with a colon convert it to a keyword, otherwise return string."
+  [string]
+  (if (= \: (first string))
+    (keyword nil (apply str (rest string)))
+    string))
+
+(defn- check-special-form
+  [keyword-map sym]
+  (printf "%s,%s,%s,%s%n" "" sym "special" (get keyword-map sym))
+  (get keyword-map sym))
+
+(defn- check-special-forms
+  "Check all special form symbols to see what they are and how they are
+   represented in the specified keyword map."
+  [keyword-map]
+  (map (partial check-special-form keyword-map) special-forms))
+
+(defn- symbol-type
+  "Return a string representing the type of value attached to the specified symbol.
+   Strings include `macro`, `function`, `dynamic`, `earmuff` (for variables
+   named as dynamic symbols but not actually dynamic), and `unknown`."
+  [sym-name sym-var]
+  (let [sym-meta (meta sym-var)
+        sym-val (var-get sym-var)]
+    (cond
+      (:macro sym-meta) "macro"
+      (fn? sym-val) "function"
+      (:dynamic sym-meta) "dynamic"
+      (re-matches #"\*.+\*" sym-name) "earmuff"
+      true "unknown")))
+
+(defn- check-namespace
+  "Check all public symbols in the specified namespace to see what they are
+   and how they are represented in the specified keyword map."
+  [name-space keyword-map]
+  (require name-space)
+  (doseq [sym (sort (keys (ns-publics name-space)))]
+    (let [kstr (str sym)
+          type (symbol-type (name sym) (ns-resolve name-space sym))]
+      ;; TODO: print symbols beginning with equals (=) in some quoted form
+      (printf "%s,%s,%s,%s%n" name-space sym type
+        (or (get keyword-map kstr) "[unknown]")))))
+
+(defn- no-dtd-parser
+  "Build an XML parser that will ignore DTDs."
+  [s ch]
+  (let [factory (SAXParserFactory/newInstance)]
+    (.setFeature factory "http://apache.org/xml/features/nonvalidating/load-external-dtd" false)
+    (let [^SAXParser parser (.newSAXParser factory)]
+      (.parse parser s ch))))
+
+(defn- read-xml
+  "Parse XMl from the file at the specified path."
+  [path]
+  (with-open [file-stream (FileInputStream. path)]
+    (xml/parse file-stream no-dtd-parser)))
+
+(defn- find-keywords
+  "Return list of :KEYWORD entities under the :KEYWORD tag in the XML in
+   the file at the specified path."
+  [path]
+  (loop [loc (zip/xml-zip (read-xml path))]
+    (if (zip/end? loc)
+      nil
+      (let [node (zip/node loc)]
+        (if (= :KEYWORDS (:tag node))
+          (:content node)
+          (recur (zip/next loc)))))))
+
+(defn- xml-keyword-map
+  "Return a map from symbol names to keyword types as specified in the jEdit
+   mode file `clojure.xml`."
+  [path]
+  ;; TODO: look for multiple definitions of same keyword in XML
+  (let [keywords (find-keywords path)]
+    (into (predefined-map)
+      (map (fn [keywd] [(-> keywd :content first) (:tag keywd)]) keywords))))
+
+;;; Not building with leiningen to save complexity in non-Clojure project.
+;;; Therefore the 'program' starts at the top level of the namespace.
+;;; This also supports direct testing when loading the file in a REPL.
+(let [{:keys [jedit] :or {jedit jedit-dir}}
+        (map string->keyword *command-line-args*)
+      keyword-map (xml-keyword-map (str jedit "/modes/clojure.xml"))]
+  (println column-headers)
+  (check-special-forms keyword-map)
+  (doseq [name-space namespaces]
+    (try
+      (check-namespace name-space keyword-map)
+      (catch Exception e
+        (printf "%s,***,error,%s%n" name-space "(not-loaded)"))))
+  ;; TODO: Should be checking for keywords in map but not special or in namespace!
+  ; (doseq [entry keyword-map]
+;   (println ">>>" entry))
+  )
+
diff --git a/misc/clojure/keywords.csv b/misc/clojure/keywords.csv
new file mode 100644
index 0000000..af41819
--- /dev/null
+++ b/misc/clojure/keywords.csv
@@ -0,0 +1,856 @@
+namespace,symbol,type,keyword
+clojure.core,*,function,:OPERATOR
+clojure.core,*',function,:OPERATOR
+clojure.core,*1,dynamic,:KEYWORD4
+clojure.core,*2,dynamic,:KEYWORD4
+clojure.core,*3,dynamic,:KEYWORD4
+clojure.core,*agent*,earmuff,:KEYWORD4
+clojure.core,*allow-unresolved-vars*,earmuff,(ignored)
+clojure.core,*assert*,earmuff,(ignored)
+clojure.core,*clojure-version*,dynamic,:KEYWORD4
+clojure.core,*command-line-args*,earmuff,:KEYWORD4
+clojure.core,*compile-files*,earmuff,:KEYWORD4
+clojure.core,*compile-path*,earmuff,:KEYWORD4
+clojure.core,*compiler-options*,earmuff,:KEYWORD4
+clojure.core,*data-readers*,dynamic,:KEYWORD4
+clojure.core,*default-data-reader-fn*,dynamic,:KEYWORD4
+clojure.core,*e,dynamic,:KEYWORD4
+clojure.core,*err*,earmuff,:KEYWORD4
+clojure.core,*file*,earmuff,:KEYWORD4
+clojure.core,*flush-on-newline*,earmuff,:KEYWORD4
+clojure.core,*fn-loader*,earmuff,(ignored)
+clojure.core,*in*,earmuff,:KEYWORD4
+clojure.core,*math-context*,earmuff,(ignored)
+clojure.core,*ns*,earmuff,:KEYWORD4
+clojure.core,*out*,earmuff,:KEYWORD4
+clojure.core,*print-dup*,earmuff,:KEYWORD4
+clojure.core,*print-length*,dynamic,:KEYWORD4
+clojure.core,*print-level*,dynamic,:KEYWORD4
+clojure.core,*print-meta*,earmuff,:KEYWORD4
+clojure.core,*print-readably*,earmuff,:KEYWORD4
+clojure.core,*read-eval*,earmuff,:KEYWORD4
+clojure.core,*source-path*,earmuff,(ignored)
+clojure.core,*unchecked-math*,earmuff,:KEYWORD4
+clojure.core,*use-context-classloader*,earmuff,(ignored)
+clojure.core,*verbose-defrecords*,dynamic,(ignored)
+clojure.core,*warn-on-reflection*,earmuff,:KEYWORD4
+clojure.core,+,function,:OPERATOR
+clojure.core,+',function,:OPERATOR
+clojure.core,-,function,:OPERATOR
+clojure.core,-',function,:OPERATOR
+clojure.core,->,macro,:OPERATOR
+clojure.core,->>,macro,:OPERATOR
+clojure.core,->ArrayChunk,function,[unknown]
+clojure.core,->Vec,function,[unknown]
+clojure.core,->VecNode,function,[unknown]
+clojure.core,->VecSeq,function,[unknown]
+clojure.core,-cache-protocol-fn,function,(ignored)
+clojure.core,-reset-methods,function,(ignored)
+clojure.core,..,macro,:KEYWORD3
+clojure.core,/,function,:OPERATOR
+clojure.core,<,function,:OPERATOR
+clojure.core,<=,function,:OPERATOR
+clojure.core,=,function,:OPERATOR
+clojure.core,==,function,:OPERATOR
+clojure.core,>,function,:OPERATOR
+clojure.core,>=,function,:OPERATOR
+clojure.core,EMPTY-NODE,unknown,(ignored)
+clojure.core,accessor,function,:KEYWORD3
+clojure.core,aclone,function,:KEYWORD3
+clojure.core,add-classpath,function,(deprecated)
+clojure.core,add-watch,function,:KEYWORD3
+clojure.core,agent,function,:KEYWORD3
+clojure.core,agent-error,function,:KEYWORD3
+clojure.core,agent-errors,function,:KEYWORD3
+clojure.core,aget,function,:KEYWORD3
+clojure.core,alength,function,:KEYWORD3
+clojure.core,alias,function,:KEYWORD1
+clojure.core,all-ns,function,:KEYWORD1
+clojure.core,alter,function,:KEYWORD3
+clojure.core,alter-meta!,function,:KEYWORD3
+clojure.core,alter-var-root,function,:KEYWORD3
+clojure.core,amap,macro,:KEYWORD3
+clojure.core,ancestors,function,:KEYWORD3
+clojure.core,and,macro,:OPERATOR
+clojure.core,apply,function,:KEYWORD3
+clojure.core,areduce,macro,:KEYWORD3
+clojure.core,array-map,function,:KEYWORD3
+clojure.core,as->,macro,:OPERATOR
+clojure.core,aset,function,:KEYWORD3
+clojure.core,aset-boolean,function,:KEYWORD3
+clojure.core,aset-byte,function,:KEYWORD3
+clojure.core,aset-char,function,:KEYWORD3
+clojure.core,aset-double,function,:KEYWORD3
+clojure.core,aset-float,function,:KEYWORD3
+clojure.core,aset-int,function,:KEYWORD3
+clojure.core,aset-long,function,:KEYWORD3
+clojure.core,aset-short,function,:KEYWORD3
+clojure.core,assert,macro,:KEYWORD1
+clojure.core,assoc,function,:KEYWORD3
+clojure.core,assoc!,function,:KEYWORD3
+clojure.core,assoc-in,function,:KEYWORD3
+clojure.core,associative?,function,:LITERAL3
+clojure.core,atom,function,:KEYWORD3
+clojure.core,await,function,:KEYWORD3
+clojure.core,await-for,function,:KEYWORD3
+clojure.core,await1,function,(ignored)
+clojure.core,bases,function,:KEYWORD3
+clojure.core,bean,function,:KEYWORD3
+clojure.core,bigdec,function,:KEYWORD3
+clojure.core,bigint,function,:KEYWORD3
+clojure.core,biginteger,function,:KEYWORD3
+clojure.core,binding,macro,:KEYWORD1
+clojure.core,bit-and,function,:OPERATOR
+clojure.core,bit-and-not,function,:OPERATOR
+clojure.core,bit-clear,function,:OPERATOR
+clojure.core,bit-flip,function,:OPERATOR
+clojure.core,bit-not,function,:OPERATOR
+clojure.core,bit-or,function,:OPERATOR
+clojure.core,bit-set,function,:OPERATOR
+clojure.core,bit-shift-left,function,:OPERATOR
+clojure.core,bit-shift-right,function,:OPERATOR
+clojure.core,bit-test,function,:OPERATOR
+clojure.core,bit-xor,function,:OPERATOR
+clojure.core,boolean,function,:KEYWORD3
+clojure.core,boolean-array,function,:KEYWORD3
+clojure.core,booleans,function,:KEYWORD3
+clojure.core,bound-fn,macro,:KEYWORD1
+clojure.core,bound-fn*,function,:KEYWORD1
+clojure.core,bound?,function,:LITERAL3
+clojure.core,butlast,function,:KEYWORD3
+clojure.core,byte,function,:KEYWORD3
+clojure.core,byte-array,function,:KEYWORD3
+clojure.core,bytes,function,:KEYWORD3
+clojure.core,case,macro,:KEYWORD2
+clojure.core,cast,function,:KEYWORD3
+clojure.core,char,function,:KEYWORD3
+clojure.core,char-array,function,:KEYWORD3
+clojure.core,char-escape-string,unknown,:KEYWORD3
+clojure.core,char-name-string,unknown,:KEYWORD3
+clojure.core,char?,function,:LITERAL3
+clojure.core,chars,function,:KEYWORD3
+clojure.core,chunk,function,(ignored)
+clojure.core,chunk-append,function,(ignored)
+clojure.core,chunk-buffer,function,(ignored)
+clojure.core,chunk-cons,function,(ignored)
+clojure.core,chunk-first,function,(ignored)
+clojure.core,chunk-next,function,(ignored)
+clojure.core,chunk-rest,function,(ignored)
+clojure.core,chunked-seq?,function,(ignored)
+clojure.core,class,function,:KEYWORD3
+clojure.core,class?,function,:LITERAL3
+clojure.core,clear-agent-errors,function,:KEYWORD3
+clojure.core,clojure-version,function,:KEYWORD3
+clojure.core,coll?,function,(ignored)
+clojure.core,comment,macro,:KEYWORD1
+clojure.core,commute,function,:KEYWORD3
+clojure.core,comp,function,:KEYWORD3
+clojure.core,comparator,function,:KEYWORD3
+clojure.core,compare,function,:KEYWORD3
+clojure.core,compare-and-set!,function,:KEYWORD3
+clojure.core,compile,function,:KEYWORD1
+clojure.core,complement,function,:KEYWORD3
+clojure.core,concat,function,:KEYWORD3
+clojure.core,cond,macro,:KEYWORD2
+clojure.core,cond->,macro,:KEYWORD2
+clojure.core,cond->>,macro,:KEYWORD2
+clojure.core,condp,macro,:KEYWORD2
+clojure.core,conj,function,:KEYWORD3
+clojure.core,conj!,function,:KEYWORD3
+clojure.core,cons,function,:KEYWORD3
+clojure.core,constantly,function,:KEYWORD3
+clojure.core,construct-proxy,function,:KEYWORD3
+clojure.core,contains?,function,:LITERAL3
+clojure.core,count,function,:KEYWORD3
+clojure.core,counted?,function,:LITERAL3
+clojure.core,create-ns,function,:KEYWORD1
+clojure.core,create-struct,function,:KEYWORD3
+clojure.core,cycle,function,:KEYWORD3
+clojure.core,dec,function,:OPERATOR
+clojure.core,dec',function,:OPERATOR
+clojure.core,decimal?,function,:LITERAL3
+clojure.core,declare,macro,:KEYWORD1
+clojure.core,default-data-readers,unknown,:KEYWORD3
+clojure.core,definline,macro,:KEYWORD1
+clojure.core,definterface,macro,:KEYWORD1
+clojure.core,defmacro,macro,:KEYWORD1
+clojure.core,defmethod,macro,:KEYWORD1
+clojure.core,defmulti,macro,:KEYWORD1
+clojure.core,defn,macro,:KEYWORD1
+clojure.core,defn-,macro,:KEYWORD1
+clojure.core,defonce,macro,:KEYWORD1
+clojure.core,defprotocol,macro,:KEYWORD1
+clojure.core,defrecord,macro,:KEYWORD1
+clojure.core,defstruct,macro,:KEYWORD1
+clojure.core,deftype,macro,:KEYWORD1
+clojure.core,delay,macro,:KEYWORD3
+clojure.core,delay?,function,:LITERAL3
+clojure.core,deliver,function,:KEYWORD3
+clojure.core,denominator,function,:KEYWORD3
+clojure.core,deref,function,:KEYWORD3
+clojure.core,derive,function,:KEYWORD3
+clojure.core,descendants,function,:KEYWORD3
+clojure.core,destructure,function,:KEYWORD2
+clojure.core,disj,function,:KEYWORD3
+clojure.core,disj!,function,:KEYWORD3
+clojure.core,dissoc,function,:KEYWORD3
+clojure.core,dissoc!,function,:KEYWORD3
+clojure.core,distinct,function,:KEYWORD3
+clojure.core,distinct?,function,:LITERAL3
+clojure.core,doall,function,:KEYWORD2
+clojure.core,dorun,function,:KEYWORD2
+clojure.core,doseq,macro,:KEYWORD2
+clojure.core,dosync,macro,:KEYWORD2
+clojure.core,dotimes,macro,:KEYWORD2
+clojure.core,doto,macro,:KEYWORD2
+clojure.core,double,function,:KEYWORD3
+clojure.core,double-array,function,:KEYWORD3
+clojure.core,doubles,function,:KEYWORD3
+clojure.core,drop,function,:KEYWORD3
+clojure.core,drop-last,function,:KEYWORD3
+clojure.core,drop-while,function,:KEYWORD3
+clojure.core,empty,function,:KEYWORD3
+clojure.core,empty?,function,:LITERAL3
+clojure.core,ensure,function,:KEYWORD3
+clojure.core,enumeration-seq,function,:KEYWORD3
+clojure.core,error-handler,function,:KEYWORD3
+clojure.core,error-mode,function,:KEYWORD3
+clojure.core,eval,function,:KEYWORD3
+clojure.core,even?,function,:LITERAL3
+clojure.core,every-pred,function,:KEYWORD3
+clojure.core,every?,function,:LITERAL3
+clojure.core,ex-data,function,:KEYWORD3
+clojure.core,ex-info,function,:KEYWORD3
+clojure.core,extend,function,:KEYWORD1
+clojure.core,extend-protocol,macro,:KEYWORD1
+clojure.core,extend-type,macro,:KEYWORD1
+clojure.core,extenders,function,:KEYWORD1
+clojure.core,extends?,function,:LITERAL3
+clojure.core,false?,function,:LITERAL3
+clojure.core,ffirst,function,:KEYWORD3
+clojure.core,file-seq,function,:KEYWORD3
+clojure.core,filter,function,:KEYWORD3
+clojure.core,filterv,function,:KEYWORD3
+clojure.core,find,function,:KEYWORD3
+clojure.core,find-keyword,function,:KEYWORD1
+clojure.core,find-ns,function,:KEYWORD1
+clojure.core,find-protocol-impl,function,(ignored)
+clojure.core,find-protocol-method,function,(ignored)
+clojure.core,find-var,function,:KEYWORD3
+clojure.core,first,function,:KEYWORD3
+clojure.core,flatten,function,:KEYWORD3
+clojure.core,float,function,:KEYWORD3
+clojure.core,float-array,function,:KEYWORD3
+clojure.core,float?,function,:LITERAL3
+clojure.core,floats,function,:KEYWORD3
+clojure.core,flush,function,:KEYWORD3
+clojure.core,fn,macro,:KEYWORD1
+clojure.core,fn?,function,:LITERAL3
+clojure.core,fnext,function,:KEYWORD3
+clojure.core,fnil,function,:KEYWORD3
+clojure.core,for,macro,:KEYWORD2
+clojure.core,force,function,:KEYWORD3
+clojure.core,format,function,:KEYWORD3
+clojure.core,frequencies,function,:KEYWORD3
+clojure.core,future,macro,:KEYWORD3
+clojure.core,future-call,function,:KEYWORD3
+clojure.core,future-cancel,function,:KEYWORD3
+clojure.core,future-cancelled?,function,:LITERAL3
+clojure.core,future-done?,function,:LITERAL3
+clojure.core,future?,function,:LITERAL3
+clojure.core,gen-class,macro,:KEYWORD1
+clojure.core,gen-interface,macro,:KEYWORD1
+clojure.core,gensym,function,:KEYWORD3
+clojure.core,get,function,:KEYWORD3
+clojure.core,get-in,function,:KEYWORD3
+clojure.core,get-method,function,:KEYWORD1
+clojure.core,get-proxy-class,function,:KEYWORD3
+clojure.core,get-thread-bindings,function,:KEYWORD3
+clojure.core,get-validator,function,:KEYWORD3
+clojure.core,group-by,function,:KEYWORD3
+clojure.core,hash,function,:KEYWORD3
+clojure.core,hash-combine,function,:KEYWORD3
+clojure.core,hash-map,function,:KEYWORD3
+clojure.core,hash-ordered-coll,function,:KEYWORD3
+clojure.core,hash-set,function,:KEYWORD3
+clojure.core,hash-unordered-coll,function,:KEYWORD3
+clojure.core,identical?,function,:LITERAL3
+clojure.core,identity,function,:KEYWORD3
+clojure.core,if-let,macro,:KEYWORD2
+clojure.core,if-not,macro,:KEYWORD2
+clojure.core,if-some,macro,:KEYWORD2
+clojure.core,ifn?,function,:LITERAL3
+clojure.core,import,macro,:KEYWORD1
+clojure.core,in-ns,unknown,:KEYWORD1
+clojure.core,inc,function,:OPERATOR
+clojure.core,inc',function,:OPERATOR
+clojure.core,init-proxy,function,:KEYWORD3
+clojure.core,instance?,function,:LITERAL3
+clojure.core,int,function,:KEYWORD3
+clojure.core,int-array,function,:KEYWORD3
+clojure.core,integer?,function,:LITERAL3
+clojure.core,interleave,function,:KEYWORD3
+clojure.core,intern,function,:KEYWORD1
+clojure.core,interpose,function,:KEYWORD3
+clojure.core,into,function,:KEYWORD3
+clojure.core,into-array,function,:KEYWORD3
+clojure.core,ints,function,:KEYWORD3
+clojure.core,io!,macro,:KEYWORD3
+clojure.core,isa?,function,:LITERAL3
+clojure.core,iterate,function,:KEYWORD3
+clojure.core,iterator-seq,function,:KEYWORD3
+clojure.core,juxt,function,:KEYWORD3
+clojure.core,keep,function,:KEYWORD3
+clojure.core,keep-indexed,function,:KEYWORD3
+clojure.core,key,function,:KEYWORD3
+clojure.core,keys,function,:KEYWORD3
+clojure.core,keyword,function,:KEYWORD3
+clojure.core,keyword?,function,:LITERAL3
+clojure.core,last,function,:KEYWORD3
+clojure.core,lazy-cat,macro,:KEYWORD3
+clojure.core,lazy-seq,macro,:KEYWORD3
+clojure.core,let,macro,:KEYWORD2
+clojure.core,letfn,macro,:KEYWORD2
+clojure.core,line-seq,function,:KEYWORD3
+clojure.core,list,function,:KEYWORD3
+clojure.core,list*,function,:KEYWORD3
+clojure.core,list?,function,:LITERAL3
+clojure.core,load,function,:KEYWORD3
+clojure.core,load-file,unknown,:KEYWORD3
+clojure.core,load-reader,function,:KEYWORD3
+clojure.core,load-string,function,:KEYWORD3
+clojure.core,loaded-libs,function,:KEYWORD1
+clojure.core,locking,macro,:KEYWORD3
+clojure.core,long,function,:KEYWORD3
+clojure.core,long-array,function,:KEYWORD3
+clojure.core,longs,function,:KEYWORD3
+clojure.core,loop,macro,:KEYWORD2
+clojure.core,macroexpand,function,:KEYWORD3
+clojure.core,macroexpand-1,function,:KEYWORD3
+clojure.core,make-array,function,:KEYWORD3
+clojure.core,make-hierarchy,function,:KEYWORD3
+clojure.core,map,function,:KEYWORD3
+clojure.core,map-indexed,function,:KEYWORD3
+clojure.core,map?,function,:LITERAL3
+clojure.core,mapcat,function,:KEYWORD3
+clojure.core,mapv,function,:KEYWORD3
+clojure.core,max,function,:KEYWORD3
+clojure.core,max-key,function,:KEYWORD3
+clojure.core,memfn,macro,:KEYWORD3
+clojure.core,memoize,function,:KEYWORD3
+clojure.core,merge,function,:KEYWORD3
+clojure.core,merge-with,function,:KEYWORD3
+clojure.core,meta,function,:KEYWORD3
+clojure.core,method-sig,function,(ignored)
+clojure.core,methods,function,:KEYWORD1
+clojure.core,min,function,:KEYWORD3
+clojure.core,min-key,function,:KEYWORD3
+clojure.core,mix-collection-hash,function,:KEYWORD3
+clojure.core,mod,function,:OPERATOR
+clojure.core,munge,function,:KEYWORD3
+clojure.core,name,function,:KEYWORD3
+clojure.core,namespace,function,:KEYWORD3
+clojure.core,namespace-munge,function,:KEYWORD3
+clojure.core,neg?,function,:LITERAL3
+clojure.core,newline,function,:KEYWORD3
+clojure.core,next,function,:FUNCTION
+clojure.core,nfirst,function,:KEYWORD3
+clojure.core,nil?,function,:LITERAL3
+clojure.core,nnext,function,:KEYWORD3
+clojure.core,not,function,:OPERATOR
+clojure.core,not-any?,function,:LITERAL3
+clojure.core,not-empty,function,:LITERAL3
+clojure.core,not-every?,function,:LITERAL3
+clojure.core,not=,function,:OPERATOR
+clojure.core,ns,macro,:KEYWORD1
+clojure.core,ns-aliases,function,:KEYWORD1
+clojure.core,ns-imports,function,:KEYWORD1
+clojure.core,ns-interns,function,:KEYWORD1
+clojure.core,ns-map,function,:KEYWORD1
+clojure.core,ns-name,function,:KEYWORD1
+clojure.core,ns-publics,function,:KEYWORD1
+clojure.core,ns-refers,function,:KEYWORD1
+clojure.core,ns-resolve,function,:KEYWORD1
+clojure.core,ns-unalias,function,:KEYWORD1
+clojure.core,ns-unmap,function,:KEYWORD1
+clojure.core,nth,function,:KEYWORD3
+clojure.core,nthnext,function,:KEYWORD3
+clojure.core,nthrest,function,:KEYWORD3
+clojure.core,num,function,:KEYWORD3
+clojure.core,number?,function,:LITERAL3
+clojure.core,numerator,function,:KEYWORD3
+clojure.core,object-array,function,:KEYWORD3
+clojure.core,odd?,function,:LITERAL3
+clojure.core,or,macro,:OPERATOR
+clojure.core,parents,function,:KEYWORD3
+clojure.core,partial,function,:KEYWORD1
+clojure.core,partition,function,:KEYWORD3
+clojure.core,partition-all,function,:KEYWORD3
+clojure.core,partition-by,function,:KEYWORD3
+clojure.core,pcalls,function,:KEYWORD3
+clojure.core,peek,function,:KEYWORD3
+clojure.core,persistent!,function,:KEYWORD3
+clojure.core,pmap,function,:KEYWORD3
+clojure.core,pop,function,:KEYWORD3
+clojure.core,pop!,function,:KEYWORD3
+clojure.core,pop-thread-bindings,function,(ignored)
+clojure.core,pos?,function,:LITERAL3
+clojure.core,pr,function,:KEYWORD3
+clojure.core,pr-str,function,:KEYWORD3
+clojure.core,prefer-method,function,:KEYWORD1
+clojure.core,prefers,function,:KEYWORD1
+clojure.core,primitives-classnames,unknown,:KEYWORD3
+clojure.core,print,function,:KEYWORD3
+clojure.core,print-ctor,function,(ignored)
+clojure.core,print-dup,unknown,:KEYWORD3
+clojure.core,print-method,unknown,(ignored)
+clojure.core,print-simple,function,(ignored)
+clojure.core,print-str,function,:KEYWORD3
+clojure.core,printf,function,:KEYWORD3
+clojure.core,println,function,:KEYWORD3
+clojure.core,println-str,function,:KEYWORD3
+clojure.core,prn,function,:KEYWORD3
+clojure.core,prn-str,function,:KEYWORD3
+clojure.core,promise,function,:KEYWORD3
+clojure.core,proxy,macro,:KEYWORD3
+clojure.core,proxy-call-with-super,function,:KEYWORD3
+clojure.core,proxy-mappings,function,:KEYWORD3
+clojure.core,proxy-name,function,:KEYWORD3
+clojure.core,proxy-super,macro,:KEYWORD3
+clojure.core,push-thread-bindings,function,(ignored)
+clojure.core,pvalues,macro,:KEYWORD3
+clojure.core,quot,function,:LITERAL3
+clojure.core,rand,function,:KEYWORD3
+clojure.core,rand-int,function,:KEYWORD3
+clojure.core,rand-nth,function,:KEYWORD3
+clojure.core,range,function,:KEYWORD3
+clojure.core,ratio?,function,:LITERAL3
+clojure.core,rational?,function,:LITERAL3
+clojure.core,rationalize,function,:KEYWORD3
+clojure.core,re-find,function,:KEYWORD3
+clojure.core,re-groups,function,:KEYWORD3
+clojure.core,re-matcher,function,:KEYWORD3
+clojure.core,re-matches,function,:KEYWORD3
+clojure.core,re-pattern,function,:KEYWORD3
+clojure.core,re-seq,function,:KEYWORD3
+clojure.core,read,function,:KEYWORD3
+clojure.core,read-line,function,:KEYWORD3
+clojure.core,read-string,function,:KEYWORD3
+clojure.core,realized?,function,:LITERAL3
+clojure.core,record?,function,:LITERAL3
+clojure.core,reduce,function,:KEYWORD3
+clojure.core,reduce-kv,function,:KEYWORD3
+clojure.core,reduced,function,:KEYWORD3
+clojure.core,reduced?,function,:LITERAL3
+clojure.core,reductions,function,:KEYWORD3
+clojure.core,ref,function,:KEYWORD3
+clojure.core,ref-history-count,function,:KEYWORD3
+clojure.core,ref-max-history,function,:KEYWORD3
+clojure.core,ref-min-history,function,:KEYWORD3
+clojure.core,ref-set,function,:KEYWORD3
+clojure.core,refer,function,:KEYWORD1
+clojure.core,refer-clojure,macro,:KEYWORD1
+clojure.core,reify,macro,:KEYWORD1
+clojure.core,release-pending-sends,function,:KEYWORD3
+clojure.core,rem,function,:OPERATOR
+clojure.core,remove,function,:FUNCTION
+clojure.core,remove-all-methods,function,:KEYWORD1
+clojure.core,remove-method,function,:KEYWORD1
+clojure.core,remove-ns,function,:KEYWORD1
+clojure.core,remove-watch,function,:KEYWORD3
+clojure.core,repeat,function,:KEYWORD3
+clojure.core,repeatedly,function,:KEYWORD3
+clojure.core,replace,function,:FUNCTION
+clojure.core,replicate,function,:KEYWORD3
+clojure.core,require,function,:KEYWORD1
+clojure.core,reset!,function,:KEYWORD3
+clojure.core,reset-meta!,function,:KEYWORD3
+clojure.core,resolve,function,:KEYWORD3
+clojure.core,rest,function,:KEYWORD3
+clojure.core,restart-agent,function,:KEYWORD3
+clojure.core,resultset-seq,function,:KEYWORD3
+clojure.core,reverse,function,:KEYWORD3
+clojure.core,reversible?,function,:LITERAL3
+clojure.core,rseq,function,:KEYWORD3
+clojure.core,rsubseq,function,:KEYWORD3
+clojure.core,satisfies?,function,:LITERAL3
+clojure.core,second,function,:KEYWORD3
+clojure.core,select-keys,function,:KEYWORD3
+clojure.core,send,function,:KEYWORD3
+clojure.core,send-off,function,:KEYWORD3
+clojure.core,send-via,function,:KEYWORD3
+clojure.core,seq,function,:KEYWORD3
+clojure.core,seq?,function,:LITERAL3
+clojure.core,seque,function,:KEYWORD3
+clojure.core,sequence,function,:KEYWORD3
+clojure.core,sequential?,function,:LITERAL3
+clojure.core,set,function,:KEYWORD3
+clojure.core,set-agent-send-executor!,function,:KEYWORD3
+clojure.core,set-agent-send-off-executor!,function,:KEYWORD3
+clojure.core,set-error-handler!,function,:KEYWORD3
+clojure.core,set-error-mode!,function,:KEYWORD3
+clojure.core,set-validator!,function,:KEYWORD3
+clojure.core,set?,function,:LITERAL3
+clojure.core,short,function,:KEYWORD3
+clojure.core,short-array,function,:KEYWORD3
+clojure.core,shorts,function,:KEYWORD3
+clojure.core,shuffle,function,:KEYWORD3
+clojure.core,shutdown-agents,function,:KEYWORD3
+clojure.core,slurp,function,:KEYWORD3
+clojure.core,some,function,:KEYWORD3
+clojure.core,some->,macro,:KEYWORD3
+clojure.core,some->>,macro,:KEYWORD3
+clojure.core,some-fn,function,:KEYWORD3
+clojure.core,some?,function,:LITERAL3
+clojure.core,sort,function,:KEYWORD3
+clojure.core,sort-by,function,:KEYWORD3
+clojure.core,sorted-map,function,:KEYWORD3
+clojure.core,sorted-map-by,function,:KEYWORD3
+clojure.core,sorted-set,function,:KEYWORD3
+clojure.core,sorted-set-by,function,:KEYWORD3
+clojure.core,sorted?,function,:LITERAL3
+clojure.core,special-symbol?,function,(ignored)
+clojure.core,spit,function,:KEYWORD3
+clojure.core,split-at,function,:KEYWORD3
+clojure.core,split-with,function,:KEYWORD3
+clojure.core,str,function,:KEYWORD3
+clojure.core,string?,function,:LITERAL3
+clojure.core,struct,function,:KEYWORD3
+clojure.core,struct-map,function,:KEYWORD3
+clojure.core,subs,function,:KEYWORD3
+clojure.core,subseq,function,:KEYWORD3
+clojure.core,subvec,function,:KEYWORD3
+clojure.core,supers,function,:KEYWORD3
+clojure.core,swap!,function,:KEYWORD3
+clojure.core,symbol,function,:KEYWORD3
+clojure.core,symbol?,function,:LITERAL3
+clojure.core,sync,macro,:KEYWORD2
+clojure.core,take,function,:KEYWORD3
+clojure.core,take-last,function,:KEYWORD3
+clojure.core,take-nth,function,:KEYWORD3
+clojure.core,take-while,function,:KEYWORD3
+clojure.core,test,function,:KEYWORD3
+clojure.core,the-ns,function,:KEYWORD1
+clojure.core,thread-bound?,function,(ignored)
+clojure.core,time,macro,:KEYWORD3
+clojure.core,to-array,function,:KEYWORD3
+clojure.core,to-array-2d,function,:KEYWORD3
+clojure.core,trampoline,function,:KEYWORD2
+clojure.core,transient,function,:KEYWORD3
+clojure.core,tree-seq,function,:KEYWORD3
+clojure.core,true?,function,:LITERAL3
+clojure.core,type,function,:KEYWORD3
+clojure.core,unchecked-add,function,:FUNCTION
+clojure.core,unchecked-add-int,function,:FUNCTION
+clojure.core,unchecked-byte,function,:FUNCTION
+clojure.core,unchecked-char,function,:FUNCTION
+clojure.core,unchecked-dec,function,:FUNCTION
+clojure.core,unchecked-dec-int,function,:FUNCTION
+clojure.core,unchecked-divide-int,function,:FUNCTION
+clojure.core,unchecked-double,function,:FUNCTION
+clojure.core,unchecked-float,function,:FUNCTION
+clojure.core,unchecked-inc,function,:FUNCTION
+clojure.core,unchecked-inc-int,function,:FUNCTION
+clojure.core,unchecked-int,function,:FUNCTION
+clojure.core,unchecked-long,function,:FUNCTION
+clojure.core,unchecked-multiply,function,:FUNCTION
+clojure.core,unchecked-multiply-int,function,[unknown]
+clojure.core,unchecked-negate,function,:FUNCTION
+clojure.core,unchecked-negate-int,function,:FUNCTION
+clojure.core,unchecked-remainder-int,function,:FUNCTION
+clojure.core,unchecked-short,function,:FUNCTION
+clojure.core,unchecked-subtract,function,:FUNCTION
+clojure.core,unchecked-subtract-int,function,:FUNCTION
+clojure.core,underive,function,:KEYWORD3
+clojure.core,unquote,unknown,:KEYWORD3
+clojure.core,unquote-splicing,unknown,:KEYWORD3
+clojure.core,unsigned-bit-shift-right,function,:FUNCTION
+clojure.core,update-in,function,:KEYWORD3
+clojure.core,update-proxy,function,:KEYWORD3
+clojure.core,use,function,:KEYWORD1
+clojure.core,val,function,:KEYWORD3
+clojure.core,vals,function,:KEYWORD3
+clojure.core,var-get,function,:KEYWORD3
+clojure.core,var-set,function,:KEYWORD3
+clojure.core,var?,function,:LITERAL3
+clojure.core,vary-meta,function,:KEYWORD3
+clojure.core,vec,function,:KEYWORD3
+clojure.core,vector,function,:KEYWORD3
+clojure.core,vector-of,function,:KEYWORD3
+clojure.core,vector?,function,:LITERAL3
+clojure.core,when,macro,:KEYWORD2
+clojure.core,when-first,macro,:KEYWORD2
+clojure.core,when-let,macro,:KEYWORD2
+clojure.core,when-not,macro,:KEYWORD2
+clojure.core,when-some,macro,:KEYWORD2
+clojure.core,while,macro,:KEYWORD2
+clojure.core,with-bindings,macro,:KEYWORD3
+clojure.core,with-bindings*,function,:KEYWORD3
+clojure.core,with-in-str,macro,:KEYWORD3
+clojure.core,with-loading-context,macro,:KEYWORD3
+clojure.core,with-local-vars,macro,:KEYWORD3
+clojure.core,with-meta,function,:KEYWORD3
+clojure.core,with-open,macro,:KEYWORD3
+clojure.core,with-out-str,macro,:KEYWORD3
+clojure.core,with-precision,macro,:KEYWORD3
+clojure.core,with-redefs,macro,:KEYWORD3
+clojure.core,with-redefs-fn,function,:KEYWORD3
+clojure.core,xml-seq,function,:KEYWORD3
+clojure.core,zero?,function,:LITERAL3
+clojure.core,zipmap,function,:KEYWORD3
+clojure.data,Diff,unknown,[unknown]
+clojure.data,EqualityPartition,unknown,[unknown]
+clojure.data,diff,function,:FUNCTION
+clojure.data,diff-similar,function,:FUNCTION
+clojure.data,equality-partition,function,[unknown]
+clojure.data.xml,***,error,(not-loaded)
+clojure.data.zip.xml,***,error,(not-loaded)
+clojure.edn,read,function,:KEYWORD3
+clojure.edn,read-string,function,:KEYWORD3
+clojure.inspector,atom?,function,:LITERAL3
+clojure.inspector,collection-tag,function,[unknown]
+clojure.inspector,get-child,unknown,[unknown]
+clojure.inspector,get-child-count,unknown,[unknown]
+clojure.inspector,inspect,function,[unknown]
+clojure.inspector,inspect-table,function,[unknown]
+clojure.inspector,inspect-tree,function,[unknown]
+clojure.inspector,is-leaf,unknown,[unknown]
+clojure.inspector,list-model,function,[unknown]
+clojure.inspector,list-provider,unknown,[unknown]
+clojure.inspector,old-table-model,function,[unknown]
+clojure.inspector,table-model,unknown,[unknown]
+clojure.inspector,tree-model,function,[unknown]
+clojure.instant,parse-timestamp,function,:FUNCTION
+clojure.instant,read-instant-calendar,function,:FUNCTION
+clojure.instant,read-instant-date,function,:FUNCTION
+clojure.instant,read-instant-timestamp,function,:FUNCTION
+clojure.instant,validated,function,:FUNCTION
+clojure.java.browse,*open-url-script*,dynamic,:KEYWORD4
+clojure.java.browse,browse-url,function,:FUNCTION
+clojure.java.io,Coercions,unknown,[unknown]
+clojure.java.io,IOFactory,unknown,[unknown]
+clojure.java.io,as-file,function,:FUNCTION
+clojure.java.io,as-relative-path,function,:FUNCTION
+clojure.java.io,as-url,function,:FUNCTION
+clojure.java.io,copy,function,:FUNCTION
+clojure.java.io,default-streams-impl,unknown,(ignored)
+clojure.java.io,delete-file,function,:FUNCTION
+clojure.java.io,file,function,:FUNCTION
+clojure.java.io,input-stream,function,:FUNCTION
+clojure.java.io,make-input-stream,function,:FUNCTION
+clojure.java.io,make-output-stream,function,:FUNCTION
+clojure.java.io,make-parents,function,:FUNCTION
+clojure.java.io,make-reader,function,:FUNCTION
+clojure.java.io,make-writer,function,:FUNCTION
+clojure.java.io,output-stream,function,:FUNCTION
+clojure.java.io,reader,function,:FUNCTION
+clojure.java.io,resource,function,:FUNCTION
+clojure.java.io,writer,function,:FUNCTION
+clojure.java.javadoc,*core-java-api*,dynamic,[unknown]
+clojure.java.javadoc,*feeling-lucky*,dynamic,[unknown]
+clojure.java.javadoc,*feeling-lucky-url*,dynamic,[unknown]
+clojure.java.javadoc,*local-javadocs*,dynamic,[unknown]
+clojure.java.javadoc,*remote-javadocs*,dynamic,[unknown]
+clojure.java.javadoc,add-local-javadoc,function,[unknown]
+clojure.java.javadoc,add-remote-javadoc,function,[unknown]
+clojure.java.javadoc,javadoc,function,[unknown]
+clojure.java.shell,*sh-dir*,dynamic,[unknown]
+clojure.java.shell,*sh-env*,dynamic,[unknown]
+clojure.java.shell,sh,function,[unknown]
+clojure.java.shell,with-sh-dir,macro,[unknown]
+clojure.java.shell,with-sh-env,macro,[unknown]
+clojure.main,demunge,function,[unknown]
+clojure.main,load-script,function,[unknown]
+clojure.main,main,function,[unknown]
+clojure.main,repl,function,[unknown]
+clojure.main,repl-caught,function,[unknown]
+clojure.main,repl-exception,function,[unknown]
+clojure.main,repl-prompt,function,[unknown]
+clojure.main,repl-read,function,[unknown]
+clojure.main,repl-requires,unknown,[unknown]
+clojure.main,root-cause,function,:FUNCTION
+clojure.main,skip-if-eol,function,[unknown]
+clojure.main,skip-whitespace,function,[unknown]
+clojure.main,stack-element-str,function,[unknown]
+clojure.main,with-bindings,macro,:KEYWORD3
+clojure.main,with-read-known,macro,[unknown]
+clojure.pprint,*print-base*,dynamic,:KEYWORD4
+clojure.pprint,*print-miser-width*,dynamic,:KEYWORD4
+clojure.pprint,*print-pprint-dispatch*,dynamic,:KEYWORD4
+clojure.pprint,*print-pretty*,dynamic,:KEYWORD4
+clojure.pprint,*print-radix*,dynamic,:KEYWORD4
+clojure.pprint,*print-right-margin*,dynamic,:KEYWORD4
+clojure.pprint,*print-suppress-namespaces*,dynamic,:KEYWORD4
+clojure.pprint,cl-format,function,:FUNCTION
+clojure.pprint,code-dispatch,unknown,:FUNCTION
+clojure.pprint,formatter,macro,:FUNCTION
+clojure.pprint,formatter-out,macro,:FUNCTION
+clojure.pprint,fresh-line,function,:FUNCTION
+clojure.pprint,get-pretty-writer,function,:FUNCTION
+clojure.pprint,pp,macro,:FUNCTION
+clojure.pprint,pprint,function,:FUNCTION
+clojure.pprint,pprint-indent,function,:FUNCTION
+clojure.pprint,pprint-logical-block,macro,:FUNCTION
+clojure.pprint,pprint-newline,function,:FUNCTION
+clojure.pprint,pprint-tab,function,:FUNCTION
+clojure.pprint,print-length-loop,macro,:FUNCTION
+clojure.pprint,print-table,function,:FUNCTION
+clojure.pprint,set-pprint-dispatch,function,:FUNCTION
+clojure.pprint,simple-dispatch,unknown,:FUNCTION
+clojure.pprint,with-pprint-dispatch,macro,:FUNCTION
+clojure.pprint,write,function,:FUNCTION
+clojure.pprint,write-out,function,[unknown]
+clojure.reflect,->AsmReflector,function,[unknown]
+clojure.reflect,->Constructor,function,[unknown]
+clojure.reflect,->Field,function,[unknown]
+clojure.reflect,->JavaReflector,function,[unknown]
+clojure.reflect,->Method,function,[unknown]
+clojure.reflect,ClassResolver,unknown,[unknown]
+clojure.reflect,Reflector,unknown,[unknown]
+clojure.reflect,TypeReference,unknown,[unknown]
+clojure.reflect,do-reflect,function,[unknown]
+clojure.reflect,flag-descriptors,unknown,[unknown]
+clojure.reflect,map->Constructor,function,[unknown]
+clojure.reflect,map->Field,function,[unknown]
+clojure.reflect,map->Method,function,[unknown]
+clojure.reflect,reflect,function,[unknown]
+clojure.reflect,resolve-class,function,[unknown]
+clojure.reflect,type-reflect,function,[unknown]
+clojure.reflect,typename,function,[unknown]
+clojure.repl,apropos,function,[unknown]
+clojure.repl,demunge,function,[unknown]
+clojure.repl,dir,macro,[unknown]
+clojure.repl,dir-fn,function,[unknown]
+clojure.repl,doc,macro,[unknown]
+clojure.repl,find-doc,function,[unknown]
+clojure.repl,pst,function,[unknown]
+clojure.repl,root-cause,function,:FUNCTION
+clojure.repl,set-break-handler!,function,[unknown]
+clojure.repl,source,macro,[unknown]
+clojure.repl,source-fn,function,[unknown]
+clojure.repl,stack-element-str,function,[unknown]
+clojure.repl,thread-stopper,function,[unknown]
+clojure.set,difference,function,:FUNCTION
+clojure.set,index,function,:FUNCTION
+clojure.set,intersection,function,:FUNCTION
+clojure.set,join,function,:FUNCTION
+clojure.set,map-invert,function,:FUNCTION
+clojure.set,project,function,:FUNCTION
+clojure.set,rename,function,:FUNCTION
+clojure.set,rename-keys,function,:FUNCTION
+clojure.set,select,function,:FUNCTION
+clojure.set,subset?,function,:LITERAL3
+clojure.set,superset?,function,:LITERAL3
+clojure.set,union,function,:FUNCTION
+clojure.stacktrace,e,function,:FUNCTION
+clojure.stacktrace,print-cause-trace,function,:FUNCTION
+clojure.stacktrace,print-stack-trace,function,:FUNCTION
+clojure.stacktrace,print-throwable,function,:FUNCTION
+clojure.stacktrace,print-trace-element,function,:FUNCTION
+clojure.stacktrace,root-cause,function,:FUNCTION
+clojure.string,blank?,function,:LITERAL3
+clojure.string,capitalize,function,:FUNCTION
+clojure.string,escape,function,:FUNCTION
+clojure.string,join,function,:FUNCTION
+clojure.string,lower-case,function,:FUNCTION
+clojure.string,re-quote-replacement,function,:FUNCTION
+clojure.string,replace,function,:FUNCTION
+clojure.string,replace-first,function,:FUNCTION
+clojure.string,reverse,function,:KEYWORD3
+clojure.string,split,function,:FUNCTION
+clojure.string,split-lines,function,:FUNCTION
+clojure.string,trim,function,:FUNCTION
+clojure.string,trim-newline,function,:FUNCTION
+clojure.string,triml,function,:FUNCTION
+clojure.string,trimr,function,:FUNCTION
+clojure.string,upper-case,function,:FUNCTION
+clojure.template,apply-template,function,[unknown]
+clojure.template,do-template,macro,[unknown]
+clojure.test,*initial-report-counters*,dynamic,[unknown]
+clojure.test,*load-tests*,dynamic,[unknown]
+clojure.test,*report-counters*,dynamic,[unknown]
+clojure.test,*stack-trace-depth*,dynamic,[unknown]
+clojure.test,*test-out*,dynamic,[unknown]
+clojure.test,*testing-contexts*,dynamic,[unknown]
+clojure.test,*testing-vars*,dynamic,[unknown]
+clojure.test,are,macro,:FUNCTION
+clojure.test,assert-any,function,:FUNCTION
+clojure.test,assert-expr,unknown,:FUNCTION
+clojure.test,assert-predicate,function,:FUNCTION
+clojure.test,compose-fixtures,function,:FUNCTION
+clojure.test,deftest,macro,:KEYWORD1
+clojure.test,deftest-,macro,:KEYWORD1
+clojure.test,do-report,function,[unknown]
+clojure.test,file-position,function,[unknown]
+clojure.test,function?,function,:LITERAL3
+clojure.test,get-possibly-unbound-var,function,[unknown]
+clojure.test,inc-report-counter,function,[unknown]
+clojure.test,is,macro,:FUNCTION
+clojure.test,join-fixtures,function,:FUNCTION
+clojure.test,report,dynamic,[unknown]
+clojure.test,run-all-tests,function,[unknown]
+clojure.test,run-tests,function,[unknown]
+clojure.test,set-test,macro,[unknown]
+clojure.test,successful?,function,:LITERAL3
+clojure.test,test-all-vars,function,[unknown]
+clojure.test,test-ns,function,[unknown]
+clojure.test,test-var,function,[unknown]
+clojure.test,test-vars,function,[unknown]
+clojure.test,testing,macro,:FUNCTION
+clojure.test,testing-contexts-str,function,[unknown]
+clojure.test,testing-vars-str,function,[unknown]
+clojure.test,try-expr,macro,:FUNCTION
+clojure.test,use-fixtures,unknown,:FUNCTION
+clojure.test,with-test,macro,:KEYWORD3
+clojure.test,with-test-out,macro,:KEYWORD3
+clojure.walk,keywordize-keys,function,:FUNCTION
+clojure.walk,macroexpand-all,function,:FUNCTION
+clojure.walk,postwalk,function,:FUNCTION
+clojure.walk,postwalk-demo,function,:FUNCTION
+clojure.walk,postwalk-replace,function,:FUNCTION
+clojure.walk,prewalk,function,:FUNCTION
+clojure.walk,prewalk-demo,function,:FUNCTION
+clojure.walk,prewalk-replace,function,:FUNCTION
+clojure.walk,stringify-keys,function,:FUNCTION
+clojure.walk,walk,function,:FUNCTION
+clojure.xml,*current*,dynamic,:KEYWORD4
+clojure.xml,*sb*,dynamic,:KEYWORD4
+clojure.xml,*stack*,dynamic,:KEYWORD4
+clojure.xml,*state*,dynamic,:KEYWORD4
+clojure.xml,attrs,unknown,:FUNCTION
+clojure.xml,content,unknown,:FUNCTION
+clojure.xml,content-handler,unknown,:FUNCTION
+clojure.xml,element,unknown,:FUNCTION
+clojure.xml,emit,function,:FUNCTION
+clojure.xml,emit-element,function,:FUNCTION
+clojure.xml,parse,function,:FUNCTION
+clojure.xml,startparse-sax,function,:FUNCTION
+clojure.xml,tag,unknown,:FUNCTION
+clojure.zip,append-child,function,:FUNCTION
+clojure.zip,branch?,function,:LITERAL3
+clojure.zip,children,function,:FUNCTION
+clojure.zip,down,function,:FUNCTION
+clojure.zip,edit,function,:FUNCTION
+clojure.zip,end?,function,:LITERAL3
+clojure.zip,insert-child,function,:FUNCTION
+clojure.zip,insert-left,function,:FUNCTION
+clojure.zip,insert-right,function,:FUNCTION
+clojure.zip,left,function,:FUNCTION
+clojure.zip,leftmost,function,:FUNCTION
+clojure.zip,lefts,function,:FUNCTION
+clojure.zip,make-node,function,:FUNCTION
+clojure.zip,next,function,:FUNCTION
+clojure.zip,node,function,:FUNCTION
+clojure.zip,path,function,:FUNCTION
+clojure.zip,prev,function,:FUNCTION
+clojure.zip,remove,function,:FUNCTION
+clojure.zip,replace,function,:FUNCTION
+clojure.zip,right,function,:FUNCTION
+clojure.zip,rightmost,function,:FUNCTION
+clojure.zip,rights,function,:FUNCTION
+clojure.zip,root,function,:FUNCTION
+clojure.zip,seq-zip,function,:FUNCTION
+clojure.zip,up,function,:FUNCTION
+clojure.zip,vector-zip,function,:FUNCTION
+clojure.zip,xml-zip,function,:FUNCTION
+clojure.zip,zipper,function,:FUNCTION
diff --git a/misc/clojure/run b/misc/clojure/run
new file mode 100644
index 0000000..7e09130
--- /dev/null
+++ b/misc/clojure/run
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Execute misc/clojure/$1.clj to generate misc/clojure/$1.csv.
+# $1 defaults to 'keywords'
+#
+
+# This needs to be accurate per the current installation.
+CLOJURE_JAR=/usr/local/share/clojure/clojure-1.6.0/clojure-1.6.0.jar
+
+# The rest of the definitions should take care of themselves.
+
+# Figure out what the misc/clojure directory is
+# based on where this script is located:
+SCRIPT_DIR=`dirname $0`
+MISC_CLOJURE_DIR=`readlink -f $SCRIPT_DIR`
+# Do two hops up to the jEdit working directory:
+MISC_DIR=`dirname $MISC_CLOJURE_DIR`
+JEDIT_DIR=`dirname $MISC_DIR`
+
+# There really is only one script.
+SCRIPT=${1:-keywords}
+
+# Before
+ls -l $MISC_CLOJURE_DIR/$SCRIPT.csv
+
+# Bring up the Clojure jar directory and load misc/clojure/$SCRIPT.clj.
+# Specify the jEdit working directory to the loading script.
+# Put the output into the misc/clojure directory.
+java -cp $CLOJURE_JAR clojure.main \
+     $MISC_CLOJURE_DIR/$SCRIPT.clj \
+     :jedit $JEDIT_DIR \
+   > $MISC_CLOJURE_DIR/$SCRIPT.csv
+
+# After
+ls -l $MISC_CLOJURE_DIR/$SCRIPT.csv
+
+# column -s, -t < "$MISC_CLOJURE_DIR/$1.csv" | less -#2 -N -S
+
diff --git a/modes/ans-forth94.xml b/modes/ans-forth94.xml
new file mode 100644
index 0000000..c2c6561
--- /dev/null
+++ b/modes/ans-forth94.xml
@@ -0,0 +1,586 @@
+<?xml version="1.0"?>
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!--
+
+    ANS Forth 94 Syntax Highlighting Mode File for jEdit.
+    
+    Copyright (C) 2014, Mark Corbin (mark at dibsco.co.uk)
+
+
+    This library is free software; you can redistribute it and/or modify it
+    under the terms of the GNU Lesser General Public License as published by
+    the Free Software Foundation; either version 2.1 of the License, or
+    (at your option) any later version.
+
+    This library 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 Lesser
+    General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public License
+    along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA  02110-1301  USA
+
+-->
+
+<!--
+
+Token Usage:
+
+COMMENT1        Range and line comments.
+COMMENT2        Tasks (FIXME TODO NOTE and XXX).
+DIGIT           All numbers (single, double and floating point).
+FUNCTION        Word definitions and references.
+INVALID         Obsolete Forth keywords (all ANS wordsets).
+KEYWORD1        Forth Keywords (all ANS wordsets).
+KEYWORD2        Variables.
+LITERAL1        Strings.
+LITERAL2        Character literals.
+LITERAL3        Constants.
+
+-->
+
+<!--
+
+Recommended catalog file entry:
+
+<MODE NAME="ans-forth94"        FILE="ans-forth94.xml"
+                                FILE_NAME_GLOB="*.4th" />
+
+-->
+
+<MODE>
+  <PROPS>
+    <PROPERTY NAME="commentStart" VALUE="(" />
+    <PROPERTY NAME="commentEnd" VALUE=")" />
+    <PROPERTY NAME="lineComment" VALUE="\" />
+
+    <PROPERTY NAME="indentNextLines" VALUE="((^|\s+)(:|begin|case|else)($|\s+.*))|((^|.*\s+)(do|\?do|of|if)($|\s+.*))" />
+    <PROPERTY NAME="unindentThisLine" VALUE="(^|\s+)(;|again|repeat|until|endcase|else|loop|\+loop|endof|then)($|\s+.*)" />
+    <PROPERTY NAME="unindentNextLines" VALUE="(^|\s+)(;|again|repeat|until|endcase|else|loop|\+loop|endof|then)($|\s+.*)" />
+    <PROPERTY NAME="electricKeys" VALUE=";eflnopt" />
+  </PROPS>
+
+  <RULES IGNORE_CASE="TRUE"
+         NO_WORD_SEP="!£$%^&#'~|\(){}*+,-./_=@:;<>"?[]"
+         HIGHLIGHT_DIGITS="TRUE"
+         DIGIT_RE="((^|\s+)([-]?[0-9]+)($|\s+))|((^|\s+)([-]?[0-9]+[.][0-9]*)($|\s+))|((^|\s+)(([+]|[-])?([0-9]+[.]?[0-9]*)(E|e)([+]|[-])?([0-9]*))($|\s+))">
+
+    <!-- Line Comments. -->
+    <EOL_SPAN_REGEXP TYPE="KEYWORD1"
+                     AT_WORD_START="TRUE"
+                     DELEGATE="LINE-COMMENT">\\($|\s+)</EOL_SPAN_REGEXP>
+
+    <!-- Range Comments. -->
+    <SPAN_REGEXP TYPE="KEYWORD1"
+                 AT_WORD_START="TRUE"
+                 DELEGATE="RANGE-COMMENT">
+      <BEGIN>\(($|\s+)</BEGIN>
+      <END REGEXP="TRUE">(?=\))</END>
+    </SPAN_REGEXP>
+
+    <!-- Quoted Strings. -->
+    <SPAN_REGEXP TYPE="KEYWORD1"
+                 AT_WORD_START="TRUE"
+                 DELEGATE="STRING">
+      <BEGIN>([.]"|ABORT"|S"|C")($|\s+)</BEGIN>
+      <END REGEXP="TRUE">(?=")</END>
+    </SPAN_REGEXP>
+
+    <!-- Parsed Strings. -->
+    <SPAN_REGEXP TYPE="KEYWORD1" 
+                 AT_WORD_START="TRUE"
+                 NO_LINE_BREAK="TRUE"
+                 DELEGATE="STRING">
+      <BEGIN>(WORD|PARSE)($|\s+)</BEGIN>
+      <END REGEXP="TRUE">\s+</END>
+    </SPAN_REGEXP>
+
+    <!-- Display Strings. -->
+    <SPAN_REGEXP TYPE="KEYWORD1"
+                 AT_WORD_START="TRUE"
+                 DELEGATE="STRING">
+      <BEGIN>[.]\(($|\s+)</BEGIN>
+      <END REGEXP="TRUE">(?=\))</END>
+    </SPAN_REGEXP>
+
+    <!-- Character Literals. -->
+    <SPAN_REGEXP TYPE="KEYWORD1"
+                    AT_WORD_START="TRUE"
+                    NO_LINE_BREAK="TRUE"
+                    DELEGATE="LITERAL">
+      <BEGIN>(CHAR|\[CHAR\])($|\s+)</BEGIN>
+      <END REGEXP="TRUE">\s+</END>
+    </SPAN_REGEXP>
+
+    <!-- Word Definitions and References. -->
+    <SPAN_REGEXP TYPE="KEYWORD1"
+                    AT_WORD_START="TRUE"
+                    NO_LINE_BREAK="TRUE"
+                    DELEGATE="WORD">
+      <BEGIN>(:|'|CREATE|POSTPONE|MARKER|\[COMPILE\]|CODE|SEE)($|\s+)</BEGIN>
+      <END REGEXP="TRUE">\s+</END>
+    </SPAN_REGEXP>
+
+    <!-- Obsolete Keywords. -->
+    <SPAN_REGEXP TYPE="INVALID"
+                    AT_WORD_START="TRUE"
+                    NO_LINE_BREAK="TRUE"
+                    DELEGATE="WORD">
+      <BEGIN>FORGET($|\s+)</BEGIN>
+      <END REGEXP="TRUE">\s+</END>
+    </SPAN_REGEXP>
+
+    <!-- Variables. -->
+    <SPAN_REGEXP TYPE="KEYWORD1"
+                    AT_WORD_START="TRUE"
+                    NO_LINE_BREAK="TRUE"
+                    DELEGATE="VARIABLE">
+      <BEGIN>(VARIABLE|TO|VALUE|2VARIABLE|FVARIABLE)($|\s+)</BEGIN>
+      <END REGEXP="TRUE">\s+</END>
+    </SPAN_REGEXP>
+
+    <!-- Local Variables. -->
+    <SPAN_REGEXP TYPE="KEYWORD1"
+                    AT_WORD_START="TRUE"
+                    NO_LINE_BREAK="TRUE"
+                    DELEGATE="VARIABLE">
+      <BEGIN>(LOCALS\|)($|\s+)</BEGIN>
+      <END REGEXP="TRUE">(?=\|)</END>
+    </SPAN_REGEXP>
+
+    <!-- Constants. -->
+    <SPAN_REGEXP TYPE="KEYWORD1"
+                    AT_WORD_START="TRUE"
+                    NO_LINE_BREAK="TRUE"
+                    DELEGATE="CONSTANT">
+      <BEGIN>(CONSTANT|2CONSTANT|FCONSTANT)($|\s+)</BEGIN>
+      <END REGEXP="TRUE">\s+</END>
+    </SPAN_REGEXP>
+
+    <KEYWORDS>
+      <!-- Core Keywords -->
+      <KEYWORD1>!</KEYWORD1>
+      <KEYWORD1>#</KEYWORD1>
+      <KEYWORD1>#></KEYWORD1> <!-- #> -->
+      <KEYWORD1>#S</KEYWORD1>
+      <KEYWORD1>'</KEYWORD1> <!-- ' -->
+      <KEYWORD1>(</KEYWORD1>
+      <KEYWORD1>)</KEYWORD1> <!-- Added to delimit range comments. -->
+      <KEYWORD1>*</KEYWORD1>
+      <KEYWORD1>*/</KEYWORD1>
+      <KEYWORD1>*/MOD</KEYWORD1>
+      <KEYWORD1>+</KEYWORD1>
+      <KEYWORD1>+!</KEYWORD1>
+      <KEYWORD1>+LOOP</KEYWORD1>
+      <KEYWORD1>,</KEYWORD1>
+      <KEYWORD1>-</KEYWORD1>
+      <KEYWORD1>.</KEYWORD1>
+      <KEYWORD1>."</KEYWORD1> <!-- ." -->
+      <KEYWORD1>"</KEYWORD1> <!-- Added to delimit strings. -->
+      <KEYWORD1>/</KEYWORD1>
+      <KEYWORD1>/MOD</KEYWORD1>
+      <KEYWORD1>0<</KEYWORD1> <!-- 0< -->
+      <KEYWORD1>0=</KEYWORD1>
+      <KEYWORD1>1+</KEYWORD1>
+      <KEYWORD1>1-</KEYWORD1>
+      <KEYWORD1>2!</KEYWORD1>
+      <KEYWORD1>2*</KEYWORD1>
+      <KEYWORD1>2/</KEYWORD1>
+      <KEYWORD1>2@</KEYWORD1>
+      <KEYWORD1>2DROP</KEYWORD1>
+      <KEYWORD1>2DUP</KEYWORD1>
+      <KEYWORD1>2OVER</KEYWORD1>
+      <KEYWORD1>2SWAP</KEYWORD1>
+      <KEYWORD1>:</KEYWORD1>
+      <KEYWORD1>;</KEYWORD1>
+      <KEYWORD1><</KEYWORD1> <!-- < -->
+      <KEYWORD1><#</KEYWORD1> <!-- <# -->
+      <KEYWORD1>=</KEYWORD1>
+      <KEYWORD1>></KEYWORD1> <!-- > -->
+      <KEYWORD1>>BODY</KEYWORD1> <!-- >BODY -->
+      <KEYWORD1>>IN</KEYWORD1> <!-- >IN -->
+      <KEYWORD1>>NUMBER</KEYWORD1> <!-- >NUMBER -->
+      <KEYWORD1>>R</KEYWORD1> <!-- >R -->
+      <KEYWORD1>?DUP</KEYWORD1>
+      <KEYWORD1>@</KEYWORD1>
+      <KEYWORD1>ABORT</KEYWORD1>
+      <KEYWORD1>ABORT"</KEYWORD1> <!-- ABORT" -->
+      <KEYWORD1>ABS</KEYWORD1>
+      <KEYWORD1>ACCEPT</KEYWORD1>
+      <KEYWORD1>ALIGN</KEYWORD1>
+      <KEYWORD1>ALIGNED</KEYWORD1>
+      <KEYWORD1>ALLOT</KEYWORD1>
+      <KEYWORD1>AND</KEYWORD1>
+      <KEYWORD1>BASE</KEYWORD1>
+      <KEYWORD1>BEGIN</KEYWORD1>
+      <KEYWORD1>BL</KEYWORD1>
+      <KEYWORD1>C!</KEYWORD1>
+      <KEYWORD1>C,</KEYWORD1>
+      <KEYWORD1>C@</KEYWORD1>
+      <KEYWORD1>CELL+</KEYWORD1>
+      <KEYWORD1>CELLS</KEYWORD1>
+      <KEYWORD1>CHAR</KEYWORD1>
+      <KEYWORD1>CHAR+</KEYWORD1>
+      <KEYWORD1>CHARS</KEYWORD1>
+      <KEYWORD1>CONSTANT</KEYWORD1>
+      <KEYWORD1>COUNT</KEYWORD1>
+      <KEYWORD1>CR</KEYWORD1>
+      <KEYWORD1>CREATE</KEYWORD1>
+      <KEYWORD1>DECIMAL</KEYWORD1>
+      <KEYWORD1>DEPTH</KEYWORD1>
+      <KEYWORD1>DO</KEYWORD1>
+      <KEYWORD1>DOES></KEYWORD1> <!-- DOES> -->
+      <KEYWORD1>DROP</KEYWORD1>
+      <KEYWORD1>DUP</KEYWORD1>
+      <KEYWORD1>ELSE</KEYWORD1>
+      <KEYWORD1>EMIT</KEYWORD1>
+      <KEYWORD1>ENVIRONMENT?</KEYWORD1>
+      <KEYWORD1>EVALUATE</KEYWORD1>
+      <KEYWORD1>EXECUTE</KEYWORD1>
+      <KEYWORD1>EXIT</KEYWORD1>
+      <KEYWORD1>FILL</KEYWORD1>
+      <KEYWORD1>FIND</KEYWORD1>
+      <KEYWORD1>FM/MOD</KEYWORD1>
+      <KEYWORD1>HERE</KEYWORD1>
+      <KEYWORD1>HOLD</KEYWORD1>
+      <KEYWORD1>I</KEYWORD1>
+      <KEYWORD1>IF</KEYWORD1>
+      <KEYWORD1>IMMEDIATE</KEYWORD1>
+      <KEYWORD1>INVERT</KEYWORD1>
+      <KEYWORD1>J</KEYWORD1>
+      <KEYWORD1>KEY</KEYWORD1>
+      <KEYWORD1>LEAVE</KEYWORD1>
+      <KEYWORD1>LITERAL</KEYWORD1>
+      <KEYWORD1>LOOP</KEYWORD1>
+      <KEYWORD1>LSHIFT</KEYWORD1>
+      <KEYWORD1>M*</KEYWORD1>
+      <KEYWORD1>MAX</KEYWORD1>
+      <KEYWORD1>MIN</KEYWORD1>
+      <KEYWORD1>MOD</KEYWORD1>
+      <KEYWORD1>MOVE</KEYWORD1>
+      <KEYWORD1>NEGATE</KEYWORD1>
+      <KEYWORD1>OR</KEYWORD1>
+      <KEYWORD1>OVER</KEYWORD1>
+      <KEYWORD1>POSTPONE</KEYWORD1>
+      <KEYWORD1>QUIT</KEYWORD1>
+      <KEYWORD1>R></KEYWORD1> <!-- R> -->
+      <KEYWORD1>R@</KEYWORD1>
+      <KEYWORD1>RECURSE</KEYWORD1>
+      <KEYWORD1>REPEAT</KEYWORD1>
+      <KEYWORD1>ROT</KEYWORD1>
+      <KEYWORD1>RSHIFT</KEYWORD1>
+      <KEYWORD1>S"</KEYWORD1> <!-- S" -->
+      <KEYWORD1>S>D</KEYWORD1> <!-- S>D -->
+      <KEYWORD1>SIGN</KEYWORD1>
+      <KEYWORD1>SM/REM</KEYWORD1>
+      <KEYWORD1>SOURCE</KEYWORD1>
+      <KEYWORD1>SPACE</KEYWORD1>
+      <KEYWORD1>SPACES</KEYWORD1>
+      <KEYWORD1>STATE</KEYWORD1>
+      <KEYWORD1>SWAP</KEYWORD1>
+      <KEYWORD1>THEN</KEYWORD1>
+      <KEYWORD1>TYPE</KEYWORD1>
+      <KEYWORD1>U.</KEYWORD1>
+      <KEYWORD1>U<</KEYWORD1> <!-- U< -->
+      <KEYWORD1>UM*</KEYWORD1>
+      <KEYWORD1>UM/MOD</KEYWORD1>
+      <KEYWORD1>UNLOOP</KEYWORD1>
+      <KEYWORD1>UNTIL</KEYWORD1>
+      <KEYWORD1>VARIABLE</KEYWORD1>
+      <KEYWORD1>WHILE</KEYWORD1>
+      <KEYWORD1>WORD</KEYWORD1>
+      <KEYWORD1>XOR</KEYWORD1>
+      <KEYWORD1>[</KEYWORD1>
+      <KEYWORD1>[']</KEYWORD1> <!-- ['] -->
+      <KEYWORD1>[CHAR]</KEYWORD1>
+      <KEYWORD1>]</KEYWORD1>
+      <!-- Core Extension Keywords -->
+      <KEYWORD1>.(</KEYWORD1>
+      <KEYWORD1>.R</KEYWORD1>
+      <KEYWORD1>0<></KEYWORD1> <!-- 0<> -->
+      <KEYWORD1>0></KEYWORD1> <!-- 0> -->
+      <KEYWORD1>2>R</KEYWORD1> <!-- 2>R -->
+      <KEYWORD1>2R></KEYWORD1> <!-- 2R> -->
+      <KEYWORD1>2R@</KEYWORD1>
+      <KEYWORD1>:NONAME</KEYWORD1>
+      <KEYWORD1><></KEYWORD1> <!-- <> -->
+      <KEYWORD1>?DO</KEYWORD1>
+      <KEYWORD1>AGAIN</KEYWORD1>
+      <KEYWORD1>C"</KEYWORD1> <!-- C" -->
+      <KEYWORD1>CASE</KEYWORD1>
+      <KEYWORD1>COMPILE,</KEYWORD1>
+      <KEYWORD1>ENDCASE</KEYWORD1>
+      <KEYWORD1>ENDOF</KEYWORD1>
+      <KEYWORD1>ERASE</KEYWORD1>
+      <KEYWORD1>FALSE</KEYWORD1>
+      <KEYWORD1>HEX</KEYWORD1>
+      <KEYWORD1>MARKER</KEYWORD1>
+      <KEYWORD1>NIP</KEYWORD1>
+      <KEYWORD1>OF</KEYWORD1>
+      <KEYWORD1>PAD</KEYWORD1>
+      <KEYWORD1>PARSE</KEYWORD1>
+      <KEYWORD1>PICK</KEYWORD1>
+      <KEYWORD1>REFILL</KEYWORD1>
+      <KEYWORD1>RESTORE-INPUT</KEYWORD1>
+      <KEYWORD1>ROLL</KEYWORD1>
+      <KEYWORD1>SAVE-INPUT</KEYWORD1>
+      <KEYWORD1>SOURCE-ID</KEYWORD1>
+      <KEYWORD1>TO</KEYWORD1>
+      <KEYWORD1>TRUE</KEYWORD1>
+      <KEYWORD1>TUCK</KEYWORD1>
+      <KEYWORD1>U.R</KEYWORD1>
+      <KEYWORD1>U></KEYWORD1> <!-- U> -->
+      <KEYWORD1>UNUSED</KEYWORD1>
+      <KEYWORD1>VALUE</KEYWORD1>
+      <KEYWORD1>WITHIN</KEYWORD1>
+      <KEYWORD1>[COMPILE]</KEYWORD1>
+      <KEYWORD1>\</KEYWORD1>
+      <!-- Obsolete Core Extension Keywords -->
+      <INVALID>#TIB</INVALID>
+      <INVALID>CONVERT</INVALID>
+      <INVALID>EXPECT</INVALID>
+      <INVALID>QUERY</INVALID>
+      <INVALID>SPAN</INVALID>
+      <INVALID>TIB</INVALID>
+      <!-- Block Keywords -->
+      <KEYWORD1>BLK</KEYWORD1>
+      <KEYWORD1>BLOCK</KEYWORD1>
+      <KEYWORD1>BUFFER</KEYWORD1>
+      <KEYWORD1>EVALUATE</KEYWORD1>
+      <KEYWORD1>FLUSH</KEYWORD1>
+      <KEYWORD1>LOAD</KEYWORD1>
+      <KEYWORD1>SAVE-BUFFERS</KEYWORD1>
+      <KEYWORD1>UPDATE</KEYWORD1>
+      <!-- Block Extension Keywords -->
+      <KEYWORD1>EMPTY-BUFFERS</KEYWORD1>
+      <KEYWORD1>LIST</KEYWORD1>
+      <KEYWORD1>REFILL</KEYWORD1>
+      <KEYWORD1>SCR</KEYWORD1>
+      <KEYWORD1>THRU</KEYWORD1>
+      <KEYWORD1>\</KEYWORD1>
+      <!-- Double Keywords -->
+      <KEYWORD1>2CONSTANT</KEYWORD1>
+      <KEYWORD1>2LITERAL</KEYWORD1>
+      <KEYWORD1>2VARIABLE</KEYWORD1>
+      <KEYWORD1>D+</KEYWORD1>
+      <KEYWORD1>D-</KEYWORD1>
+      <KEYWORD1>D.</KEYWORD1>
+      <KEYWORD1>D.R</KEYWORD1>
+      <KEYWORD1>D0<</KEYWORD1> <!-- D0< -->
+      <KEYWORD1>D0=</KEYWORD1>
+      <KEYWORD1>D2*</KEYWORD1>
+      <KEYWORD1>D2/</KEYWORD1>
+      <KEYWORD1>D<</KEYWORD1> <!-- D< -->
+      <KEYWORD1>D=</KEYWORD1>
+      <KEYWORD1>D>S</KEYWORD1> <!-- D>S -->
+      <KEYWORD1>DABS</KEYWORD1>
+      <KEYWORD1>DMAX</KEYWORD1>
+      <KEYWORD1>DMIN</KEYWORD1>
+      <KEYWORD1>DNEGATE</KEYWORD1>
+      <KEYWORD1>M*/</KEYWORD1>
+      <KEYWORD1>M+</KEYWORD1>
+      <!-- Double Extension Keywords -->
+      <KEYWORD1>2ROT</KEYWORD1>
+      <KEYWORD1>DU<</KEYWORD1> <!-- DU< -->
+      <!-- Exception Keywords -->
+      <KEYWORD1>CATCH</KEYWORD1>
+      <KEYWORD1>THROW</KEYWORD1>
+      <!-- Exception Extension Keywords -->
+      <KEYWORD1>ABORT</KEYWORD1>
+      <KEYWORD1>ABORT"</KEYWORD1> <!-- ABORT" -->
+      <!-- Facility Keywords -->
+      <KEYWORD1>AT-XY</KEYWORD1>
+      <KEYWORD1>KEY?</KEYWORD1>
+      <KEYWORD1>PAGE</KEYWORD1>
+      <!-- Facility Extension Keywords -->
+      <KEYWORD1>EKEY</KEYWORD1>
+      <KEYWORD1>EKEY>CHAR</KEYWORD1> <!-- EKEY>CHAR -->
+      <KEYWORD1>EKEY?</KEYWORD1>
+      <KEYWORD1>EMIT?</KEYWORD1>
+      <KEYWORD1>MS</KEYWORD1>
+      <KEYWORD1>TIME&DATE</KEYWORD1> <!-- TIME&DATE -->
+      <!-- File Keywords -->
+      <KEYWORD1>(</KEYWORD1>
+      <KEYWORD1>BIN</KEYWORD1>
+      <KEYWORD1>CLOSE-FILE</KEYWORD1>
+      <KEYWORD1>CREATE-FILE</KEYWORD1>
+      <KEYWORD1>DELETE-FILE</KEYWORD1>
+      <KEYWORD1>FILE-POSITION</KEYWORD1>
+      <KEYWORD1>FILE-SIZE</KEYWORD1>
+      <KEYWORD1>INCLUDE-FILE</KEYWORD1>
+      <KEYWORD1>INCLUDED</KEYWORD1>
+      <KEYWORD1>OPEN-FILE</KEYWORD1>
+      <KEYWORD1>R/O</KEYWORD1>
+      <KEYWORD1>R/W</KEYWORD1>
+      <KEYWORD1>READ-FILE</KEYWORD1>
+      <KEYWORD1>READ-LINE</KEYWORD1>
+      <KEYWORD1>REPOSITION-FILE</KEYWORD1>
+      <KEYWORD1>RESIZE-FILE</KEYWORD1>
+      <KEYWORD1>S"</KEYWORD1> <!-- S" -->
+      <KEYWORD1>SOURCE-ID</KEYWORD1>
+      <KEYWORD1>W/O</KEYWORD1>
+      <KEYWORD1>WRITE-FILE</KEYWORD1>
+      <KEYWORD1>WRITE-LINE</KEYWORD1>
+      <!-- File Extension Keywords -->
+      <KEYWORD1>FILE-STATUS</KEYWORD1>
+      <KEYWORD1>FLUSH-FILE</KEYWORD1>
+      <KEYWORD1>REFILL</KEYWORD1>
+      <KEYWORD1>RENAME-FILE</KEYWORD1>
+      <!-- Floating Keywords -->
+      <KEYWORD1>>FLOAT</KEYWORD1> <!-- >FLOAT -->
+      <KEYWORD1>D>F</KEYWORD1> <!-- D>F -->
+      <KEYWORD1>F!</KEYWORD1>
+      <KEYWORD1>F*</KEYWORD1>
+      <KEYWORD1>F+</KEYWORD1>
+      <KEYWORD1>F-</KEYWORD1>
+      <KEYWORD1>F/</KEYWORD1>
+      <KEYWORD1>F0<</KEYWORD1> <!-- F0< -->
+      <KEYWORD1>F0=</KEYWORD1>
+      <KEYWORD1>F<</KEYWORD1> <!-- F< -->
+      <KEYWORD1>F>D</KEYWORD1> <!-- F>D -->
+      <KEYWORD1>F@</KEYWORD1>
+      <KEYWORD1>FALIGN</KEYWORD1>
+      <KEYWORD1>FALIGNED</KEYWORD1>
+      <KEYWORD1>FCONSTANT</KEYWORD1>
+      <KEYWORD1>FDEPTH</KEYWORD1>
+      <KEYWORD1>FDROP</KEYWORD1>
+      <KEYWORD1>FDUP</KEYWORD1>
+      <KEYWORD1>FLITERAL</KEYWORD1>
+      <KEYWORD1>FLOAT+</KEYWORD1>
+      <KEYWORD1>FLOATS</KEYWORD1>
+      <KEYWORD1>FLOOR</KEYWORD1>
+      <KEYWORD1>FMAX</KEYWORD1>
+      <KEYWORD1>FMIN</KEYWORD1>
+      <KEYWORD1>FNEGATE</KEYWORD1>
+      <KEYWORD1>FOVER</KEYWORD1>
+      <KEYWORD1>FROT</KEYWORD1>
+      <KEYWORD1>FROUND</KEYWORD1>
+      <KEYWORD1>FSWAP</KEYWORD1>
+      <KEYWORD1>FVARIABLE</KEYWORD1>
+      <KEYWORD1>REPRESENT</KEYWORD1>
+      <!-- Floating Extension Keywords -->
+      <KEYWORD1>DF!</KEYWORD1>
+      <KEYWORD1>DF@</KEYWORD1>
+      <KEYWORD1>DFALIGN</KEYWORD1>
+      <KEYWORD1>DFALIGNED</KEYWORD1>
+      <KEYWORD1>DFLOAT+</KEYWORD1>
+      <KEYWORD1>DFLOATS</KEYWORD1>
+      <KEYWORD1>F**</KEYWORD1>
+      <KEYWORD1>F.</KEYWORD1>
+      <KEYWORD1>FABS</KEYWORD1>
+      <KEYWORD1>FACOS</KEYWORD1>
+      <KEYWORD1>FACOSH</KEYWORD1>
+      <KEYWORD1>FALOG</KEYWORD1>
+      <KEYWORD1>FASIN</KEYWORD1>
+      <KEYWORD1>FASINH</KEYWORD1>
+      <KEYWORD1>FATAN</KEYWORD1>
+      <KEYWORD1>FATAN2</KEYWORD1>
+      <KEYWORD1>FATANH</KEYWORD1>
+      <KEYWORD1>FCOS</KEYWORD1>
+      <KEYWORD1>FCOSH</KEYWORD1>
+      <KEYWORD1>FE.</KEYWORD1>
+      <KEYWORD1>FEXP</KEYWORD1>
+      <KEYWORD1>FEXPM1</KEYWORD1>
+      <KEYWORD1>FLN</KEYWORD1>
+      <KEYWORD1>FLNP1</KEYWORD1>
+      <KEYWORD1>FLOG</KEYWORD1>
+      <KEYWORD1>FS.</KEYWORD1>
+      <KEYWORD1>FSIN</KEYWORD1>
+      <KEYWORD1>FSINCOS</KEYWORD1>
+      <KEYWORD1>FSINH</KEYWORD1>
+      <KEYWORD1>FSQRT</KEYWORD1>
+      <KEYWORD1>FTAN</KEYWORD1>
+      <KEYWORD1>FTANH</KEYWORD1>
+      <KEYWORD1>F~</KEYWORD1>
+      <KEYWORD1>PRECISION</KEYWORD1>
+      <KEYWORD1>SET-PRECISION</KEYWORD1>
+      <KEYWORD1>SF!</KEYWORD1>
+      <KEYWORD1>SF@</KEYWORD1>
+      <KEYWORD1>SFALIGN</KEYWORD1>
+      <KEYWORD1>SFALIGNED</KEYWORD1>
+      <KEYWORD1>SFLOAT+</KEYWORD1>
+      <KEYWORD1>SFLOATS</KEYWORD1>
+      <!-- Local Keywords -->
+      <KEYWORD1>(LOCAL)</KEYWORD1>
+      <KEYWORD1>TO</KEYWORD1>
+      <!-- Local Extension Keywords -->
+      <KEYWORD1>LOCALS|</KEYWORD1>
+      <KEYWORD1>|</KEYWORD1> <!-- Added to delimit local variables. -->
+      <!-- Memory Keywords -->
+      <KEYWORD1>ALLOCATE</KEYWORD1>
+      <KEYWORD1>FREE</KEYWORD1>
+      <KEYWORD1>RESIZE</KEYWORD1>
+      <!-- Tools Keywords -->
+      <KEYWORD1>.S</KEYWORD1>
+      <KEYWORD1>?</KEYWORD1>
+      <KEYWORD1>DUMP</KEYWORD1>
+      <KEYWORD1>SEE</KEYWORD1>
+      <KEYWORD1>WORDS</KEYWORD1>
+      <!-- Tools Extension Keywords -->
+      <KEYWORD1>;CODE</KEYWORD1>
+      <KEYWORD1>AHEAD</KEYWORD1>
+      <KEYWORD1>ASSEMBLER</KEYWORD1>
+      <KEYWORD1>BYE</KEYWORD1>
+      <KEYWORD1>CODE</KEYWORD1>
+      <KEYWORD1>CS-PICK</KEYWORD1>
+      <KEYWORD1>CS-ROLL</KEYWORD1>
+      <KEYWORD1>EDITOR</KEYWORD1>
+      <KEYWORD1>STATE</KEYWORD1>
+      <KEYWORD1>[ELSE]</KEYWORD1>
+      <KEYWORD1>[IF]</KEYWORD1>
+      <KEYWORD1>[THEN]</KEYWORD1>
+      <!-- Obsolete Tools Extension Keywords -->
+      <INVALID>FORGET</INVALID>
+      <!-- Search Keywords -->
+      <KEYWORD1>DEFINITIONS</KEYWORD1>
+      <KEYWORD1>FIND</KEYWORD1>
+      <KEYWORD1>FORTH-WORDLIST</KEYWORD1>
+      <KEYWORD1>GET-CURRENT</KEYWORD1>
+      <KEYWORD1>GET-ORDER</KEYWORD1>
+      <KEYWORD1>SEARCH-WORDLIST</KEYWORD1>
+      <KEYWORD1>SET-CURRENT</KEYWORD1>
+      <KEYWORD1>SET-ORDER</KEYWORD1>
+      <KEYWORD1>WORDLIST</KEYWORD1>
+      <!-- Search Extension Keywords -->
+      <KEYWORD1>ALSO</KEYWORD1>
+      <KEYWORD1>FORTH</KEYWORD1>
+      <KEYWORD1>ONLY</KEYWORD1>
+      <KEYWORD1>ORDER</KEYWORD1>
+      <KEYWORD1>PREVIOUS</KEYWORD1>
+      <!-- String Keywords -->
+      <KEYWORD1>-TRAILING</KEYWORD1>
+      <KEYWORD1>/STRING</KEYWORD1>
+      <KEYWORD1>BLANK</KEYWORD1>
+      <KEYWORD1>CMOVE</KEYWORD1>
+      <KEYWORD1>CMOVE></KEYWORD1> <!-- CMOVE> -->
+      <KEYWORD1>COMPARE</KEYWORD1>
+      <KEYWORD1>SEARCH</KEYWORD1>
+      <KEYWORD1>SLITERAL</KEYWORD1>
+    </KEYWORDS>
+  </RULES>
+
+  <RULES SET="RANGE-COMMENT" IGNORE_CASE="TRUE" DEFAULT="COMMENT1" HIGHLIGHT_DIGITS="FALSE">
+    <IMPORT DELEGATE="IN-COMMENT" />
+  </RULES>
+
+  <RULES SET="LINE-COMMENT" IGNORE_CASE="TRUE" DEFAULT="COMMENT1" HIGHLIGHT_DIGITS="FALSE">
+    <IMPORT DELEGATE="IN-COMMENT" />
+  </RULES>
+
+  <RULES SET="IN-COMMENT" IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="FALSE">
+    <SEQ_REGEXP TYPE="COMMENT2">(FIXME|TODO|NOTE|XXX)(:|$|\s+)</SEQ_REGEXP>
+  </RULES>
+
+  <RULES SET="STRING" IGNORE_CASE="TRUE" DEFAULT="LITERAL1" HIGHLIGHT_DIGITS="FALSE" />
+
+  <RULES SET="LITERAL" IGNORE_CASE="TRUE" DEFAULT="LITERAL2" HIGHLIGHT_DIGITS="FALSE" />
+
+  <RULES SET="WORD" IGNORE_CASE="TRUE" DEFAULT="FUNCTION" HIGHLIGHT_DIGITS="FALSE" />
+
+  <RULES SET="VARIABLE" IGNORE_CASE="TRUE" DEFAULT="KEYWORD2" HIGHLIGHT_DIGITS="FALSE" />
+
+  <RULES SET="CONSTANT" IGNORE_CASE="TRUE" DEFAULT="LITERAL3" HIGHLIGHT_DIGITS="FALSE" />
+</MODE>
diff --git a/modes/antlr4.xml b/modes/antlr4.xml
new file mode 100644
index 0000000..08e47c9
--- /dev/null
+++ b/modes/antlr4.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE MODE SYSTEM "xmode.dtd"><!--  -->
+
+
+<!--
+    This mode file describes the ANTLR 4 syntax definition language as
+    described in the book "The Definitive ANTLR 4 Reference" by Terrence Parr.
+-->
+<MODE>
+    <PROPS>
+        <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="(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]))">
+        
+        <!-- Antlr comments are the same as java comments -->
+        <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>
+
+        <!-- string literal -->
+        <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+            <BEGIN>'</BEGIN>
+            <END>'</END>
+        </SPAN>
+
+        <!-- rule 'operators' -->
+        <SEQ TYPE="OPERATOR">|</SEQ>
+        <SEQ TYPE="OPERATOR">:</SEQ>
+		<SEQ TYPE="OPERATOR">}</SEQ>
+		<SEQ TYPE="OPERATOR">{</SEQ>
+
+        <!-- rule action -->
+        <MARK_FOLLOWING TYPE="KEYWORD4">@</MARK_FOLLOWING>
+        
+        <!-- lexer rules -->
+        <SEQ_REGEXP HASH_CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZ" AT_LINE_START="TRUE"
+ 		   TYPE="KEYWORD2">[A-Z][a-zA-Z_]+</SEQ_REGEXP>
+ 
+        <!-- parser rules -->
+        <SEQ_REGEXP HASH_CHARS="abcdefghijklmnopqrstuvwxyz" AT_LINE_START="TRUE"
+ 		   TYPE="KEYWORD2">[a-z][a-zA-Z_]+</SEQ_REGEXP>
+ 
+        
+        <KEYWORDS>
+            <KEYWORD1>catch</KEYWORD1>
+            <KEYWORD1>finally</KEYWORD1>
+            <KEYWORD1>fragment</KEYWORD1>
+            <KEYWORD1>grammar</KEYWORD1>
+            <KEYWORD1>import</KEYWORD1>
+            <KEYWORD1>lexer</KEYWORD1>
+            <KEYWORD1>locals</KEYWORD1>
+            <KEYWORD1>mode</KEYWORD1>
+            <KEYWORD1>options</KEYWORD1>
+            <KEYWORD1>parser</KEYWORD1>
+            <KEYWORD1>private</KEYWORD1>
+            <KEYWORD1>protected</KEYWORD1>
+            <KEYWORD1>public</KEYWORD1>
+            <KEYWORD1>returns</KEYWORD1>
+            <KEYWORD1>throws</KEYWORD1>
+            <KEYWORD4>tokens</KEYWORD4>
+
+            <!-- the following are not Antlr keywords, but since Antlr actions
+            include java keywords, these are useful. These are copied from
+            the java mode file. -->
+			<KEYWORD1>assert</KEYWORD1>
+			<KEYWORD1>break</KEYWORD1>
+			<KEYWORD1>case</KEYWORD1>
+			<KEYWORD1>continue</KEYWORD1>
+			<KEYWORD1>default</KEYWORD1>
+			<KEYWORD1>do</KEYWORD1>
+			<KEYWORD1>else</KEYWORD1>
+			<KEYWORD1>for</KEYWORD1>
+			<KEYWORD1>if</KEYWORD1>
+			<KEYWORD1>instanceof</KEYWORD1>
+			<KEYWORD1>new</KEYWORD1>
+			<KEYWORD1>return</KEYWORD1>
+			<KEYWORD1>strictfp</KEYWORD1>
+			<KEYWORD1>switch</KEYWORD1>
+			<KEYWORD1>throw</KEYWORD1>
+			<KEYWORD1>try</KEYWORD1>
+			<KEYWORD1>while</KEYWORD1>
+
+			<KEYWORD2>abstract</KEYWORD2>
+			<KEYWORD2>enum</KEYWORD2>
+			<KEYWORD2>extends</KEYWORD2>
+			<KEYWORD2>final</KEYWORD2>
+			<KEYWORD2>implements</KEYWORD2>
+			<KEYWORD2>import</KEYWORD2> 
+			<KEYWORD2>native</KEYWORD2>
+			<KEYWORD2>package</KEYWORD2>
+			<KEYWORD2>static</KEYWORD2>
+			<KEYWORD2>synchronized</KEYWORD2>
+			<KEYWORD2>throws</KEYWORD2>
+			<KEYWORD2>transient</KEYWORD2>
+			<KEYWORD2>volatile</KEYWORD2>
+			<KEYWORD3>void</KEYWORD3>
+
+			<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>
+
+			<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/modes/catalog b/modes/catalog
index 924d552..f466dcd 100644
--- a/modes/catalog
+++ b/modes/catalog
@@ -8,72 +8,78 @@
 <MODES>
 
 <MODE NAME="actionscript"	FILE="actionscript.xml"
-				FILE_NAME_GLOB="*.as" />
+        FILE_NAME_GLOB="*.as" />
 
 <MODE NAME="ada"		FILE="ada.xml"
-				FILE_NAME_GLOB="*.{ada,adb,ads}"/>
+        FILE_NAME_GLOB="*.{ada,adb,ads}"/>
 
 <MODE NAME="ada95"		FILE="ada95.xml" />
 
+<MODE NAME="ans-forth94"		FILE="ans-forth94.xml"
+          FILE_NAME_GLOB="*.4th"/>
+
 <MODE NAME="ant"		FILE="ant.xml"
-				FILE_NAME_GLOB="*build.xml"
-				FIRST_LINE_GLOB="*<project*" />
+        FILE_NAME_GLOB="*build.xml"
+        FIRST_LINE_GLOB="*<project*" />
 
 <MODE NAME="antlr"		FILE="antlr.xml"
-				FILE_NAME_GLOB="*.g" />
+        FILE_NAME_GLOB="*.g" />
+
+<MODE NAME="antlr4"		FILE="antlr4.xml"
+        FILE_NAME_GLOB="*.g4" />
 
 <MODE NAME="apacheconf"		FILE="apacheconf.xml"
-				FILE_NAME_GLOB="{/etc/apache2/{*.conf,{conf.d,{mods,sites}-{available,enabled}}/*},*httpd*.conf}" />
+        FILE_NAME_GLOB="{/etc/apache2/{*.conf,{conf.d,{mods,sites}-{available,enabled}}/*},*httpd*.conf}" />
 
 <MODE NAME="apdl"		FILE="apdl.xml"
-				FILE_NAME_GLOB="*.{ans,inp,mak,mac}" />
+        FILE_NAME_GLOB="*.{ans,inp,mak,mac}" />
 
 <MODE NAME="applescript"	FILE="applescript.xml"
-				FILE_NAME_GLOB="*.applescript" />
+        FILE_NAME_GLOB="*.applescript" />
 
 <MODE NAME="asp"		FILE="asp.xml"
-				FILE_NAME_GLOB="*.{asp,asa}" />
+        FILE_NAME_GLOB="*.{asp,asa}" />
 
 <MODE NAME="aspect-j"		FILE="aspect-j.xml"
-				FILE_NAME_GLOB="*.aj" />
+        FILE_NAME_GLOB="*.aj" />
 
 <MODE NAME="assembly-agc"	FILE="assembly-agc.xml"
-				FILE_NAME_GLOB="*.agc" />
+        FILE_NAME_GLOB="*.agc" />
 
 <MODE NAME="assembly-ags"	FILE="assembly-ags.xml"
-				FILE_NAME_GLOB="*.aea" />
+        FILE_NAME_GLOB="*.aea" />
 
 <MODE NAME="assembly-m68k"	FILE="assembly-m68k.xml" />
 
 <MODE NAME="assembly-macro32"	FILE="assembly-macro32.xml"
-				FILE_NAME_GLOB="*.mar" />
+        FILE_NAME_GLOB="*.mar" />
 
 <MODE NAME="assembly-mcs51"	FILE="assembly-mcs51.xml" />
 
 <MODE NAME="assembly-r2000"	FILE="assembly-r2000.xml"
-				FILE_NAME_GLOB="*.mips" />
+        FILE_NAME_GLOB="*.mips" />
 
 <MODE NAME="assembly-parrot"	FILE="assembly-parrot.xml"
-				FILE_NAME_GLOB="*.pasm" />
+        FILE_NAME_GLOB="*.pasm" />
 
 <MODE NAME="assembly-x86"	FILE="assembly-x86.xml"
-				FILE_NAME_GLOB="*.asm" />
+        FILE_NAME_GLOB="*.asm" />
 
 <MODE NAME="avro"         FILE="avro.xml"
       FILE_NAME_GLOB="*.avdl" />
 
 <MODE NAME="awk"		FILE="awk.xml"
-				FILE_NAME_GLOB="*.awk"
-				FIRST_LINE_GLOB="#!*awk*" />
+        FILE_NAME_GLOB="*.awk"
+        FIRST_LINE_GLOB="#!*awk*" />
 
 <MODE NAME="b"			FILE="b.xml"
-				FILE_NAME_GLOB="*.{imp,ref,mch}" />
+        FILE_NAME_GLOB="*.{imp,ref,mch}" />
 
 <MODE NAME="batch"		FILE="batch.xml"
-				FILE_NAME_GLOB="*.{bat,cmd}" />
+        FILE_NAME_GLOB="*.{bat,cmd}" />
 
 <MODE NAME="bbj"		FILE="bbj.xml"
-				FILE_NAME_GLOB="*.bbj" />
+        FILE_NAME_GLOB="*.bbj" />
 
 <!-- if anyone knows a file name glob that can be used with this mode,
      please let me know -->
@@ -82,246 +88,249 @@
 <!-- Now that BeanShell 2.0 supports class declarations, its syntax is
      almost identical to Java. -->
 <MODE NAME="beanshell"		FILE="java.xml"
-				FILE_NAME_GLOB="*.bsh" />
+        FILE_NAME_GLOB="*.bsh" />
 
 <MODE NAME="bibtex"		FILE="bibtex.xml"
-				FILE_NAME_GLOB="*.bib" />
+        FILE_NAME_GLOB="*.bib" />
 
 <MODE NAME="binsource-agc"	FILE="binsource-agc.xml"
-				FILE_NAME_GLOB="*.binsource" />
+        FILE_NAME_GLOB="*.binsource" />
 <!-- We let c++ color the .h files -->
 <MODE NAME="c"			FILE="c.xml"
-				FILE_NAME_GLOB="*.c" />
+        FILE_NAME_GLOB="*.c" />
 
 <MODE NAME="cfscript"		FILE="cfscript.xml"
-				FILE_NAME_GLOB="*.cfc" />
+        FILE_NAME_GLOB="*.cfc" />
 
 <MODE NAME="chill"		FILE="chill.xml"
-				FILE_NAME_GLOB="*.{chl,mpol}" />
+        FILE_NAME_GLOB="*.{chl,mpol}" />
 
 <MODE NAME="cil"		FILE="cil.xml"
-				FILE_NAME_GLOB="*.il" />
+        FILE_NAME_GLOB="*.il" />
 
 <MODE NAME="clips"		FILE="clips.xml"
-				FILE_NAME_GLOB="*.clp" />
+        FILE_NAME_GLOB="*.clp" />
 
 <MODE NAME="clojure" 		FILE="clojure.xml"
-				FILE_NAME_GLOB="*.clj" />
+        FILE_NAME_GLOB="*.clj" />
 
 <MODE NAME="cmake"		FILE="cmake.xml"
-				FILE_NAME_GLOB="CMakeLists.txt"/>
+        FILE_NAME_GLOB="{CMakeLists.txt,*.cmake,*.cmake.*}"/>
 
 <MODE NAME="cobol"		FILE="cobol.xml"
-				FILE_NAME_GLOB="*.{cbl,cob}" />
+        FILE_NAME_GLOB="*.{cbl,cob}" />
 
 <MODE NAME="coffeescript"	FILE="coffeescript.xml"
-				FILE_NAME_GLOB="*.coffee" />
+        FILE_NAME_GLOB="*.coffee" />
 
 <MODE NAME="coldfusion"		FILE="coldfusion.xml"
-				FILE_NAME_GLOB="*.{cfm,dbm,cfc}" />
+        FILE_NAME_GLOB="*.{cfm,dbm,cfc}" />
 
 <MODE NAME='cplex-lp'  FILE='cplexlp.xml'
-					FILE_NAME_GLOB='*.lp'  />
+          FILE_NAME_GLOB='*.lp'  />
 
 <MODE NAME="c++"		FILE="cplusplus.xml"
-				FILE_NAME_GLOB="*.{cc,cpp,h,hh,hpp,cxx}" />
+        FILE_NAME_GLOB="*.{cc,cpp,h,hh,hpp,cxx}" />
 
 <MODE NAME="c#"			FILE="csharp.xml"
-				FILE_NAME_GLOB="*.cs" />
+        FILE_NAME_GLOB="*.cs" />
 
 <MODE NAME="css"		FILE="css.xml"
-				FILE_NAME_GLOB="*.css" />
+        FILE_NAME_GLOB="*.css" />
 
 <MODE NAME="csv" 		FILE="csv.xml"
-				FILE_NAME_GLOB="*.csv" />
+        FILE_NAME_GLOB="*.csv" />
 
 <MODE NAME="cvs-commit"		FILE="cvs-commit.xml"
-				FILE_NAME_GLOB="cvs*.tmp"/>
+        FILE_NAME_GLOB="cvs*.tmp"/>
 
 <MODE NAME="d"			FILE="d.xml"
-				FILE_NAME_GLOB="*.d" />
+        FILE_NAME_GLOB="*.d" />
 
 <MODE NAME="dart"			FILE="dart.xml"
-				FILE_NAME_GLOB="*.dart" />
+        FILE_NAME_GLOB="*.dart" />
 
 <MODE NAME="django"		FILE="django.xml"/>
 
 <MODE NAME="dot"		FILE="dot.xml"
-				FILE_NAME_GLOB="*.dot" />
+        FILE_NAME_GLOB="*.dot" />
 
 <MODE NAME="doxygen"		FILE="doxygen.xml"
-				FILE_NAME_GLOB="doxyfile*" />
+        FILE_NAME_GLOB="doxyfile*" />
 
 <MODE NAME="dsssl"		FILE="dsssl.xml"
-				FILE_NAME_GLOB="*.dsl" />
+        FILE_NAME_GLOB="*.dsl" />
 
 <MODE NAME="embperl"		FILE="embperl.xml"
-				FILE_NAME_GLOB="*.epl"/>
+        FILE_NAME_GLOB="*.epl"/>
 
 <MODE NAME="erlang"		FILE="erlang.xml"
-				FILE_NAME_GLOB="*.{erl,hrl}"/>
+        FILE_NAME_GLOB="*.{erl,hrl}"/>
 
 <MODE NAME="eiffel"		FILE="eiffel.xml"
-				FILE_NAME_GLOB="*.e" />
+        FILE_NAME_GLOB="*.e" />
 
 <MODE NAME="fhtml"		FILE="fhtml.xml"
-				FILE_NAME_GLOB="*.{furnace,fhtml}"/>
+        FILE_NAME_GLOB="*.{furnace,fhtml}"/>
 
 <MODE NAME="factor"		FILE="factor.xml"
-				FILE_NAME_GLOB="*.factor"/>
+        FILE_NAME_GLOB="*.factor"/>
 
 <MODE NAME="jflex"		FILE="jflex.xml"
-				FILE_NAME_GLOB="*.flex"/>
+        FILE_NAME_GLOB="*.flex"/>
 
 <MODE NAME="forth"		FILE="forth.xml"
-				FILE_NAME_GLOB="*.f" />
+        FILE_NAME_GLOB="*.f" />
 
 <MODE NAME="fortran"		FILE="fortran.xml"
-				FILE_NAME_GLOB="*.{for,fort,f77}" />
+        FILE_NAME_GLOB="*.{for,fort,f77}" />
 
 <MODE NAME="fortran90"		FILE="fortran90.xml"
-				FILE_NAME_GLOB="*.{f90,f95,f03}" />
+        FILE_NAME_GLOB="*.{f90,f95,f03}" />
 
 <MODE NAME="foxpro"		FILE="foxpro.xml"
-				FILE_NAME_GLOB="*.prg" />
+        FILE_NAME_GLOB="*.prg" />
 
 <MODE NAME="freemarker"		FILE="freemarker.xml"
-				FILE_NAME_GLOB="*.ftl"
-				FIRST_LINE_GLOB="<\#ftl*"/>
+        FILE_NAME_GLOB="*.ftl"
+        FIRST_LINE_GLOB="<\#ftl*"/>
 
 <MODE NAME="gcbasic" 		FILE="gcbasic.xml"
-				FILE_NAME_GLOB="*.{gc,gcb}"
-				FIRST_LINE_GLOB="{*GCBASIC*,*Great Cow BASIC*}" />
+        FILE_NAME_GLOB="*.{gc,gcb}"
+        FIRST_LINE_GLOB="{*GCBASIC*,*Great Cow BASIC*}" />
 
 <MODE NAME="gettext"		FILE="gettext.xml"
-				FILE_NAME_GLOB="*.{po,pot}" />
+        FILE_NAME_GLOB="*.{po,pot}" />
 
 <MODE NAME="gnuplot"		FILE="gnuplot.xml"
-				FILE_NAME_GLOB="*.{dem,plt}" />
+        FILE_NAME_GLOB="*.{dem,plt}" />
 
 <MODE NAME="go"			FILE="go.xml"
-				FILE_NAME_GLOB="*.go" />
+        FILE_NAME_GLOB="*.go" />
 
 <MODE NAME="gradle"		FILE="gradle.xml"
-				FILE_NAME_GLOB="*.{gradle}" />
+        FILE_NAME_GLOB="*.{gradle}" />
 
 <MODE NAME="groovy"		FILE="groovy.xml"
-				FILE_NAME_GLOB="*.{gant,groovy,grv}"/>
+        FILE_NAME_GLOB="*.{gant,groovy,grv}"/>
 
 <MODE NAME="gsp"			FILE="jsp.xml"
-				FILE_NAME_GLOB="*.{gsp}" />
+        FILE_NAME_GLOB="*.{gsp}" />
 
 <MODE NAME="haskell"		FILE="haskell.xml"
-				FILE_NAME_GLOB="*.hs" />
+        FILE_NAME_GLOB="*.hs" />
 
 <MODE NAME="haxe"		FILE="haxe.xml"
-				FILE_NAME_GLOB="*.hx" />
+        FILE_NAME_GLOB="*.hx" />
 
 <MODE NAME="hxml"		FILE="hxml.xml"
-				FILE_NAME_GLOB="*.hxml" />
+        FILE_NAME_GLOB="*.hxml" />
 
 <!-- Used by Andre Kaplan's Hex plugin -->
 <MODE NAME="hex"		FILE="hex.xml" />
 
 <MODE NAME="hlsl"		FILE="hlsl.xml"
-				FILE_NAME_GLOB="*.fx" />
+        FILE_NAME_GLOB="*.fx" />
 
 <MODE NAME="htaccess"			FILE="htaccess.xml"
-				FILE_NAME_GLOB=".htaccess" />
+        FILE_NAME_GLOB=".htaccess" />
 
 <MODE NAME="html"		FILE="html.xml"
-				FILE_NAME_GLOB="*.{html,htm,hta}" />
+        FILE_NAME_GLOB="*.{html,htm,hta}" />
 
 <MODE NAME="i4gl"		FILE="i4gl.xml"
-				FILE_NAME_GLOB="*.4gl" />
+        FILE_NAME_GLOB="*.4gl" />
 
 <MODE NAME="icalendar"		FILE="ical.xml"
-				FILE_NAME_GLOB="*.ics" />
+        FILE_NAME_GLOB="*.ics" />
 
 <MODE NAME="icon"		FILE="icon.xml"
-				FILE_NAME_GLOB="*.icn" />
+        FILE_NAME_GLOB="*.icn" />
 
 <MODE NAME="idl"		FILE="idl.xml"
-				FILE_NAME_GLOB="*.idl" />
+        FILE_NAME_GLOB="*.idl" />
 
 <MODE NAME="inform"		FILE="inform.xml"
-				FILE_NAME_GLOB="*.inf" />
+        FILE_NAME_GLOB="*.inf" />
 
 <MODE NAME="inno-setup"		FILE="inno-setup.xml"
-				FILE_NAME_GLOB="*.iss" />
+        FILE_NAME_GLOB="*.iss" />
 
 <MODE NAME="ini"		FILE="ini.xml"
-				FILE_NAME_GLOB="*.{ini,reg,milk}" />
+        FILE_NAME_GLOB="*.{ini,reg,milk}" />
 
 <MODE NAME="interlis"		FILE="interlis.xml"
-				FILE_NAME_GLOB="*.ili" />
+        FILE_NAME_GLOB="*.ili" />
 
 <MODE NAME="io"			FILE="io.xml"
-				FILE_NAME_GLOB="*.io" />
+        FILE_NAME_GLOB="*.io" />
 
 <MODE NAME="jamon"
       FILE="jamon.xml"
       FILE_NAME_GLOB="*.jamon" />
 
 <MODE NAME="javacc"		FILE="javacc.xml"
-				FILE_NAME_GLOB="*.{jj,jjt}"/>
+        FILE_NAME_GLOB="*.{jj,jjt}"/>
 
 <MODE NAME="java"		FILE="java.xml"
-				FILE_NAME_GLOB="*.java" />
+        FILE_NAME_GLOB="*.java" />
 
 <MODE NAME="javafx"		FILE="javafx.xml"
-				FILE_NAME_GLOB="*.fx" />
+        FILE_NAME_GLOB="*.fx" />
 
 <MODE NAME="javascript"		FILE="javascript.xml"
-				FILE_NAME_GLOB="{*.js,Buildsub}" />
+        FILE_NAME_GLOB="{*.js,Buildsub}" />
 
 <MODE NAME="jcl"		FILE="jcl.xml"
-				FILE_NAME_GLOB="*.jcl" />
+        FILE_NAME_GLOB="*.jcl" />
 
 <MODE NAME="jedit-actions"	FILE="jedit-actions.xml"
-				FILE_NAME_GLOB="actions.xml"/>
+        FILE_NAME_GLOB="actions.xml"/>
 
 <MODE NAME="jhtml"		FILE="jhtml.xml"
-				FILE_NAME_GLOB="*.jhtml" />
+        FILE_NAME_GLOB="*.jhtml" />
 
 <MODE NAME="jmk"		FILE="jmk.xml"
-				FILE_NAME_GLOB="*.jmk" />
+        FILE_NAME_GLOB="*.jmk" />
 
 <MODE NAME="json"		FILE="json.xml"
-				FILE_NAME_GLOB="*.json" />
+        FILE_NAME_GLOB="*.json" />
 
 <MODE NAME="jsp"		FILE="jsp.xml"
-				FILE_NAME_GLOB="*.{jsp,jsf,jspf,tag}" />
+        FILE_NAME_GLOB="*.{jsp,jsf,jspf,tag}" />
+
+<MODE NAME="kotlin" FILE="kotlin.xml"
+     FILE_NAME_GLOB="*.{kt,ks,kts,jetl}"/>
 
 <!-- Note that a generic 'tex.xml' is included as well, for minimal
      plain TeX/AMSTeX highlighting. -->
 
 <MODE NAME="latex"		FILE="latex.xml"
-				FILE_NAME_GLOB="*.{tex,sty,ltx}" />
+        FILE_NAME_GLOB="*.{tex,sty,ltx}" />
 
 <MODE NAME="lex"		FILE="lex.xml"
-				FILE_NAME_GLOB="*.l" />
+        FILE_NAME_GLOB="*.l" />
 
 <MODE NAME="lilypond"		FILE="lilypond.xml"
-				FILE_NAME_GLOB="*.{ly,ily}" />
+        FILE_NAME_GLOB="*.{ly,ily}" />
 
 <MODE NAME="lisp"		FILE="lisp.xml"
-				FILE_NAME_GLOB="*.{lisp,lsp,el}" />
+        FILE_NAME_GLOB="*.{lisp,lsp,el}" />
 
 <MODE NAME="literate-haskell"	FILE="literate-haskell.xml"
-				FILE_NAME_GLOB="*.lhs" />
+        FILE_NAME_GLOB="*.lhs" />
 
 <MODE NAME="logs"		FILE="logs.xml"
-				FILE_NAME_GLOB="*.log" />
+        FILE_NAME_GLOB="*.log" />
 
 <MODE NAME="logtalk"		FILE="logtalk.xml"
-				FILE_NAME_GLOB="*.lgt" />
+        FILE_NAME_GLOB="*.lgt" />
 
 <MODE NAME="lotos"		FILE="lotos.xml"
-				FILE_NAME_GLOB="*.{lot,lotos}"/>
+        FILE_NAME_GLOB="*.{lot,lotos}"/>
 
 <MODE NAME="lua"		FILE="lua.xml"
-				FILE_NAME_GLOB="*.lua" />
+        FILE_NAME_GLOB="*.lua" />
 
 <MODE NAME="macroscheduler"		FILE="macroscheduler.xml"
         FILE_NAME_GLOB="*.scp" />
@@ -329,92 +338,98 @@
 <MODE NAME="mail"		FILE="mail.xml" />
 
 <MODE NAME="makefile"		FILE="makefile.xml"
-				FILE_NAME_GLOB="*makefile" />
+        FILE_NAME_GLOB="*makefile" />
 
 <MODE NAME="maple"		FILE="maple.xml"
-				FILE_NAME_GLOB="*.{mpl,mws}" />
+        FILE_NAME_GLOB="*.{mpl,mws}" />
+
+<MODE NAME="markdown" FILE="markdown.xml"
+        FILE_NAME_GLOB="*.md" />
 
 <MODE NAME="maven"		FILE="maven.xml"
-				FILE_NAME_GLOB="pom.xml"/>
+        FILE_NAME_GLOB="pom.xml"/>
 
 <MODE NAME="metapost"
          FILE="mpost.xml"
          FILE_NAME_GLOB="*.mp"/>
 
 <MODE NAME="mxml"		FILE="mxml.xml"
-				FILE_NAME_GLOB="*.mxml" />
+        FILE_NAME_GLOB="*.mxml" />
 
 <MODE NAME="ml"			FILE="ml.xml"
-				FILE_NAME_GLOB="*.{sml,ml}" />
+        FILE_NAME_GLOB="*.{sml,ml}" />
 
 <MODE NAME="modula3"		FILE="modula3.xml"
-				FILE_NAME_GLOB="*.[im]3" />
+        FILE_NAME_GLOB="*.[im]3" />
 
 <MODE NAME="moin"		FILE="moin.xml"
-				FILE_NAME_GLOB="*.moin" />
+        FILE_NAME_GLOB="*.moin" />
 
 <MODE NAME="mqsc"		FILE="mqsc.xml"
-				FILE_NAME_GLOB="*.mqsc" />
+        FILE_NAME_GLOB="*.mqsc" />
+
+<MODE NAME="mustache-template" FILE="mustache.xml"
+        FILE_NAME_GLOB="*.mustache" />
 
 <MODE NAME="myghty"		FILE="myghty.xml"
-				FILE_NAME_GLOB="{autohandler,dhandler,*.myt}"/>
+        FILE_NAME_GLOB="{autohandler,dhandler,*.myt}"/>
 
 <MODE NAME="mysql"		FILE="mysql.xml" />
 
 <MODE NAME="n3"			FILE="n3.xml"
-				FILE_NAME_GLOB="*.n3" />
+        FILE_NAME_GLOB="*.n3" />
 
 <MODE NAME="netrexx"		FILE="netrexx.xml"
-				FILE_NAME_GLOB="*.nrx" />
+        FILE_NAME_GLOB="*.nrx" />
 
 <MODE NAME="nqc"		FILE="nqc.xml"
-				FILE_NAME_GLOB="*.nqc" />
+        FILE_NAME_GLOB="*.nqc" />
 
 <MODE NAME="nsis2"		FILE="nsis2.xml"
-				FILE_NAME_GLOB="*.{nsi,nsh}" />
+        FILE_NAME_GLOB="*.{nsi,nsh}" />
 
 <MODE NAME="objective-c"	FILE="objective-c.xml"
-				FILE_NAME_GLOB="*.{objc,m}" />
+        FILE_NAME_GLOB="*.{objc,m}" />
 
 <MODE NAME="objectrexx"		FILE="objectrexx.xml"
-				FILE_NAME_GLOB="*.{rex,orx}" />
+        FILE_NAME_GLOB="*.{rex,orx}" />
 
 <MODE NAME="occam"		FILE="occam.xml"
-				FILE_NAME_GLOB="*.icc" />
+        FILE_NAME_GLOB="*.icc" />
 
 <MODE NAME="omnimark"		FILE="omnimark.xml"
-				FILE_NAME_GLOB="*.x{om,in}" />
+        FILE_NAME_GLOB="*.x{om,in}" />
 
 <MODE NAME="outline"		FILE="outline.xml"
-				FILE_NAME_GLOB="*.{outline}" />
+        FILE_NAME_GLOB="*.{outline}" />
 
 <MODE NAME="pascal"		FILE="pascal.xml"
-				FILE_NAME_GLOB="*.{pas,dpr,dpk}" />
+        FILE_NAME_GLOB="*.{pas,dpr,dpk}" />
 
 <MODE NAME="patch"		FILE="patch.xml"
-				FILE_NAME_GLOB="*.{diff,patch}"
-				FIRST_LINE_GLOB="{# HG changeset patch,diff --git *}" />
+        FILE_NAME_GLOB="*.{diff,patch}"
+        FIRST_LINE_GLOB="{# HG changeset patch,diff --git *}" />
 
 <MODE NAME="perl"		FILE="perl.xml"
-				FILE_NAME_GLOB="*.p{[lmh],od}"
-				FIRST_LINE_GLOB="#!/*perl*" />
+        FILE_NAME_GLOB="*.p{[lmh],od}"
+        FIRST_LINE_GLOB="#!/*perl*" />
 
 <MODE NAME="php"		FILE="php.xml"
-				FILE_NAME_GLOB="*.{php3,php4,php,phtml,inc}"
-				FIRST_LINE_GLOB="{<\?php*,#!/*php*}" />
+        FILE_NAME_GLOB="*.{php3,php4,php,phtml,inc}"
+        FIRST_LINE_GLOB="{<\?php*,#!/*php*}" />
 
 <MODE NAME="pike"		FILE="pike.xml"
-				FILE_NAME_GLOB="*.{pike,pmod}" />
+        FILE_NAME_GLOB="*.{pike,pmod}" />
 
 <MODE NAME="plaintex"		FILE="plaintex.xml" />
 
 <MODE NAME="PostgreSQL" FILE="pg-sql.xml"
-							FILE_NAME_GLOB="*.{pg_sql,pg-sql}" />
+              FILE_NAME_GLOB="*.{pg_sql,pg-sql}" />
 
 <MODE NAME="PowerCenter Parameter File"
     FILE="powercenter_parameter_file.xml" FILE_NAME_GLOB="*.par" />
-							
-							
+
+
 <MODE NAME="pl-sql"		FILE="osql.xml"
                            FILE_NAME_GLOB="*.{pls,sql}" />
 
@@ -422,102 +437,108 @@
 <MODE NAME="pl-sql9"		FILE="pl-sql.xml" />
 
 <MODE NAME="pl1"		FILE="pl1.xml"
-				FILE_NAME_GLOB="*.pl[i1]" />
+        FILE_NAME_GLOB="*.pl[i1]" />
 
 <MODE NAME="pop11"		FILE="pop11.xml"
-				FILE_NAME_GLOB="*.{p,pop11,p11}" />
+        FILE_NAME_GLOB="*.{p,pop11,p11}" />
 
 <MODE NAME="postscript"		FILE="postscript.xml"
-				FILE_NAME_GLOB="*.{ps,eps}" />
+        FILE_NAME_GLOB="*.{ps,eps}" />
 
 <MODE NAME="povray"		FILE="povray.xml"
-				FILE_NAME_GLOB="*.{pov,povray}" />
+        FILE_NAME_GLOB="*.{pov,povray}" />
 
 <MODE NAME="powerdynamo"	FILE="powerdynamo.xml"
-				FILE_NAME_GLOB="*.{ssc,stm}" />
+        FILE_NAME_GLOB="*.{ssc,stm}" />
 
 <MODE NAME="powershell"		FILE="powershell.xml"
-				FILE_NAME_GLOB="*.{ps1,psm1,psd1}" />
+        FILE_NAME_GLOB="*.{ps1,psm1,psd1}" />
 
 <MODE NAME="prolog"		FILE="prolog.xml"
-				FILE_NAME_GLOB="*.pro" />
+        FILE_NAME_GLOB="*.pro" />
 
 <MODE NAME="progress"		FILE="progress.xml"
-				FILE_NAME_GLOB="*.[piw]" />
+        FILE_NAME_GLOB="*.[piw]" />
 
 <MODE NAME="properties"		FILE="props.xml"
-				FILE_NAME_GLOB="*{properties,props}" />
+        FILE_NAME_GLOB="*{properties,props}" />
 
 <MODE NAME="psp"		FILE="psp.xml"
-				FILE_NAME_GLOB="*.psp" />
+        FILE_NAME_GLOB="*.psp" />
 
 <MODE NAME="ptl"		FILE="ptl.xml"
-				FILE_NAME_GLOB="*.ptl"/>
+        FILE_NAME_GLOB="*.ptl"/>
 
 <MODE NAME="pure"		FILE="pure.xml"
-				FILE_NAME_GLOB="*.pure"
-				FIRST_LINE_GLOB="#!*/*pure"/>
+        FILE_NAME_GLOB="*.pure"
+        FIRST_LINE_GLOB="#!*/*pure"/>
 
 <MODE NAME="pvwave"		FILE="pvwave.xml"
-				FILE_NAME_GLOB="*.jou" />
+        FILE_NAME_GLOB="*.jou" />
 
 <MODE NAME="pyrex"		FILE="pyrex.xml"
-				FILE_NAME_GLOB="*.{pyx}" />
+        FILE_NAME_GLOB="*.{pyx}" />
 
 <MODE NAME="python"		FILE="python.xml"
-				FILE_NAME_GLOB="*.{py,pyw,sc,jy}"
-				FIRST_LINE_GLOB="#!*/*python*" />
+        FILE_NAME_GLOB="*.{py,pyw,sc,jy}"
+        FIRST_LINE_GLOB="#!*/*python*" />
 
 <MODE NAME="rebol"		FILE="rebol.xml"
-				FILE_NAME_GLOB="*.r" />
+        FILE_NAME_GLOB="*.r" />
 
 <MODE NAME="redcode"		FILE="redcode.xml"
-				FILE_NAME_GLOB="*.{red,rc}" />
+        FILE_NAME_GLOB="*.{red,rc}" />
 
 <MODE NAME="relax-ng-compact"	FILE="relax-ng-compact.xml"
-				FILE_NAME_GLOB="*.rnc" />
+        FILE_NAME_GLOB="*.rnc" />
 
 <MODE NAME="renderman-rib"	FILE="rib.xml"
-				FILE_NAME_GLOB="*.rib" />
+        FILE_NAME_GLOB="*.rib" />
 
 <MODE NAME="rd"			FILE="rd.xml"
-				FILE_NAME_GLOB="*.rd" />
+        FILE_NAME_GLOB="*.rd" />
 
 <MODE NAME="rest"		FILE="rest.xml"
-				FILE_NAME_GLOB="*.{rst,rest}"
-				FIRST_LINE_GLOB="{===,~~~}*"/>
+        FILE_NAME_GLOB="*.{rst,rest}"
+        FIRST_LINE_GLOB="{===,~~~}*"/>
+
+<MODE NAME="rfc"		FILE="rfc.xml"
+        FILE_NAME_GLOB="rfc*.txt" />
 
 <MODE NAME="rhtml"		FILE="rhtml.xml"
-				FILE_NAME_GLOB="*.{rhtml,html.erb}" />
+        FILE_NAME_GLOB="*.{rhtml,html.erb}" />
 
 <MODE NAME="roff"
         FILE="roff.xml"
         FILE_NAME_GLOB="*.{1,2,3,4,5,6,7,8,9,me,ms,mm,mom,tmac}" />
 
 <MODE NAME="rpm-spec"		FILE="rpmspec.xml"
-				FILE_NAME_GLOB="*.spec" />
+        FILE_NAME_GLOB="*.spec" />
 
 <MODE NAME="rtf"		FILE="rtf.xml"
-				FILE_NAME_GLOB="*.rtf" />
+        FILE_NAME_GLOB="*.rtf" />
 
 <MODE NAME="rakefile"   FILE="ruby.xml"
-				FILE_NAME_GLOB="*Rakefile" />
+        FILE_NAME_GLOB="*Rakefile" />
 
 <MODE NAME="ruby"		FILE="ruby.xml"
-				FILE_NAME_GLOB="*.{rb,rbw}"
-				FIRST_LINE_GLOB="#!*/*ruby*" />
+        FILE_NAME_GLOB="*.{rb,rbw}"
+        FIRST_LINE_GLOB="#!*/*ruby*" />
+
+<MODE NAME="rust"		FILE="rust.xml"
+				FILE_NAME_GLOB="*.rs" />
 
 <MODE NAME="rview"		FILE="rview.xml"
-				FILE_NAME_GLOB="*.rvw" />
+        FILE_NAME_GLOB="*.rvw" />
 
 <MODE NAME="s+"			FILE="splus.xml"
-				FILE_NAME_GLOB="*.ssc" />
+        FILE_NAME_GLOB="*.ssc" />
 
 <MODE NAME="s#"			FILE="ssharp.xml"
-				FILE_NAME_GLOB="*.{ss,ssc,ssi,ssw,sts,aml}"  />
+        FILE_NAME_GLOB="*.{ss,ssc,ssi,ssw,sts,aml}"  />
 
 <MODE NAME="sas"		FILE="sas.xml"
-				FILE_NAME_GLOB="*.sas" />
+        FILE_NAME_GLOB="*.sas" />
 
 <MODE NAME="sbt" FILE="scala.xml"
         FILE_NAME_GLOB="*.sbt" />
@@ -526,137 +547,132 @@
         FILE_NAME_GLOB="*.scala" />
 
 <MODE NAME="scheme"		FILE="scheme.xml"
-				FILE_NAME_GLOB="*.scm" />
+        FILE_NAME_GLOB="*.scm" />
 
 <MODE NAME="sgml"		FILE="sgml.xml"
-				FILE_NAME_GLOB="*.{sgml,sgm,dtd}" />
+        FILE_NAME_GLOB="*.{sgml,sgm,dtd}" />
 
 <MODE NAME="sip"		FILE="sip.xml" />
 
 <MODE NAME="rcp" 		FILE="rcp.xml"
-				FILE_NAME_GLOB="*.rcp" />
+        FILE_NAME_GLOB="*.rcp" />
 
 <MODE NAME="shellscript"	FILE="shellscript.xml"
-				FILE_NAME_GLOB="*.{csh,sh,bash,login,profile,bashrc,bash_profile}"
-				FIRST_LINE_GLOB="#!/*sh*" />
+        FILE_NAME_GLOB="*.{csh,sh,bash,login,profile,bashrc,bash_profile}"
+        FIRST_LINE_GLOB="#!/*sh*" />
 
 <MODE NAME="shtml"		FILE="shtml.xml"
-				FILE_NAME_GLOB="*.{shtml,shtm,ssi}" />
+        FILE_NAME_GLOB="*.{shtml,shtm,ssi}" />
 
 <MODE NAME="slate"		FILE="slate.xml"
-				FILE_NAME_GLOB="*.slate" />
+        FILE_NAME_GLOB="*.slate" />
 
 <MODE NAME="slax"		FILE="slax.xml"
-				FILE_NAME_GLOB="*.slax" />
+        FILE_NAME_GLOB="*.slax" />
 
 <MODE NAME="smalltalk"		FILE="smalltalk.xml"
-				FILE_NAME_GLOB="*.{st,sources,changes}" />
+        FILE_NAME_GLOB="*.{st,sources,changes}" />
 
 <MODE NAME="smarty"		FILE="smarty.xml"
-				FILE_NAME_GLOB="*.tpl"/>
+        FILE_NAME_GLOB="*.tpl"/>
 
 <MODE NAME="sdl/pr"		FILE="sdl_pr.xml"
-				FILE_NAME_GLOB="*.pr"/>
+        FILE_NAME_GLOB="*.pr"/>
 
 <MODE NAME="sql-loader" 	FILE="sql-loader.xml"
-				FILE_NAME_GLOB="*.ctl" />
+        FILE_NAME_GLOB="*.ctl" />
 
 <MODE NAME="smi-mib"		FILE="smi-mib.xml"
-				FILE_NAME_GLOB="*{.mib,-MIB.txt}" />
+        FILE_NAME_GLOB="*{.mib,-MIB.txt}" />
 
 <MODE NAME="sqr"		FILE="sqr.xml"
-				FILE_NAME_GLOB="*.{sqr,sqc}" />
+        FILE_NAME_GLOB="*.{sqr,sqc}" />
 
 <MODE NAME="squidconf"		FILE="squidconf.xml"
-				FILE_NAME_GLOB="squid.conf" />
+        FILE_NAME_GLOB="squid.conf" />
 
 <MODE NAME="stata"     FILE="stata.xml"
-				FILE_NAME_GLOB="*.{do,ado,mata}" />
+        FILE_NAME_GLOB="*.{do,ado,mata}" />
 
 <MODE NAME="svn-commit"		FILE="svn-commit.xml"
-				FILE_NAME_GLOB="svn-commit*.tmp" />
+        FILE_NAME_GLOB="svn-commit*.tmp" />
 
 <MODE NAME="swig"		FILE="swig.xml"
-				FILE_NAME_GLOB="*.{i,swg}" />
+        FILE_NAME_GLOB="*.{i,swg}" />
 
 <MODE NAME="tcl"		FILE="tcl.xml"
-				FILE_NAME_GLOB="*.{tcl,tsh}" />
+        FILE_NAME_GLOB="*.{tcl,tsh}" />
 
 <MODE NAME="texinfo"		FILE="texinfo.xml"
-				FILE_NAME_GLOB="*.texi" />
+        FILE_NAME_GLOB="*.texi" />
 
 <MODE NAME="tex"		FILE ="tex.xml" />
 
 
 <MODE NAME="text"		FILE="text.xml"
-				FILE_NAME_GLOB="*.txt" />
-
-<!-- This mode MUST be placed after text mode
-     because filename globs are checked in reverse order -->
-<MODE NAME="rfc"		FILE="rfc.xml"
-				FILE_NAME_GLOB="rfc*.txt" />
+        FILE_NAME_GLOB="*.txt" />
 
 <MODE NAME="tld"		FILE="tld.xml"
-				FILE_NAME_GLOB="*.tld"/>
+        FILE_NAME_GLOB="*.tld"/>
 
 <MODE NAME="tsp"		FILE="tsp.xml"
-				FILE_NAME_GLOB="*.tsp" />
+        FILE_NAME_GLOB="*.tsp" />
 
 <MODE NAME="transact-sql"	FILE="tsql.xml" />
 
 <MODE NAME="template-toolkit"	FILE="tthtml.xml"
-				FILE_NAME_GLOB="*.tt{html,css,js}" />
+        FILE_NAME_GLOB="*.tt{html,css,js}" />
 
 <MODE NAME="twiki"		FILE="twiki.xml"
-				FILE_NAME_GLOB="*.twiki"/>
+        FILE_NAME_GLOB="*.twiki"/>
 
 <MODE NAME="typoscript"		FILE="typoscript.xml"
-				FILE_NAME_GLOB="*.ts"/>
+        FILE_NAME_GLOB="*.ts"/>
 
 <MODE NAME='url'		FILE='url.xml'
-				FILE_NAME_GLOB='*.url' />
+        FILE_NAME_GLOB='*.url' />
 
 <MODE NAME="uscript"		FILE="uscript.xml"
-				FILE_NAME_GLOB="*.uc" />
+        FILE_NAME_GLOB="*.uc" />
 
 <MODE NAME="vala"		FILE="vala.xml"
-				FILE_NAME_GLOB="*.vala" />
+        FILE_NAME_GLOB="*.vala" />
 
 <MODE NAME="vbscript"		FILE="vbscript.xml"
-				FILE_NAME_GLOB="*.{vbs,bas,cls}" />
+        FILE_NAME_GLOB="*.{vbs,bas,cls}" />
 
 <MODE NAME="velocity"		FILE="velocity_pure.xml"
-				FILE_NAME_GLOB="*.vm" />
+        FILE_NAME_GLOB="*.vm" />
 
 <MODE NAME="verilog"		FILE="verilog.xml"
-				FILE_NAME_GLOB="*.{ver,v,sv}" />
+        FILE_NAME_GLOB="*.{ver,v,sv}" />
 
 <MODE NAME="vhdl"		FILE="vhdl.xml"
-				FILE_NAME_GLOB="*.vh*" />
+        FILE_NAME_GLOB="*.vh*" />
 
 <MODE NAME="visualbasic"	FILE="visualbasic.xml"
-				FILE_NAME_GLOB="*.{vb}" />
+        FILE_NAME_GLOB="*.{vb}" />
 
 <MODE NAME="vrml2"		FILE="vrml2.xml"
-				FILE_NAME_GLOB="*.{wrl,wrz}"/>
+        FILE_NAME_GLOB="*.{wrl,wrz}"/>
 
 <MODE NAME="xml"		FILE="xml.xml"
-				FILE_NAME_GLOB="*.{xml,xhtml,xsd,qrc,ui,docbook}"
-				FIRST_LINE_GLOB="<\?xml*" />
+        FILE_NAME_GLOB="*.{xml,xhtml,xsd,qrc,ui,docbook}"
+        FIRST_LINE_GLOB="<\?xml*" />
 
 <MODE NAME="xq"			FILE="xq.xml"
-				FILE_NAME_GLOB="*.x{q,qm,ql}" />
+        FILE_NAME_GLOB="*.x{q,qm,ql}" />
 
 <MODE NAME="xsl"		FILE="xsl.xml"
-				FILE_NAME_GLOB="*.xsl" />
+        FILE_NAME_GLOB="*.xsl" />
 
 <MODE NAME="yab"		FILE="yab.xml"
-				FILE_NAME_GLOB="*.yab" />
+        FILE_NAME_GLOB="*.yab" />
 
 <MODE NAME="yaml"		FILE="yaml.xml"
-				FILE_NAME_GLOB="*.{yml,yaml}" />
+        FILE_NAME_GLOB="*.{yml,yaml}" />
 
 <MODE NAME="zpt"		FILE="zpt.xml"
-				FILE_NAME_GLOB="*.{pt,zpt}"/>
+        FILE_NAME_GLOB="*.{pt,zpt}"/>
 
 </MODES>
diff --git a/modes/cfscript.xml b/modes/cfscript.xml
index 7032a67..47bc736 100644
--- a/modes/cfscript.xml
+++ b/modes/cfscript.xml
@@ -80,15 +80,21 @@
 			<KEYWORD1>delete</KEYWORD1>
 			<KEYWORD1>do</KEYWORD1>
 			<KEYWORD1>else</KEYWORD1>
+			<KEYWORD1>exit</KEYWORD1>
 			<KEYWORD1>finally</KEYWORD1>
 			<KEYWORD1>for</KEYWORD1>
 			<KEYWORD1>function</KEYWORD1>
 			<KEYWORD1>if</KEYWORD1>
 			<KEYWORD1>in</KEYWORD1>
 			<KEYWORD1>new</KEYWORD1>
+			<KEYWORD1>pageencoding</KEYWORD1>
+			<KEYWORD1>rethrow</KEYWORD1>
 			<KEYWORD1>return</KEYWORD1>
+			<KEYWORD1>savecontent</KEYWORD1>
 			<KEYWORD1>switch</KEYWORD1>
+			<KEYWORD1>thread</KEYWORD1>
 			<KEYWORD1>throw</KEYWORD1>
+			<KEYWORD1>transaction</KEYWORD1>
 			<KEYWORD1>try</KEYWORD1>
 			<KEYWORD1>typeof</KEYWORD1>
 			<KEYWORD1>var</KEYWORD1>
@@ -113,13 +119,16 @@
 			<KEYWORD3>array</KEYWORD3>
 			<KEYWORD3>any</KEYWORD3>
 			<KEYWORD3>query</KEYWORD3>
+			<KEYWORD3>mail</KEYWORD3>
 			<KEYWORD3>void</KEYWORD3>
 			
 			<!-- component related -->
 			<KEYWORD3>component</KEYWORD3>
 			<KEYWORD1>implements</KEYWORD1>
+			<KEYWORD1>interface</KEYWORD1>
 			<KEYWORD1>extends</KEYWORD1>
 			<KEYWORD1>include</KEYWORD1>
+			<KEYWORD1>import</KEYWORD1>
 			
 			<!-- access types -->
 			<KEYWORD1>private</KEYWORD1>
@@ -619,18 +628,23 @@
 			
 			<!-- ColdFusion Operators -->
 			<OPERATOR>IS</OPERATOR>
-			<OPERATOR>EQ</OPERATOR>
-			<OPERATOR>NEQ</OPERATOR>
-			<OPERATOR>GT</OPERATOR>
-			<OPERATOR>GTE</OPERATOR>
-			<OPERATOR>LT</OPERATOR>
-			<OPERATOR>LTE</OPERATOR>
+			<OPERATOR>EQ</OPERATOR><OPERATOR>EQUAL</OPERATOR>
+			<OPERATOR>EQV</OPERATOR>
+			<OPERATOR>NEQ</OPERATOR><OPERATOR>IS NOT</OPERATOR><OPERATOR>NOT EQUAL</OPERATOR>
+			<OPERATOR>GT</OPERATOR><OPERATOR>GREATER THAN</OPERATOR>
+			<OPERATOR>GTE</OPERATOR><OPERATOR>GE</OPERATOR>
+			<OPERATOR>LT</OPERATOR><OPERATOR>LESS THAN</OPERATOR>
+			<OPERATOR>LTE</OPERATOR><OPERATOR>LE</OPERATOR>
 	
 			<OPERATOR>LESS</OPERATOR>
 			<OPERATOR>GREATER</OPERATOR>
 			<OPERATOR>THAN</OPERATOR>
 			
+			<OPERATOR>CONTAINS</OPERATOR>
+			<OPERATOR>DOES NOT CONTAIN</OPERATOR>
+			
 			<OPERATOR>AND</OPERATOR>
+			<OPERATOR>IMP</OPERATOR>
 			<OPERATOR>OR</OPERATOR>
 			<OPERATOR>NOT</OPERATOR>
 			<OPERATOR>XOR</OPERATOR>
diff --git a/modes/clojure.xml b/modes/clojure.xml
index 03a63d1..a043b5e 100644
--- a/modes/clojure.xml
+++ b/modes/clojure.xml
@@ -6,124 +6,143 @@
     This file is partially based on lisp.xml and mostly in
     the documentation found at: http://clojure.org/
 
-    author: dsm
-    date:   24/10/08
-    version:0.1
+    Why are you looking at this file?
+      Do the symbols handled by this file seem out of date?
+      Want to do something about it?
+      Do you know Clojure?
+      Do you use linux?
+        (or are you knowledgeable enought to translate to your os?)
+
+    Verify file coverage of Clojure namespace symbols using code in:
+      misc/clojure
+    in the standard jEdit source tree. See misc/clojure/README.txt for details.
+
+    author: dsm 2008-10-24 0.1
+    author: mma 2015-03-29 0.2
 -->
 
 <MODE>
-	<PROPS>
-		<PROPERTY NAME="lineComment" VALUE=";" />
-		<PROPERTY NAME="noWordSep" VALUE=".*+!-_?/" />
-		<PROPERTY NAME="unalignedOpenBrackets" VALUE="(" />
-		<PROPERTY NAME="unalignedCloseBrackets" VALUE=")" />
-		<PROPERTY NAME="multipleBracketIndent" VALUE="true" />
-	</PROPS>
-	<RULES  IGNORE_CASE="FALSE"
-		    HIGHLIGHT_DIGITS="TRUE"
-            NO_WORD_SEP=".*+!-_?/"
-            DIGIT_RE="([0-9]+)|(([0-9]*\.[0-9]+)M?)|([0-9]+/[0-9]+)">
+    <PROPS>
+        <PROPERTY NAME="lineComment" VALUE=";" />
+        <PROPERTY NAME="noWordSep" VALUE=".*+!-_?/" />
+        <PROPERTY NAME="unalignedOpenBrackets" VALUE="(" />
+        <PROPERTY NAME="unalignedCloseBrackets" VALUE=")" />
+        <PROPERTY NAME="multipleBracketIndent" VALUE="true" />
+    </PROPS>
+
+    <RULES  IGNORE_CASE="FALSE"
+                HIGHLIGHT_DIGITS="TRUE"
+        NO_WORD_SEP=".*+!-_?/"
+        DIGIT_RE="([0-9]+)|(([0-9]*\.[0-9]+)M?)|([0-9]+/[0-9]+)">
         <!-- S-exps / lists.
              Quoted first so as to not break the normal ones.
              This is highly repetitive, there must be a better way
         -->
-		<SPAN TYPE="MARKUP" DELEGATE="MAIN">
-			<BEGIN>#^(</BEGIN>
-			<END>)</END>
-		</SPAN>
-		<SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>@(</BEGIN>
-			<END>)</END>
-		</SPAN>
-		<SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>^(</BEGIN>
-			<END>)</END>
-		</SPAN>
-		<SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>`(</BEGIN>
-			<END>)</END>
-		</SPAN>
-		<SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>'(</BEGIN>
-			<END>)</END>
-		</SPAN>
-		<SPAN TYPE="FUNCTION" DELEGATE="MAIN">
-			<BEGIN>#(</BEGIN>
-			<END>)</END>
-		</SPAN>
-		<SPAN TYPE="MARKUP" DELEGATE="MAIN">
-			<BEGIN>(</BEGIN>
-			<END>)</END>
-		</SPAN>
+        <SPAN TYPE="KEYWORD4" DELEGATE="MAIN">
+            <BEGIN>*</BEGIN>
+            <END>*</END>
+        </SPAN>
+        <SPAN TYPE="MARKUP" DELEGATE="MAIN">
+            <BEGIN>#^(</BEGIN>
+            <END>)</END>
+        </SPAN>
+        <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
+            <BEGIN>@(</BEGIN>
+            <END>)</END>
+        </SPAN>
+        <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
+            <BEGIN>^(</BEGIN>
+            <END>)</END>
+        </SPAN>
+        <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
+            <BEGIN>`(</BEGIN>
+            <END>)</END>
+        </SPAN>
+        <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
+            <BEGIN>'(</BEGIN>
+            <END>)</END>
+        </SPAN>
+        <SPAN TYPE="COMMENT3" DELEGATE="MAIN">
+            <BEGIN>#_(</BEGIN>
+            <END>)</END>
+        </SPAN>
+        <SPAN TYPE="KEYWORD1" DELEGATE="MAIN">
+            <BEGIN>#(</BEGIN>
+            <END>)</END>
+        </SPAN>
+        <SPAN TYPE="MARKUP" DELEGATE="MAIN">
+            <BEGIN>(</BEGIN>
+            <END>)</END>
+        </SPAN>
 
         <!-- Vectors -->
-		<SPAN TYPE="MARKUP" DELEGATE="MAIN">
-			<BEGIN>#^[</BEGIN>
-			<END>]</END>
-		</SPAN>
-		<SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>@[</BEGIN>
-			<END>]</END>
-		</SPAN>
-		<SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>^[</BEGIN>
-			<END>]</END>
-		</SPAN>
-		<SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>'[</BEGIN>
-			<END>]</END>
-		</SPAN>
-		<SPAN TYPE="LABEL" DELEGATE="MAIN">
-			<BEGIN>[</BEGIN>
-			<END>]</END>
-		</SPAN>
+        <SPAN TYPE="MARKUP" DELEGATE="MAIN">
+            <BEGIN>#^[</BEGIN>
+            <END>]</END>
+        </SPAN>
+        <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
+            <BEGIN>@[</BEGIN>
+            <END>]</END>
+        </SPAN>
+        <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
+            <BEGIN>^[</BEGIN>
+            <END>]</END>
+        </SPAN>
+        <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
+            <BEGIN>'[</BEGIN>
+            <END>]</END>
+        </SPAN>
+        <SPAN TYPE="LABEL" DELEGATE="MAIN">
+            <BEGIN>[</BEGIN>
+            <END>]</END>
+        </SPAN>
 
         <!-- Maps -->
-		<SPAN TYPE="MARKUP" DELEGATE="MAIN">
-			<BEGIN>#^{</BEGIN>
-			<END>}</END>
-		</SPAN>
+        <SPAN TYPE="MARKUP" DELEGATE="MAIN">
+            <BEGIN>#^{</BEGIN>
+            <END>}</END>
+        </SPAN>
         <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>@{</BEGIN>
-			<END>}</END>
-		</SPAN>
+            <BEGIN>@{</BEGIN>
+            <END>}</END>
+        </SPAN>
         <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>^{</BEGIN>
-			<END>}</END>
-		</SPAN>
+            <BEGIN>^{</BEGIN>
+            <END>}</END>
+        </SPAN>
         <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>'{</BEGIN>
-			<END>}</END>
-		</SPAN>
-		<SPAN TYPE="LABEL" DELEGATE="MAIN">
-			<BEGIN>{</BEGIN>
-			<END>}</END>
-		</SPAN>
+            <BEGIN>'{</BEGIN>
+            <END>}</END>
+        </SPAN>
+        <SPAN TYPE="LABEL" DELEGATE="MAIN">
+            <BEGIN>{</BEGIN>
+            <END>}</END>
+        </SPAN>
 
         <!-- Sets -->
-		<SPAN TYPE="MARKUP" DELEGATE="MAIN">
-			<BEGIN>#^#{</BEGIN>
-			<END>}</END>
-		</SPAN>
+        <SPAN TYPE="MARKUP" DELEGATE="MAIN">
+            <BEGIN>#^#{</BEGIN>
+            <END>}</END>
+        </SPAN>
         <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>@#{</BEGIN>
-			<END>}</END>
-		</SPAN>
+            <BEGIN>@#{</BEGIN>
+            <END>}</END>
+        </SPAN>
         <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>^#{</BEGIN>
-			<END>}</END>
-		</SPAN>
+            <BEGIN>^#{</BEGIN>
+            <END>}</END>
+        </SPAN>
         <SPAN TYPE="LITERAL3" DELEGATE="MAIN">
-			<BEGIN>'#{</BEGIN>
-			<END>}</END>
-		</SPAN>
-		<SPAN TYPE="LABEL" DELEGATE="MAIN">
-			<BEGIN>#{</BEGIN>
-			<END>}</END>
-		</SPAN>
+            <BEGIN>'#{</BEGIN>
+            <END>}</END>
+        </SPAN>
+        <SPAN TYPE="LABEL" DELEGATE="MAIN">
+            <BEGIN>#{</BEGIN>
+            <END>}</END>
+        </SPAN>
 
         <!-- Quoted symbols -->
-        <SEQ AT_WORD_START="TRUE" TYPE="KEYWORD1">#'</SEQ>
+        <SEQ AT_WORD_START="TRUE" TYPE="KEYWORD2">#'</SEQ>
         <MARK_FOLLOWING
             AT_WORD_START="TRUE"
             TYPE="LITERAL3">'</MARK_FOLLOWING>
@@ -135,36 +154,40 @@
         <MARK_FOLLOWING
             AT_WORD_START="TRUE"
             TYPE="LABEL">@</MARK_FOLLOWING>
+        <!-- java interop -->
+        <MARK_FOLLOWING
+            AT_WORD_START="TRUE"
+            TYPE="LITERAL3">.</MARK_FOLLOWING>
         <!-- Metadata -->
         <MARK_FOLLOWING
             AT_WORD_START="TRUE"
             TYPE="MARKUP">#^</MARK_FOLLOWING>
 
-		<!-- Based on convention discussed here:
-			 http://www.gigamonkeys.com/book/syntax-and-semantics.html -->
-		<EOL_SPAN TYPE="COMMENT4">;;;;</EOL_SPAN>
-		<EOL_SPAN TYPE="COMMENT3">;;;</EOL_SPAN>
-		<EOL_SPAN TYPE="COMMENT2">;;</EOL_SPAN>
-		<EOL_SPAN TYPE="COMMENT1">;</EOL_SPAN>
+            <!-- Based on convention discussed here:
+                     http://www.gigamonkeys.com/book/syntax-and-semantics.html -->
+            <EOL_SPAN TYPE="COMMENT4">;;;;</EOL_SPAN>
+            <EOL_SPAN TYPE="COMMENT3">;;;</EOL_SPAN>
+            <EOL_SPAN TYPE="COMMENT2">;;</EOL_SPAN>
+            <EOL_SPAN TYPE="COMMENT1">;</EOL_SPAN>
 
-		<SPAN TYPE="LITERAL2" DELEGATE="REGEXPS" ESCAPE="\">
-			<BEGIN>#"</BEGIN>
-			<END>"</END>
-		</SPAN>
+            <SPAN TYPE="LITERAL2" DELEGATE="REGEXPS" ESCAPE="\">
+                <BEGIN>#"</BEGIN>
+                <END>"</END>
+            </SPAN>
 
-		<SPAN TYPE="LITERAL1" DELEGATE="STRINGS" ESCAPE="\">
-			<BEGIN>"</BEGIN>
-			<END>"</END>
-		</SPAN>
+            <SPAN TYPE="LITERAL1" DELEGATE="STRINGS" ESCAPE="\">
+                <BEGIN>"</BEGIN>
+                <END>"</END>
+            </SPAN>
 
         <!-- Character literals -->
         <SEQ_REGEXP
-                HASH_CHAR="\"
-                AT_WORD_START="TRUE"
-                TYPE="LITERAL2">\\(.|newline|space|tab)</SEQ_REGEXP>
+            HASH_CHAR="\"
+            AT_WORD_START="TRUE"
+            TYPE="LITERAL2">\\(.|newline|space|tab)</SEQ_REGEXP>
 
         <!-- The '.' special form -->
-        <SEQ AT_WORD_START="TRUE" TYPE="KEYWORD1">.</SEQ>
+        <SEQ AT_WORD_START="TRUE" TYPE="LITERAL4">.</SEQ>
 
         <!-- Namespace separators -->
         <!-- <MARK_PREVIOUS
@@ -174,299 +197,908 @@
                 TYPE="LITERAL4"
                 MATCH_TYPE="CONTEXT">.</MARK_PREVIOUS> -->
 
-        <!-- Keywords -->
+        <!-- KEYWORD4: All keywords -->
         <MARK_FOLLOWING
-                AT_WORD_START="TRUE"
-                TYPE="KEYWORD4">:</MARK_FOLLOWING>
+            AT_WORD_START="TRUE"
+            TYPE="KEYWORD4">:</MARK_FOLLOWING>
 
         <KEYWORDS>
-            <!-- Evaluation -->
-            <KEYWORD4>read</KEYWORD4>
-            <KEYWORD4>load</KEYWORD4>
-            <KEYWORD4>load-file</KEYWORD4>
-            <KEYWORD4>eval</KEYWORD4>
-            <KEYWORD4>apply</KEYWORD4>
-            <KEYWORD4>symbol</KEYWORD4>
-            <KEYWORD4>keyword</KEYWORD4>
-
-            <!-- Special Forms -->
-            <KEYWORD1>quote</KEYWORD1>
-            <KEYWORD1>monitor-enter</KEYWORD1>
-            <KEYWORD1>monitor-exit</KEYWORD1>
-            <KEYWORD1>locking</KEYWORD1>
-            <KEYWORD1>macroexpand-1</KEYWORD1>
-            <KEYWORD1>macroexpand</KEYWORD1>
-            <KEYWORD3>partial</KEYWORD3>
-            <KEYWORD3>complement</KEYWORD3>
-            <KEYWORD3>comparator</KEYWORD3>
-            <KEYWORD3>constantly</KEYWORD3>
-            <KEYWORD3>identity</KEYWORD3>
-            <KEYWORD3>comp</KEYWORD3>
+            <!--
+                    KEYWORD1:  Definitions and binding.
+              -->
 
-            <!-- Other functions -->
-            <KEYWORD1>map</KEYWORD1>
-            <KEYWORD1>mapcat</KEYWORD1>
-            <KEYWORD1>str</KEYWORD1>
-            <KEYWORD1>time</KEYWORD1>
-            <KEYWORD1>line-seq</KEYWORD1>
-            <KEYWORD1>reduce</KEYWORD1>
+            <KEYWORD1>assert</KEYWORD1>
+
+            <KEYWORD1>binding</KEYWORD1>
+
+            <KEYWORD1>bound-fn</KEYWORD1>
+            <KEYWORD1>bound-fn*</KEYWORD1>
+
+            <KEYWORD1>comment</KEYWORD1>
+
+            <KEYWORD1>compile</KEYWORD1>
+            <KEYWORD1>gen-class</KEYWORD1>
+            <KEYWORD1>gen-interface</KEYWORD1>
+
+            <KEYWORD1>declare</KEYWORD1>
+
+            <KEYWORD1>def</KEYWORD1>
+            <KEYWORD1>definline</KEYWORD1>
+            <KEYWORD1>definterceptor</KEYWORD1>
+            <KEYWORD1>definterceptorfn</KEYWORD1>
+            <KEYWORD1>definterface</KEYWORD1>
+            <KEYWORD1>defmacro</KEYWORD1>
+            <KEYWORD1>defmethod</KEYWORD1>
+            <KEYWORD1>defmulti</KEYWORD1>
+            <KEYWORD1>defn</KEYWORD1>
+            <KEYWORD1>defn-</KEYWORD1>
+            <KEYWORD1>defon-request</KEYWORD1>
+            <KEYWORD1>defonce</KEYWORD1>
+            <KEYWORD1>defprotocol</KEYWORD1>
+            <KEYWORD1>defrecord</KEYWORD1>
+            <KEYWORD1>defstruct</KEYWORD1>
+            <KEYWORD1>deftest</KEYWORD1>
+            <KEYWORD1>deftest-</KEYWORD1>
+            <KEYWORD1>deftype</KEYWORD1>
+            <KEYWORD1>extend</KEYWORD1>
+            <KEYWORD1>extenders</KEYWORD1>
+            <KEYWORD1>extend-protocol</KEYWORD1>
+            <KEYWORD1>extend-type</KEYWORD1>
+            <KEYWORD1>get-method</KEYWORD1>
+            <KEYWORD1>methods</KEYWORD1>
+            <KEYWORD1>prefers</KEYWORD1>
+            <KEYWORD1>prefer-method</KEYWORD1>
+            <KEYWORD1>remove-all-methods</KEYWORD1>
+            <KEYWORD1>remove-method</KEYWORD1>
+
+            <KEYWORD1>eval</KEYWORD1>
+
+            <KEYWORD1>fn</KEYWORD1>
+            <KEYWORD1>partial</KEYWORD1>
+
+            <KEYWORD1>ns</KEYWORD1>
+            <KEYWORD1>import</KEYWORD1>
+            <KEYWORD1>intern</KEYWORD1>
+            <KEYWORD1>loaded-libs</KEYWORD1>
+            <KEYWORD1>refer</KEYWORD1>
+            <KEYWORD1>refer-clojure</KEYWORD1>
+            <KEYWORD1>reify</KEYWORD1>
+            <KEYWORD1>require</KEYWORD1>
+            <KEYWORD1>the-ns</KEYWORD1>
+            <KEYWORD1>use</KEYWORD1>
+
+            <KEYWORD1>all-ns</KEYWORD1>
+            <KEYWORD1>alias</KEYWORD1>
+            <KEYWORD1>create-ns</KEYWORD1>
+            <KEYWORD1>find-keyword</KEYWORD1>
+            <KEYWORD1>find-ns</KEYWORD1>
+            <KEYWORD1>in-ns</KEYWORD1>
+            <KEYWORD1>ns-name</KEYWORD1>
+            <KEYWORD1>ns-map</KEYWORD1>
+            <KEYWORD1>ns-aliases</KEYWORD1>
+            <KEYWORD1>ns-interns</KEYWORD1>
+            <KEYWORD1>ns-publics</KEYWORD1>
+            <KEYWORD1>ns-imports</KEYWORD1>
+            <KEYWORD1>ns-refers</KEYWORD1>
+            <KEYWORD1>ns-resolve</KEYWORD1>
+            <KEYWORD1>ns-unmap</KEYWORD1>
+            <KEYWORD1>ns-unalias</KEYWORD1>
+            <KEYWORD1>remove-ns</KEYWORD1>
+
+            <!--
+                    KEYWORD2:  Flow control
+              -->
+
+            <KEYWORD2>case</KEYWORD2>
+
+            <KEYWORD2>cond</KEYWORD2>
+            <KEYWORD2>condp</KEYWORD2>
+            <KEYWORD2>cond-></KEYWORD2>
+            <KEYWORD2>cond->></KEYWORD2>
+
+            <KEYWORD2>destructure</KEYWORD2>
 
-            <!-- Printing -->
-            <KEYWORD1>pr</KEYWORD1>
-            <KEYWORD1>prn</KEYWORD1>
-            <KEYWORD1>print</KEYWORD1>
-            <KEYWORD1>println</KEYWORD1>
-            <KEYWORD1>pr-str</KEYWORD1>
-            <KEYWORD1>prn-str</KEYWORD1>
-            <KEYWORD1>print-str</KEYWORD1>
-            <KEYWORD1>println-str</KEYWORD1>
-            <KEYWORD2>with-out-str</KEYWORD2>
-            <KEYWORD2>with-open</KEYWORD2>
-            <LITERAL1>newline</LITERAL1>
-
-            <!-- RegExps -->
-            <KEYWORD1>re-matcher</KEYWORD1>
-            <KEYWORD1>re-find</KEYWORD1>
-            <KEYWORD1>re-matches</KEYWORD1>
-            <KEYWORD1>re-groups</KEYWORD1>
-            <KEYWORD1>re-seq</KEYWORD1>
-
-            <!-- Flow control -->
             <KEYWORD2>do</KEYWORD2>
+            <KEYWORD2>doall</KEYWORD2>
+            <KEYWORD2>dorun</KEYWORD2>
+            <KEYWORD2>doseq</KEYWORD2>
+            <KEYWORD2>dosync</KEYWORD2>
             <KEYWORD2>dotimes</KEYWORD2>
+            <KEYWORD2>doto</KEYWORD2>
+
+            <KEYWORD2>for</KEYWORD2>
+
+            <KEYWORD2>if</KEYWORD2>
+            <KEYWORD2>if-let</KEYWORD2>
+            <KEYWORD2>if-not</KEYWORD2>
+            <KEYWORD2>if-some</KEYWORD2>
+
+            <KEYWORD2>let</KEYWORD2>
+            <KEYWORD2>letfn</KEYWORD2>
+
             <KEYWORD2>loop</KEYWORD2>
             <KEYWORD2>recur</KEYWORD2>
-            <KEYWORD2>throw</KEYWORD2>
+
+            <KEYWORD2>sync</KEYWORD2>
+
+            <KEYWORD2>trampoline</KEYWORD2>
+
             <KEYWORD2>try</KEYWORD2>
             <KEYWORD2>catch</KEYWORD2>
             <KEYWORD2>finally</KEYWORD2>
+            <KEYWORD2>throw</KEYWORD2>
+
+            <KEYWORD2>while</KEYWORD2>
+
             <KEYWORD2>when</KEYWORD2>
+            <KEYWORD2>when-first</KEYWORD2>
+            <KEYWORD2>when-let</KEYWORD2>
             <KEYWORD2>when-not</KEYWORD2>
-            <KEYWORD2>cond</KEYWORD2>
-            <KEYWORD2>if</KEYWORD2>
-            <KEYWORD3>assert</KEYWORD3>
-            <KEYWORD3>for</KEYWORD3>
-            <KEYWORD3>doseq</KEYWORD3>
-            <KEYWORD3>dorun</KEYWORD3>
-            <KEYWORD3>doall</KEYWORD3>
-            <KEYWORD3>when-first</KEYWORD3>
-            <KEYWORD3>refer</KEYWORD3>
-            <KEYWORD3>import</KEYWORD3>
-            <KEYWORD3>in-ns</KEYWORD3>
-            <KEYWORD3>find-ns</KEYWORD3>
-            <KEYWORD3>all-ns</KEYWORD3>
-            <KEYWORD3>dosync</KEYWORD3>
-            <KEYWORD3>deref</KEYWORD3>
-            <KEYWORD3>ensure</KEYWORD3>
+            <KEYWORD2>when-some</KEYWORD2>
+
+            <!--
+                    KEYWORD3:  Core functions and macros
+              -->
+
             <KEYWORD3>alter</KEYWORD3>
-            <KEYWORD3>shutdown</KEYWORD3>
-            <KEYWORD3>send</KEYWORD3>
-            <KEYWORD3>send-off</KEYWORD3>
+            <KEYWORD3>alter-meta!</KEYWORD3>
+            <KEYWORD3>alter-var-root</KEYWORD3>
+            <KEYWORD3>commute</KEYWORD3>
+            <KEYWORD3>compare-and-set!</KEYWORD3>
+            <KEYWORD3>ensure</KEYWORD3>
+            <KEYWORD3>ref</KEYWORD3>
+            <KEYWORD3>ref-history-count</KEYWORD3>
+            <KEYWORD3>ref-max-history</KEYWORD3>
+            <KEYWORD3>ref-min-history</KEYWORD3>
+            <KEYWORD3>ref-set</KEYWORD3>
+            <KEYWORD3>reset!</KEYWORD3>
+            <KEYWORD3>reset-meta!</KEYWORD3>
+            <KEYWORD3>set!</KEYWORD3>
+            <KEYWORD3>swap!</KEYWORD3>
+
+            <KEYWORD3>agent</KEYWORD3>
+            <KEYWORD3>agent-error</KEYWORD3>
+            <KEYWORD3>agent-errors</KEYWORD3>
+            <KEYWORD3>add-watch</KEYWORD3>
             <KEYWORD3>await</KEYWORD3>
             <KEYWORD3>await-for</KEYWORD3>
-            <KEYWORD3>doto</KEYWORD3>
-
-            <!-- Constructors -->
-            <FUNCTION>defmulti</FUNCTION>
-            <FUNCTION>defmethod</FUNCTION>
-            <FUNCTION>remove-method</FUNCTION>
-            <FUNCTION>meta</FUNCTION>
-            <FUNCTION>remove-ns</FUNCTION>
-            <FUNCTION>create-ns</FUNCTION>
-            <FUNCTION>binding</FUNCTION>
-            <FUNCTION>with-local-vars</FUNCTION>
-            <FUNCTION>ref</FUNCTION>
-            <FUNCTION>ref-set</FUNCTION>
-            <FUNCTION>commute</FUNCTION>
-            <FUNCTION>agent</FUNCTION>
-            <FUNCTION>deref</FUNCTION>
-            <FUNCTION>memfn</FUNCTION>
-            <FUNCTION>bean</FUNCTION>
-            <FUNCTION>proxy</FUNCTION>
-            <FUNCTION>make-array</FUNCTION>
-            <FUNCTION>list</FUNCTION>
-            <FUNCTION>sorted-map</FUNCTION>
-            <FUNCTION>sorted-map-by</FUNCTION>
-            <FUNCTION>hash-map</FUNCTION>
-            <FUNCTION>vector</FUNCTION>
-            <FUNCTION>create-struct</FUNCTION>
-            <FUNCTION>def</FUNCTION>
-            <FUNCTION>defstruct</FUNCTION>
-            <FUNCTION>defn</FUNCTION>
-            <FUNCTION>fn</FUNCTION>
-            <FUNCTION>defmacro</FUNCTION>
-            <FUNCTION>var</FUNCTION>
-            <FUNCTION>new</FUNCTION>
-            <FUNCTION>let</FUNCTION>
-            <FUNCTION>set!</FUNCTION>
-            <FUNCTION>struct-map</FUNCTION>
-            <FUNCTION>struct</FUNCTION>
-            <FUNCTION>array-map</FUNCTION>
-            <FUNCTION>hash-set</FUNCTION>
-            <FUNCTION>sorted-set</FUNCTION>
-            <FUNCTION>set</FUNCTION>
-            <FUNCTION>seq</FUNCTION>
-            <FUNCTION>cons</FUNCTION>
-            <FUNCTION>lazy-cons</FUNCTION>
-            <FUNCTION>set</FUNCTION>
-            <FUNCTION>int</FUNCTION>
-            <FUNCTION>long</FUNCTION>
-            <FUNCTION>double</FUNCTION>
-            <FUNCTION>char</FUNCTION>
-            <FUNCTION>boolean</FUNCTION>
-            <FUNCTION>short</FUNCTION>
-            <FUNCTION>byte</FUNCTION>
-            <FUNCTION>parse</FUNCTION>
+            <KEYWORD3>clear-agent-errors</KEYWORD3>
+            <KEYWORD3>error-handler</KEYWORD3>
+            <KEYWORD3>error-mode</KEYWORD3>
+            <KEYWORD3>get-validator</KEYWORD3>
+            <KEYWORD3>release-pending-sends</KEYWORD3>
+            <KEYWORD3>remove-watch</KEYWORD3>
+            <KEYWORD3>restart-agent</KEYWORD3>
+            <KEYWORD3>send</KEYWORD3>
+            <KEYWORD3>send-off</KEYWORD3>
+            <KEYWORD3>send-via</KEYWORD3>
+            <KEYWORD3>set-agent-send-executor!</KEYWORD3>
+            <KEYWORD3>set-agent-send-off-executor!</KEYWORD3>
+            <KEYWORD3>set-error-handler!</KEYWORD3>
+            <KEYWORD3>set-error-mode!</KEYWORD3>
+            <KEYWORD3>set-validator!</KEYWORD3>
+            <KEYWORD3>shutdown-agents</KEYWORD3>
+
+            <KEYWORD3>future</KEYWORD3>
+            <KEYWORD3>future-call</KEYWORD3>
+            <KEYWORD3>future-cancel</KEYWORD3>
+            <KEYWORD3>deliver</KEYWORD3>
+            <KEYWORD3>deref</KEYWORD3>
+            <KEYWORD3>locking</KEYWORD3>
+            <KEYWORD3>pcalls</KEYWORD3>
+            <KEYWORD3>pmap</KEYWORD3>
+            <KEYWORD3>promise</KEYWORD3>
+
+            <KEYWORD3>delay</KEYWORD3>
+            <KEYWORD3>force</KEYWORD3>
+
+            <KEYWORD3>amap</KEYWORD3>
+            <KEYWORD3>map</KEYWORD3>
+            <KEYWORD3>mapcat</KEYWORD3>
+            <KEYWORD3>mapv</KEYWORD3>
+            <KEYWORD3>map-indexed</KEYWORD3>
+            <KEYWORD3>filter</KEYWORD3>
+            <KEYWORD3>filterv</KEYWORD3>
+            <KEYWORD3>sort</KEYWORD3>
+            <KEYWORD3>sort-by</KEYWORD3>
+
+            <KEYWORD3>get-thread-bindings</KEYWORD3>
+
+            <KEYWORD3>gensym</KEYWORD3>
+
+            <KEYWORD3>memoize</KEYWORD3>
+
+            <KEYWORD3>meta</KEYWORD3>
+            <KEYWORD3>vary-meta</KEYWORD3>
+
+            <KEYWORD3>name</KEYWORD3>
+            <KEYWORD3>namespace</KEYWORD3>
+            <KEYWORD3>resolve</KEYWORD3>
+
+            <KEYWORD3>quote</KEYWORD3>
+            <KEYWORD3>unquote</KEYWORD3>
+            <KEYWORD3>unquote-splicing</KEYWORD3>
+
+            <KEYWORD3>var</KEYWORD3>
+            <KEYWORD3>find-var</KEYWORD3>
+            <KEYWORD3>var-get</KEYWORD3>
+            <KEYWORD3>var-set</KEYWORD3>
+
+            <!-- Types and allocators -->
+            <KEYWORD3>empty</KEYWORD3>
+            <KEYWORD3>new</KEYWORD3>
+            <KEYWORD3>array-map</KEYWORD3>
+            <KEYWORD3>atom</KEYWORD3>
+            <KEYWORD3>bigdec</KEYWORD3>
+            <KEYWORD3>bigint</KEYWORD3>
+            <KEYWORD3>biginteger</KEYWORD3>
+            <KEYWORD3>boolean</KEYWORD3>
+            <KEYWORD3>boolean-array</KEYWORD3>
+            <KEYWORD3>booleans</KEYWORD3>
+            <KEYWORD3>byte</KEYWORD3>
+            <KEYWORD3>byte-array</KEYWORD3>
+            <KEYWORD3>bytes</KEYWORD3>
+            <KEYWORD3>cast</KEYWORD3>
+            <KEYWORD3>char</KEYWORD3>
+            <KEYWORD3>char-array</KEYWORD3>
+            <KEYWORD3>chars</KEYWORD3>
+            <KEYWORD3>construct-proxy</KEYWORD3>
+            <KEYWORD3>create-struct</KEYWORD3>
+            <KEYWORD3>denominator</KEYWORD3>
+            <KEYWORD3>double</KEYWORD3>
+            <KEYWORD3>double-array</KEYWORD3>
+            <KEYWORD3>doubles</KEYWORD3>
+            <KEYWORD3>enumeration-seq</KEYWORD3>
+            <KEYWORD3>float</KEYWORD3>
+            <KEYWORD3>float-array</KEYWORD3>
+            <KEYWORD3>floats</KEYWORD3>
+            <KEYWORD3>get-proxy-class</KEYWORD3>
+            <KEYWORD3>hash</KEYWORD3>
+            <KEYWORD3>hash-combine</KEYWORD3>
+            <KEYWORD3>hash-map</KEYWORD3>
+            <KEYWORD3>hash-ordered-coll</KEYWORD3>
+            <KEYWORD3>hash-set</KEYWORD3>
+            <KEYWORD3>hash-unordered-coll</KEYWORD3>
+            <KEYWORD3>init-proxy</KEYWORD3>
+            <KEYWORD3>int</KEYWORD3>
+            <KEYWORD3>int-array</KEYWORD3>
+            <KEYWORD3>interpose</KEYWORD3>
+            <KEYWORD3>ints</KEYWORD3>
+            <KEYWORD3>list</KEYWORD3>
+            <KEYWORD3>list*</KEYWORD3>
+            <KEYWORD3>long</KEYWORD3>
+            <KEYWORD3>long-array</KEYWORD3>
+            <KEYWORD3>longs</KEYWORD3>
+            <KEYWORD3>make-array</KEYWORD3>
+            <KEYWORD3>num</KEYWORD3>
+            <KEYWORD3>numerator</KEYWORD3>
+            <KEYWORD3>partition</KEYWORD3>
+            <KEYWORD3>partition-all</KEYWORD3>
+            <KEYWORD3>partition-by</KEYWORD3>
+            <KEYWORD3>proxy</KEYWORD3>
+            <KEYWORD3>proxy-call-with-super</KEYWORD3>
+            <KEYWORD3>proxy-mappings</KEYWORD3>
+            <KEYWORD3>proxy-name</KEYWORD3>
+            <KEYWORD3>proxy-super</KEYWORD3>
+            <KEYWORD3>rationalize</KEYWORD3>
+            <KEYWORD3>seq</KEYWORD3>
+            <KEYWORD3>seque</KEYWORD3>
+            <KEYWORD3>sequence</KEYWORD3>
+            <KEYWORD3>set</KEYWORD3>
+            <KEYWORD3>short</KEYWORD3>
+            <KEYWORD3>short-array</KEYWORD3>
+            <KEYWORD3>shorts</KEYWORD3>
+            <KEYWORD3>sorted-map</KEYWORD3>
+            <KEYWORD3>sorted-map-by</KEYWORD3>
+            <KEYWORD3>sorted-set</KEYWORD3>
+            <KEYWORD3>sorted-set-by</KEYWORD3>
+            <KEYWORD3>struct</KEYWORD3>
+            <KEYWORD3>struct-map</KEYWORD3>
+            <KEYWORD3>str</KEYWORD3>
+            <KEYWORD3>symbol</KEYWORD3>
+            <KEYWORD3>tree-seq</KEYWORD3>
+            <KEYWORD3>type</KEYWORD3>
+            <KEYWORD3>update-proxy</KEYWORD3>
+            <KEYWORD3>vec</KEYWORD3>
+            <KEYWORD3>vector</KEYWORD3>
+            <KEYWORD3>vector-of</KEYWORD3>
+            <KEYWORD3>xml-seq</KEYWORD3>
+
+            <!-- Java Interop -->
+            <KEYWORD3>.</KEYWORD3>
+            <KEYWORD3>..</KEYWORD3>
+            <KEYWORD3>aclone</KEYWORD3>
+            <KEYWORD3>ancestors</KEYWORD3>
+            <KEYWORD3>bases</KEYWORD3>
+            <KEYWORD3>bean</KEYWORD3>
+            <KEYWORD3>class</KEYWORD3>
+            <KEYWORD3>derive</KEYWORD3>
+            <KEYWORD3>descendants</KEYWORD3>
+            <KEYWORD3>file-seq</KEYWORD3>
+            <KEYWORD3>iterator-seq</KEYWORD3>
+            <KEYWORD3>make-hierarchy</KEYWORD3>
+            <KEYWORD3>namespace-munge</KEYWORD3>
+            <KEYWORD3>object-array</KEYWORD3>
+            <KEYWORD3>parents</KEYWORD3>
+            <KEYWORD3>primitives-classnames</KEYWORD3>
+            <KEYWORD3>supers</KEYWORD3>
+            <KEYWORD3>underive</KEYWORD3>
+
+            <KEYWORD3>memfn</KEYWORD3>
+
+            <!-- Evaluation -->
+            <KEYWORD3>apply</KEYWORD3>
+            <KEYWORD3>eval</KEYWORD3>
+            <KEYWORD3>load</KEYWORD3>
+            <KEYWORD3>load-file</KEYWORD3>
+            <KEYWORD3>load-reader</KEYWORD3>
+            <KEYWORD3>load-string</KEYWORD3>
+            <KEYWORD3>read</KEYWORD3>
+            <KEYWORD3>read-line</KEYWORD3>
+            <KEYWORD3>read-string</KEYWORD3>
+
+            <!-- with- forms -->
+            <KEYWORD3>with-bindings</KEYWORD3>
+            <KEYWORD3>with-bindings*</KEYWORD3>
+            <KEYWORD3>with-in-str</KEYWORD3>
+            <KEYWORD3>with-loading-context</KEYWORD3>
+            <KEYWORD3>with-local-vars</KEYWORD3>
+            <KEYWORD3>with-meta</KEYWORD3>
+            <KEYWORD3>with-open</KEYWORD3>
+            <KEYWORD3>with-out-str</KEYWORD3>
+            <KEYWORD3>with-precision</KEYWORD3>
+            <KEYWORD3>with-redefs</KEYWORD3>
+            <KEYWORD3>with-redefs-fn</KEYWORD3>
+            <KEYWORD3>with-test</KEYWORD3>
+            <KEYWORD3>with-test-out</KEYWORD3>
+
+            <KEYWORD3>aset-boolean</KEYWORD3>
+            <KEYWORD3>aset-byte</KEYWORD3>
+            <KEYWORD3>aset-char</KEYWORD3>
+            <KEYWORD3>aset-double</KEYWORD3>
+            <KEYWORD3>aset-float</KEYWORD3>
+            <KEYWORD3>aset-int</KEYWORD3>
+            <KEYWORD3>aset-long</KEYWORD3>
+            <KEYWORD3>aset-short</KEYWORD3>
+
+            <KEYWORD3>char-escape-string</KEYWORD3>
+            <KEYWORD3>char-name-string</KEYWORD3>
+
+            <KEYWORD3>clojure-version</KEYWORD3>
+
+            <KEYWORD3>compare</KEYWORD3>
+            <KEYWORD3>complement</KEYWORD3>
+
+            <KEYWORD3>default-data-readers</KEYWORD3>
+
+            <KEYWORD3>every-pred</KEYWORD3>
+            <KEYWORD3>juxt</KEYWORD3>
+
+            <KEYWORD3>ex-data</KEYWORD3>
+            <KEYWORD3>ex-info</KEYWORD3>
+
+            <KEYWORD3>identity</KEYWORD3>
+
+            <KEYWORD3>keyword</KEYWORD3>
+
+            <KEYWORD3>line-seq</KEYWORD3>
+
+            <KEYWORD3>macroexpand-1</KEYWORD3>
+            <KEYWORD3>macroexpand</KEYWORD3>
+
+            <KEYWORD3>parse</KEYWORD3>
+
+            <!-- Printing -->
+            <KEYWORD3>pr</KEYWORD3>
+            <KEYWORD3>prn</KEYWORD3>
+            <KEYWORD3>print</KEYWORD3>
+            <KEYWORD3>printf</KEYWORD3>
+            <KEYWORD3>println</KEYWORD3>
+            <KEYWORD3>pr-str</KEYWORD3>
+            <KEYWORD3>prn-str</KEYWORD3>
+            <KEYWORD3>print-dup</KEYWORD3>
+            <KEYWORD3>print-str</KEYWORD3>
+            <KEYWORD3>println-str</KEYWORD3>
+            <KEYWORD3>flush</KEYWORD3>
+            <KEYWORD3>format</KEYWORD3>
+            <KEYWORD3>io!</KEYWORD3>
+            <KEYWORD3>newline</KEYWORD3>
+
+            <KEYWORD3>rand</KEYWORD3>
+            <KEYWORD3>rand-int</KEYWORD3>
+            <KEYWORD3>rand-nth</KEYWORD3>
+
+            <!-- regular expressions -->
+            <KEYWORD3>re-find</KEYWORD3>
+            <KEYWORD3>re-groups</KEYWORD3>
+            <KEYWORD3>re-matcher</KEYWORD3>
+            <KEYWORD3>re-matches</KEYWORD3>
+            <KEYWORD3>re-pattern</KEYWORD3>
+            <KEYWORD3>re-seq</KEYWORD3>
+
+            <KEYWORD3>slurp</KEYWORD3>
+            <KEYWORD3>spit</KEYWORD3>
+
+            <KEYWORD3>test</KEYWORD3>
+
+            <KEYWORD3>time</KEYWORD3>
+
+            <KEYWORD3>transient</KEYWORD3>
+            <KEYWORD3>assoc!</KEYWORD3>
+            <KEYWORD3>conj!</KEYWORD3>
+            <KEYWORD3>disj!</KEYWORD3>
+            <KEYWORD3>dissoc!</KEYWORD3>
+            <KEYWORD3>persistent!</KEYWORD3>
+            <KEYWORD3>pop!</KEYWORD3>
 
             <!-- Collections -->
-            <KEYWORD1>count</KEYWORD1>
-            <KEYWORD1>seq</KEYWORD1>
-            <KEYWORD1>peek</KEYWORD1>
-            <KEYWORD1>pop</KEYWORD1>
-            <KEYWORD1>assoc</KEYWORD1>
-            <KEYWORD1>dissoc</KEYWORD1>
-            <KEYWORD1>get</KEYWORD1>
-            <KEYWORD1>nth</KEYWORD1>
-            <KEYWORD1>rseq</KEYWORD1>
-            <KEYWORD1>subvec</KEYWORD1>
-            <KEYWORD1>find</KEYWORD1>
-            <KEYWORD1>select-keys</KEYWORD1>
-            <KEYWORD1>key</KEYWORD1>
-            <KEYWORD1>val</KEYWORD1>
-            <KEYWORD1>keys</KEYWORD1>
-            <KEYWORD1>vals</KEYWORD1>
-            <KEYWORD1>merge</KEYWORD1>
-            <KEYWORD1>merge-with</KEYWORD1>
-            <KEYWORD1>accessor</KEYWORD1>
-            <KEYWORD1>conj</KEYWORD1>
-            <KEYWORD1>disj</KEYWORD1>
-            <KEYWORD1>first</KEYWORD1>
-            <KEYWORD1>rest</KEYWORD1>
-            <KEYWORD1>ffirst</KEYWORD1>
-            <KEYWORD1>frest</KEYWORD1>
-            <KEYWORD1>rfirst</KEYWORD1>
-            <KEYWORD1>rrest</KEYWORD1>
-            <KEYWORD1>second</KEYWORD1>
-            <KEYWORD1>some</KEYWORD1>
-            <KEYWORD1>concat</KEYWORD1>
-            <KEYWORD1>filter</KEYWORD1>
-            <KEYWORD1>take</KEYWORD1>
-            <KEYWORD1>take-nth</KEYWORD1>
-            <KEYWORD1>take-while</KEYWORD1>
-            <KEYWORD1>drop</KEYWORD1>
-            <KEYWORD1>nthrest</KEYWORD1>
-            <KEYWORD1>drop-while</KEYWORD1>
-            <KEYWORD1>reverse</KEYWORD1>
-            <KEYWORD1>cycle</KEYWORD1>
-            <KEYWORD1>interleave</KEYWORD1>
-            <KEYWORD1>split-at</KEYWORD1>
-            <KEYWORD1>split-with</KEYWORD1>
-            <KEYWORD1>repeat</KEYWORD1>
-            <KEYWORD1>replicate</KEYWORD1>
-            <KEYWORD1>iterate</KEYWORD1>
-            <KEYWORD1>range</KEYWORD1>
-            <KEYWORD1>into</KEYWORD1>
-            <KEYWORD1>sort</KEYWORD1>
-            <KEYWORD1>sort-by</KEYWORD1>
-            <KEYWORD1>zipmap</KEYWORD1>
-            <KEYWORD1>fnseq</KEYWORD1>
-            <KEYWORD1>lazy-cons</KEYWORD1>
-            <KEYWORD1>lazy-cat</KEYWORD1>
-            <KEYWORD1>with-meta</KEYWORD1>
-            <KEYWORD1>ns-name</KEYWORD1>
-            <KEYWORD1>ns-map</KEYWORD1>
-            <KEYWORD1>ns-interns</KEYWORD1>
-            <KEYWORD1>ns-publics</KEYWORD1>
-            <KEYWORD1>ns-imports</KEYWORD1>
-            <KEYWORD1>ns-refers</KEYWORD1>
-            <KEYWORD1>ns-resolve</KEYWORD1>
-            <KEYWORD1>resolve</KEYWORD1>
-            <KEYWORD1>ns-unmap</KEYWORD1>
-            <KEYWORD1>name</KEYWORD1>
-            <KEYWORD1>namespace</KEYWORD1>
-            <KEYWORD1>find-var</KEYWORD1>
-            <KEYWORD1>var-get</KEYWORD1>
-            <KEYWORD1>var-set</KEYWORD1>
-            <KEYWORD1>put</KEYWORD1>
-            <KEYWORD1>agent-errors</KEYWORD1>
-            <KEYWORD1>clear-agent-errors</KEYWORD1>
-            <KEYWORD1>alength</KEYWORD1>
-            <KEYWORD1>aget</KEYWORD1>
-            <KEYWORD1>aset</KEYWORD1>
-            <KEYWORD1>to-array</KEYWORD1>
-            <KEYWORD1>into-array</KEYWORD1>
-            <KEYWORD1>to-array-2d</KEYWORD1>
-
-            <!-- Tests, operators and numerical fns -->
-            <KEYWORD4>-></KEYWORD4>
-            <KEYWORD4>instance?</KEYWORD4>
-            <KEYWORD4>every?</KEYWORD4>
-            <KEYWORD4>not-every?</KEYWORD4>
-            <KEYWORD4>not-any?</KEYWORD4>
-            <KEYWORD4>contains?</KEYWORD4>
-            <KEYWORD4>string?</KEYWORD4>
-            <KEYWORD4>symbol?</KEYWORD4>
-            <KEYWORD4>map?</KEYWORD4>
-            <KEYWORD4>seq?</KEYWORD4>
-            <KEYWORD4>vector?</KEYWORD4>
-            <KEYWORD4>identical?</KEYWORD4>
-            <KEYWORD4>pos?</KEYWORD4>
-            <KEYWORD4>neg?</KEYWORD4>
-            <KEYWORD4>zero?</KEYWORD4>
-            <KEYWORD4>nil?</KEYWORD4>
-            <KEYWORD4>false?</KEYWORD4>
-            <KEYWORD4>true?</KEYWORD4>
-            <KEYWORD4>inc</KEYWORD4>
-            <KEYWORD4>dec</KEYWORD4>
-            <KEYWORD4>+</KEYWORD4>
-            <KEYWORD4>-</KEYWORD4>
-            <KEYWORD4>=</KEYWORD4>
-            <KEYWORD4>==</KEYWORD4>
-            <KEYWORD4>not=</KEYWORD4>
-            <KEYWORD4><=</KEYWORD4>
-            <KEYWORD4>>=</KEYWORD4>
-            <KEYWORD4><</KEYWORD4>
-            <KEYWORD4>></KEYWORD4>
-            <KEYWORD4>/</KEYWORD4>
-            <KEYWORD4>*</KEYWORD4>
-            <KEYWORD4>%</KEYWORD4>
-            <KEYWORD4>quot</KEYWORD4>
-            <KEYWORD4>inc</KEYWORD4>
-            <KEYWORD4>dec</KEYWORD4>
-            <KEYWORD4>rem</KEYWORD4>
-            <KEYWORD4>min</KEYWORD4>
-            <KEYWORD4>max</KEYWORD4>
-            <KEYWORD4>and</KEYWORD4>
-            <KEYWORD4>or</KEYWORD4>
-            <KEYWORD4>not</KEYWORD4>
-            <KEYWORD4>bit-and</KEYWORD4>
-            <KEYWORD4>bit-or</KEYWORD4>
-            <KEYWORD4>bit-not</KEYWORD4>
-            <KEYWORD4>bit-shift-right</KEYWORD4>
-            <KEYWORD4>bit-shift-left</KEYWORD4>
-            <KEYWORD4>union</KEYWORD4>
-            <KEYWORD4>diffference</KEYWORD4>
-            <KEYWORD4>intersection</KEYWORD4>
-            <KEYWORD4>select</KEYWORD4>
-            <KEYWORD4>index</KEYWORD4>
-            <KEYWORD4>rename</KEYWORD4>
-            <KEYWORD4>join</KEYWORD4>
-            <KEYWORD4>distinct</KEYWORD4>
-            <KEYWORD4>submit</KEYWORD4>
-
-            <!-- Pre-defined vars -->
-            <KEYWORD3>*ns*</KEYWORD3>
-            <KEYWORD3>*out*</KEYWORD3>
-            <KEYWORD3>*print-readably*</KEYWORD3>
-            <KEYWORD3>*print-readably*</KEYWORD3>
-            <KEYWORD3>*warn-on-reflection*</KEYWORD3>
+            <KEYWORD3>accessor</KEYWORD3>
+            <KEYWORD3>aget</KEYWORD3>
+            <KEYWORD3>alength</KEYWORD3>
+            <KEYWORD3>areduce</KEYWORD3>
+            <KEYWORD3>aset</KEYWORD3>
+            <KEYWORD3>assoc</KEYWORD3>
+            <KEYWORD3>assoc-in</KEYWORD3>
+            <KEYWORD3>butlast</KEYWORD3>
+            <KEYWORD3>comp</KEYWORD3>
+            <KEYWORD3>comparator</KEYWORD3>
+            <KEYWORD3>concat</KEYWORD3>
+            <KEYWORD3>conj</KEYWORD3>
+            <KEYWORD3>cons</KEYWORD3>
+            <KEYWORD3>constantly</KEYWORD3>
+            <KEYWORD3>count</KEYWORD3>
+            <KEYWORD3>cycle</KEYWORD3>
+            <KEYWORD3>disj</KEYWORD3>
+            <KEYWORD3>dissoc</KEYWORD3>
+            <KEYWORD3>distinct</KEYWORD3>
+            <KEYWORD3>drop</KEYWORD3>
+            <KEYWORD3>drop-last</KEYWORD3>
+            <KEYWORD3>drop-while</KEYWORD3>
+            <KEYWORD3>ffirst</KEYWORD3>
+            <KEYWORD3>find</KEYWORD3>
+            <KEYWORD3>first</KEYWORD3>
+            <KEYWORD3>flatten</KEYWORD3>
+            <KEYWORD3>fnext</KEYWORD3>
+            <KEYWORD3>fnil</KEYWORD3>
+            <KEYWORD3>frequencies</KEYWORD3>
+            <KEYWORD3>frest</KEYWORD3>
+            <KEYWORD3>get</KEYWORD3>
+            <KEYWORD3>get-in</KEYWORD3>
+            <KEYWORD3>group-by</KEYWORD3>
+            <KEYWORD3>interleave</KEYWORD3>
+            <KEYWORD3>into</KEYWORD3>
+            <KEYWORD3>into-array</KEYWORD3>
+            <KEYWORD3>iterate</KEYWORD3>
+            <KEYWORD3>key</KEYWORD3>
+            <KEYWORD3>keep</KEYWORD3>
+            <KEYWORD3>keep-indexed</KEYWORD3>
+            <KEYWORD3>keys</KEYWORD3>
+            <KEYWORD3>last</KEYWORD3>
+            <KEYWORD3>lazy-cat</KEYWORD3>
+            <KEYWORD3>lazy-cons</KEYWORD3>
+            <KEYWORD3>lazy-seq</KEYWORD3>
+            <KEYWORD3>max</KEYWORD3>
+            <KEYWORD3>max-key</KEYWORD3>
+            <KEYWORD3>merge</KEYWORD3>
+            <KEYWORD3>merge-with</KEYWORD3>
+            <KEYWORD3>min</KEYWORD3>
+            <KEYWORD3>min-key</KEYWORD3>
+            <KEYWORD3>mix-collection-hash</KEYWORD3>
+            <KEYWORD3>munge</KEYWORD3>
+            <KEYWORD3>next</KEYWORD3>
+            <KEYWORD3>nfirst</KEYWORD3>
+            <KEYWORD3>nnext</KEYWORD3>
+            <KEYWORD3>nth</KEYWORD3>
+            <KEYWORD3>nthnext</KEYWORD3>
+            <KEYWORD3>nthrest</KEYWORD3>
+            <KEYWORD3>peek</KEYWORD3>
+            <KEYWORD3>pop</KEYWORD3>
+            <KEYWORD3>put</KEYWORD3>
+            <KEYWORD3>pvalues</KEYWORD3>
+            <KEYWORD3>range</KEYWORD3>
+            <KEYWORD3>reduce</KEYWORD3>
+            <KEYWORD3>reduced</KEYWORD3>
+            <KEYWORD3>reduce-kv</KEYWORD3>
+            <KEYWORD3>reductions</KEYWORD3>
+            <KEYWORD3>remove</KEYWORD3>
+            <KEYWORD3>repeat</KEYWORD3>
+            <KEYWORD3>repeatedly</KEYWORD3>
+            <KEYWORD3>replace</KEYWORD3>
+            <KEYWORD3>replicate</KEYWORD3>
+            <KEYWORD3>rest</KEYWORD3>
+            <KEYWORD3>reverse</KEYWORD3>
+            <KEYWORD3>rfirst</KEYWORD3>
+            <KEYWORD3>rrest</KEYWORD3>
+            <KEYWORD3>rseq</KEYWORD3>
+            <KEYWORD3>rsubseq</KEYWORD3>
+            <KEYWORD3>second</KEYWORD3>
+            <KEYWORD3>select-keys</KEYWORD3>
+            <KEYWORD3>shuffle</KEYWORD3>
+            <KEYWORD3>some</KEYWORD3>
+            <KEYWORD3>some-></KEYWORD3>
+            <KEYWORD3>some->></KEYWORD3>
+            <KEYWORD3>some-fn</KEYWORD3>
+            <KEYWORD3>split-at</KEYWORD3>
+            <KEYWORD3>split-with</KEYWORD3>
+            <KEYWORD3>subs</KEYWORD3>
+            <KEYWORD3>subseq</KEYWORD3>
+            <KEYWORD3>subvec</KEYWORD3>
+            <KEYWORD3>take</KEYWORD3>
+            <KEYWORD3>take-last</KEYWORD3>
+            <KEYWORD3>take-nth</KEYWORD3>
+            <KEYWORD3>take-while</KEYWORD3>
+            <KEYWORD3>to-array</KEYWORD3>
+            <KEYWORD3>to-array-2d</KEYWORD3>
+            <KEYWORD3>update-in</KEYWORD3>
+            <KEYWORD3>val</KEYWORD3>
+            <KEYWORD3>vals</KEYWORD3>
+
+            <!-- SQL functions -->
+            <KEYWORD3>resultset-seq</KEYWORD3>
+
+            <KEYWORD3>zipmap</KEYWORD3>
+
+            <!--
+                    KEYWORD4:  Core variables
+                               (and keywords, per MARK_FOLLOWING above)
+              -->
+
             <!-- Special symbols -->
-            <KEYWORD3>&</KEYWORD3>
+            <KEYWORD4>&</KEYWORD4>
+
+            <KEYWORD4>*1</KEYWORD4>
+            <KEYWORD4>*2</KEYWORD4>
+            <KEYWORD4>*3</KEYWORD4>
+
+            <KEYWORD4>*agent*</KEYWORD4>
+
+            <KEYWORD4>*clojure-version*</KEYWORD4>
+            <KEYWORD4>*command-line-args*</KEYWORD4>
+            <KEYWORD4>*compile-files*</KEYWORD4>
+            <KEYWORD4>*compile-path*</KEYWORD4>
+            <KEYWORD4>*compiler-options*</KEYWORD4>
+
+            <KEYWORD4>*data-readers*</KEYWORD4>
+            <KEYWORD4>*default-data-reader-fn*</KEYWORD4>
+
+            <KEYWORD4>*e</KEYWORD4>
+
+            <KEYWORD4>*file*</KEYWORD4>
+
+            <KEYWORD4>*flush-on-newline*</KEYWORD4>
+
+            <KEYWORD4>*err*</KEYWORD4>
+            <KEYWORD4>*in*</KEYWORD4>
+            <KEYWORD4>*out*</KEYWORD4>
+
+            <KEYWORD4>*ns*</KEYWORD4>
+
+            <KEYWORD4>*open-url-script*</KEYWORD4>
+
+            <KEYWORD4>*print-base*</KEYWORD4>
+            <KEYWORD4>*print-dup*</KEYWORD4>
+            <KEYWORD4>*print-length*</KEYWORD4>
+            <KEYWORD4>*print-level*</KEYWORD4>
+            <KEYWORD4>*print-miser-width*</KEYWORD4>
+            <KEYWORD4>*print-meta*</KEYWORD4>
+            <KEYWORD4>*print-pprint-dispatch*</KEYWORD4>
+            <KEYWORD4>*print-pretty*</KEYWORD4>
+            <KEYWORD4>*print-radix*</KEYWORD4>
+            <KEYWORD4>*print-readably*</KEYWORD4>
+            <KEYWORD4>*print-right-margin*</KEYWORD4>
+            <KEYWORD4>*print-suppress-namespaces*</KEYWORD4>
+
+            <KEYWORD4>*read-eval*</KEYWORD4>
+
+            <KEYWORD4>*unchecked-math*</KEYWORD4>
+
+            <KEYWORD4>*warn-on-reflection*</KEYWORD4>
+
+            <!-- clojure.xml -->
+            <KEYWORD4>*current*</KEYWORD4>
+            <KEYWORD4>*sb*</KEYWORD4>
+            <KEYWORD4>*stack*</KEYWORD4>
+            <KEYWORD4>*state*</KEYWORD4>
+
+            <!--
+                    FUNCTION:  Functions outside of the core.
+              -->
+
+            <!-- clojure.core (seemed overkill for KEYWORD3 or OPERATOR) -->
+            <FUNCTION>unchecked-add</FUNCTION>
+            <FUNCTION>unchecked-add-int</FUNCTION>
+            <FUNCTION>unchecked-byte</FUNCTION>
+            <FUNCTION>unchecked-char</FUNCTION>
+            <FUNCTION>unchecked-dec</FUNCTION>
+            <FUNCTION>unchecked-dec-int</FUNCTION>
+            <FUNCTION>unchecked-divide-int</FUNCTION>
+            <FUNCTION>unchecked-double</FUNCTION>
+            <FUNCTION>unchecked-float</FUNCTION>
+            <FUNCTION>unchecked-inc</FUNCTION>
+            <FUNCTION>unchecked-inc-int</FUNCTION>
+            <FUNCTION>unchecked-int</FUNCTION>
+            <FUNCTION>unchecked-long</FUNCTION>
+            <FUNCTION>unchecked-multiply</FUNCTION>
+            <FUNCTION>unchecked-negate</FUNCTION>
+            <FUNCTION>unchecked-negate-int</FUNCTION>
+            <FUNCTION>unchecked-remainder-int</FUNCTION>
+            <FUNCTION>unchecked-short</FUNCTION>
+            <FUNCTION>unchecked-subtract</FUNCTION>
+            <FUNCTION>unchecked-subtract-int</FUNCTION>
+            <FUNCTION>unsigned-bit-shift-right</FUNCTION>
+
+            <!-- clojure.data.browse -->
+            <FUNCTION>browse-url</FUNCTION>
 
-            <!-- Literals -->
-			<LITERAL4>true</LITERAL4>
-			<LITERAL4>false</LITERAL4>
-			<LITERAL4>nil</LITERAL4>
+            <!-- clojure.data -->
+            <FUNCTION>diff</FUNCTION>
+            <FUNCTION>diff-similar</FUNCTION>
+
+            <!-- clojure.instant -->
+            <FUNCTION>parse-timestamp</FUNCTION>
+            <FUNCTION>read-instant-calendar</FUNCTION>
+            <FUNCTION>read-instant-date</FUNCTION>
+            <FUNCTION>read-instant-timestamp</FUNCTION>
+            <FUNCTION>validated</FUNCTION>
+
+            <!-- clojure.java.io -->
+            <FUNCTION>as-file</FUNCTION>
+            <FUNCTION>as-relative-path</FUNCTION>
+            <FUNCTION>as-url</FUNCTION>
+            <FUNCTION>copy</FUNCTION>
+            <FUNCTION>delete-file</FUNCTION>
+            <FUNCTION>file</FUNCTION>
+            <FUNCTION>input-stream</FUNCTION>
+            <FUNCTION>output-stream</FUNCTION>
+            <FUNCTION>make-input-stream</FUNCTION>
+            <FUNCTION>make-output-stream</FUNCTION>
+            <FUNCTION>make-parents</FUNCTION>
+            <FUNCTION>make-reader</FUNCTION>
+            <FUNCTION>make-writer</FUNCTION>
+            <FUNCTION>reader</FUNCTION>
+            <FUNCTION>resource</FUNCTION>
+            <FUNCTION>writer</FUNCTION>
+
+            <!-- clojure.pprint -->
+            <FUNCTION>cl-format</FUNCTION>
+            <FUNCTION>code-dispatch</FUNCTION>
+            <FUNCTION>formatter</FUNCTION>
+            <FUNCTION>formatter-out</FUNCTION>
+            <FUNCTION>fresh-line</FUNCTION>
+            <FUNCTION>get-pretty-writer</FUNCTION>
+            <FUNCTION>pp</FUNCTION>
+            <FUNCTION>pprint</FUNCTION>
+            <FUNCTION>pprint-indent</FUNCTION>
+            <FUNCTION>pprint-logical-block</FUNCTION>
+            <FUNCTION>pprint-newline</FUNCTION>
+            <FUNCTION>pprint-tab</FUNCTION>
+            <FUNCTION>print-length-loop</FUNCTION>
+            <FUNCTION>print-table</FUNCTION>
+            <FUNCTION>set-pprint-dispatch</FUNCTION>
+            <FUNCTION>simple-dispatch</FUNCTION>
+            <FUNCTION>with-pprint-dispatch</FUNCTION>
+            <FUNCTION>write</FUNCTION>
+            <FUNCTION>write-out </FUNCTION>
+
+            <!-- clojure.set -->
+            <FUNCTION>difference</FUNCTION>
+            <FUNCTION>index</FUNCTION>
+            <FUNCTION>intersection</FUNCTION>
+            <FUNCTION>join</FUNCTION>
+            <FUNCTION>map-invert</FUNCTION>
+            <FUNCTION>project</FUNCTION>
+            <FUNCTION>rename</FUNCTION>
+            <FUNCTION>rename-keys</FUNCTION>
+            <FUNCTION>select</FUNCTION>
+            <FUNCTION>union</FUNCTION>
+
+            <!-- clojure.stacktrace -->
+            <FUNCTION>e</FUNCTION>
+            <FUNCTION>print-cause-trace</FUNCTION>
+            <FUNCTION>print-stack-trace</FUNCTION>
+            <FUNCTION>print-throwable</FUNCTION>
+            <FUNCTION>print-trace-element</FUNCTION>
+            <FUNCTION>root-cause</FUNCTION>
+
+            <!-- clojure.string -->
+            <FUNCTION>capitalize</FUNCTION>
+            <FUNCTION>escape</FUNCTION>
+            <FUNCTION>join</FUNCTION>
+            <FUNCTION>lower-case</FUNCTION>
+            <FUNCTION>re-quote-replacement</FUNCTION>
+            <FUNCTION>replace-first</FUNCTION>
+            <FUNCTION>split</FUNCTION>
+            <FUNCTION>split-lines</FUNCTION>
+            <FUNCTION>trim</FUNCTION>
+            <FUNCTION>trim-newline</FUNCTION>
+            <FUNCTION>triml</FUNCTION>
+            <FUNCTION>trimr</FUNCTION>
+            <FUNCTION>upper-case</FUNCTION>
+
+            <!-- clojure.test -->
+            <FUNCTION>are</FUNCTION>
+            <FUNCTION>assert-any</FUNCTION>
+            <FUNCTION>assert-expr</FUNCTION>
+            <FUNCTION>assert-predicate</FUNCTION>
+            <FUNCTION>compose-fixtures</FUNCTION>
+            <FUNCTION>is</FUNCTION>
+            <FUNCTION>join-fixtures</FUNCTION>
+            <FUNCTION>testing</FUNCTION>
+            <FUNCTION>try-expr</FUNCTION>
+            <FUNCTION>use-fixtures</FUNCTION>
+
+            <!-- clojure.walk -->
+            <FUNCTION>keywordize-keys</FUNCTION>
+            <FUNCTION>macroexpand-all</FUNCTION>
+            <FUNCTION>postwalk</FUNCTION>
+            <FUNCTION>postwalk-demo</FUNCTION>
+            <FUNCTION>postwalk-replace</FUNCTION>
+            <FUNCTION>prewalk</FUNCTION>
+            <FUNCTION>prewalk-demo</FUNCTION>
+            <FUNCTION>prewalk-replace</FUNCTION>
+            <FUNCTION>stringify-keys</FUNCTION>
+            <FUNCTION>walk</FUNCTION>
+
+            <!-- clojure.xml -->
+            <FUNCTION>attrs</FUNCTION>
+            <FUNCTION>content</FUNCTION>
+            <FUNCTION>content-handler</FUNCTION>
+            <FUNCTION>element</FUNCTION>
+            <FUNCTION>emit</FUNCTION>
+            <FUNCTION>emit-element</FUNCTION>
+            <FUNCTION>parse</FUNCTION>
+            <FUNCTION>startparse-sax</FUNCTION>
+            <FUNCTION>tag</FUNCTION>
+
+            <!-- clojure.zip -->
+            <FUNCTION>append-child</FUNCTION>
+            <FUNCTION>children</FUNCTION>
+            <FUNCTION>down</FUNCTION>
+            <FUNCTION>edit</FUNCTION>
+            <FUNCTION>insert-child</FUNCTION>
+            <FUNCTION>insert-left</FUNCTION>
+            <FUNCTION>insert-right</FUNCTION>
+            <FUNCTION>left</FUNCTION>
+            <FUNCTION>leftmost</FUNCTION>
+            <FUNCTION>lefts</FUNCTION>
+            <FUNCTION>make-node</FUNCTION>
+            <FUNCTION>next</FUNCTION>
+            <FUNCTION>node</FUNCTION>
+            <FUNCTION>path</FUNCTION>
+            <FUNCTION>prev</FUNCTION>
+            <FUNCTION>remove</FUNCTION>
+            <FUNCTION>replace</FUNCTION>
+            <FUNCTION>right</FUNCTION>
+            <FUNCTION>rightmost</FUNCTION>
+            <FUNCTION>rights</FUNCTION>
+            <FUNCTION>root</FUNCTION>
+            <FUNCTION>seq-zip</FUNCTION>
+            <FUNCTION>up</FUNCTION>
+            <FUNCTION>vector-zip</FUNCTION>
+            <FUNCTION>xml-zip</FUNCTION>
+            <FUNCTION>zipper</FUNCTION>
+
+            <!--
+                    LITERAL3: Predicates
+             -->
+
+            <!-- Predicates -->
+            <LITERAL3>associative?</LITERAL3>
+            <LITERAL3>atom?</LITERAL3>
+            <LITERAL3>blank?</LITERAL3>
+            <LITERAL3>bound?</LITERAL3>
+            <LITERAL3>branch?</LITERAL3>
+            <LITERAL3>char?</LITERAL3>
+            <LITERAL3>class?</LITERAL3>
+            <LITERAL3>contains?</LITERAL3>
+            <LITERAL3>counted?</LITERAL3>
+            <LITERAL3>decimal?</LITERAL3>
+            <LITERAL3>delay?</LITERAL3>
+            <LITERAL3>distinct?</LITERAL3>
+            <LITERAL3>empty?</LITERAL3>
+            <LITERAL3>end?</LITERAL3>
+            <LITERAL3>even?</LITERAL3>
+            <LITERAL3>every?</LITERAL3>
+            <LITERAL3>false?</LITERAL3>
+            <LITERAL3>float?</LITERAL3>
+            <LITERAL3>fn?</LITERAL3>
+            <LITERAL3>function?</LITERAL3>
+            <LITERAL3>future?</LITERAL3>
+            <LITERAL3>future-cancelled?</LITERAL3>
+            <LITERAL3>future-done?</LITERAL3>
+            <LITERAL3>extends?</LITERAL3>
+            <LITERAL3>identical?</LITERAL3>
+            <LITERAL3>ifn?</LITERAL3>
+            <LITERAL3>instance?</LITERAL3>
+            <LITERAL3>integer?</LITERAL3>
+            <LITERAL3>isa?</LITERAL3>
+            <LITERAL3>keyword?</LITERAL3>
+            <LITERAL3>list?</LITERAL3>
+            <LITERAL3>map?</LITERAL3>
+            <LITERAL3>neg?</LITERAL3>
+            <LITERAL3>nil?</LITERAL3>
+            <LITERAL3>not-any?</LITERAL3>
+            <LITERAL3>not-empty</LITERAL3>
+            <LITERAL3>not-every?</LITERAL3>
+            <LITERAL3>number?</LITERAL3>
+            <LITERAL3>odd?</LITERAL3>
+            <LITERAL3>pos?</LITERAL3>
+            <LITERAL3>ratio?</LITERAL3>
+            <LITERAL3>rational?</LITERAL3>
+            <LITERAL3>realized?</LITERAL3>
+            <LITERAL3>record?</LITERAL3>
+            <LITERAL3>reduced?</LITERAL3>
+            <LITERAL3>reversible?</LITERAL3>
+            <LITERAL3>satisfies?</LITERAL3>
+            <LITERAL3>seq?</LITERAL3>
+            <LITERAL3>sequential?</LITERAL3>
+            <LITERAL3>set?</LITERAL3>
+            <LITERAL3>some?</LITERAL3>
+            <LITERAL3>sorted?</LITERAL3>
+            <LITERAL3>string?</LITERAL3>
+            <LITERAL3>subset?</LITERAL3>
+            <LITERAL3>successful?</LITERAL3>
+            <LITERAL3>superset?</LITERAL3>
+            <LITERAL3>symbol?</LITERAL3>
+            <LITERAL3>true?</LITERAL3>
+            <LITERAL3>var?</LITERAL3>
+            <LITERAL3>vector?</LITERAL3>
+            <LITERAL3>zero?</LITERAL3>
+
+            <!-- also quot which matches ' symbol defined above as LITERAL3 -->
+            <LITERAL3>quot</LITERAL3>
+
+            <!--
+                    LITERAL4: Simple literals
+             -->
+
+            <LITERAL4>nil</LITERAL4>
+
+            <LITERAL4>true</LITERAL4>
+            <LITERAL4>false</LITERAL4>
+
+            <!--
+                    OPERATOR: Operators
+             -->
+
+            <OPERATOR>+</OPERATOR>
+            <OPERATOR>+'</OPERATOR>
+            <OPERATOR>-</OPERATOR>
+            <OPERATOR>-'</OPERATOR>
+            <OPERATOR>=</OPERATOR>
+            <OPERATOR>==</OPERATOR>
+            <OPERATOR>as-></OPERATOR>
+            <OPERATOR>-></OPERATOR>
+            <OPERATOR>->></OPERATOR>
+            <OPERATOR>>=</OPERATOR>
+            <OPERATOR>></OPERATOR>
+            <OPERATOR><=</OPERATOR>
+            <OPERATOR><</OPERATOR>
+            <OPERATOR>/</OPERATOR>
+            <OPERATOR>*</OPERATOR>
+            <OPERATOR>*'</OPERATOR>
+            <OPERATOR>%</OPERATOR>
+            <OPERATOR>and</OPERATOR>
+            <OPERATOR>or</OPERATOR>
+            <OPERATOR>inc</OPERATOR>
+            <OPERATOR>inc'</OPERATOR>
+            <OPERATOR>dec</OPERATOR>
+            <OPERATOR>dec'</OPERATOR>
+            <OPERATOR>mod</OPERATOR>
+            <OPERATOR>not</OPERATOR>
+            <OPERATOR>not=</OPERATOR>
+            <OPERATOR>rem</OPERATOR>
+            <OPERATOR>bit-and</OPERATOR>
+            <OPERATOR>bit-and-not</OPERATOR>
+            <OPERATOR>bit-clear</OPERATOR>
+            <OPERATOR>bit-flip</OPERATOR>
+            <OPERATOR>bit-or</OPERATOR>
+            <OPERATOR>bit-not</OPERATOR>
+            <OPERATOR>bit-set</OPERATOR>
+            <OPERATOR>bit-shift-right</OPERATOR>
+            <OPERATOR>bit-shift-left</OPERATOR>
+            <OPERATOR>bit-test</OPERATOR>
+            <OPERATOR>bit-xor</OPERATOR>
         </KEYWORDS>
     </RULES>
 
@@ -498,4 +1130,3 @@
     </RULES>
 </MODE>
 
-
diff --git a/modes/go.xml b/modes/go.xml
index 92125de..0bd7c3b 100644
--- a/modes/go.xml
+++ b/modes/go.xml
@@ -1,174 +1,169 @@
 <?xml version="1.0"?>
-
 <!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<!-- Syntax highlighting mode for Go (http://www.golang.org). 
-     Jim Lawton (jim.lawton at gmail.com) 
-     This is based on the first release of Go, November 2009. -->
-
+<!-- Original jEdit mode by Cedric Simon. Updated by Rodrigo Moraes. -->
 <MODE>
-    <PROPS>
-        <PROPERTY NAME="commentStart" VALUE="/*" />
-        <PROPERTY NAME="commentEnd" VALUE="*/" />
-        <PROPERTY NAME="lineComment" VALUE="//" />
-        <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
-
-        <PROPERTY NAME="indentOpenBrackets" VALUE="{" />
-        <PROPERTY NAME="indentCloseBrackets" VALUE="}" />
-        <PROPERTY NAME="unalignedOpenBrackets" VALUE="(" />
-        <PROPERTY NAME="unalignedCloseBrackets" VALUE=")" />
-        <PROPERTY NAME="indentNextLine"
-            VALUE="(?!^\s*(#|//)).*(\b(if|for)\s*\(.*\)|\b(else)\b)[^{;]*$" />
-        <PROPERTY NAME="unindentThisLine"
-            VALUE="^\s*((case\b.*|[\p{Alpha}_][\p{Alnum}_]*)\s*:(?!:)).*$" />
-        <PROPERTY NAME="electricKeys" VALUE=":" />
-    </PROPS>
-
-    <RULES
-        IGNORE_CASE="FALSE"
-        HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
-        
-        <EOL_SPAN TYPE="COMMENT2">//</EOL_SPAN>
-
-        <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE" ESCAPE="\">
-            <BEGIN>"</BEGIN>
-            <END>"</END>
-        </SPAN>
-        <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE" ESCAPE="\">
-            <BEGIN>'</BEGIN>
-            <END>'</END>
-        </SPAN>
-
-        <SEQ TYPE="LITERAL4">??(</SEQ>
-        <SEQ TYPE="LITERAL4">??/</SEQ>
-        <SEQ TYPE="LITERAL4">??)</SEQ>
-        <SEQ TYPE="LITERAL4">??'</SEQ>
-        <SEQ TYPE="LITERAL4">??<</SEQ>
-        <SEQ TYPE="LITERAL4">??!</SEQ>
-        <SEQ TYPE="LITERAL4">??></SEQ>
-        <SEQ TYPE="LITERAL4">??-</SEQ>
-        <SEQ TYPE="LITERAL4">??=</SEQ>
-
-        <SEQ TYPE="LITERAL4"><:</SEQ>
-        <SEQ TYPE="LITERAL4">:></SEQ>
-        <SEQ TYPE="LITERAL4"><%</SEQ>
-        <SEQ TYPE="LITERAL4">%></SEQ>
-        <SEQ TYPE="LITERAL4">%:</SEQ>
-
-        <MARK_PREVIOUS AT_WHITESPACE_END="TRUE"
-            MATCH_TYPE="OPERATOR"
-            TYPE="LABEL">:</MARK_PREVIOUS>
-
-        <MARK_PREVIOUS
-            TYPE="FUNCTION"
-            MATCH_TYPE="OPERATOR">(</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>
-        <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>
-        <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>package</KEYWORD1>
-            <KEYWORD1>import</KEYWORD1>
-            <KEYWORD1>func</KEYWORD1>
-            <KEYWORD1>type</KEYWORD1>
-            <KEYWORD1>var</KEYWORD1>
-            <KEYWORD1>const</KEYWORD1>
-            <KEYWORD1>interface</KEYWORD1>
-            <KEYWORD1>chan</KEYWORD1>
-
-            <KEYWORD2>for</KEYWORD2>
-            <KEYWORD2>goto</KEYWORD2>
-            <KEYWORD2>go</KEYWORD2>
-            <KEYWORD2>if</KEYWORD2>
-            <KEYWORD2>return</KEYWORD2>
-            <KEYWORD2>switch</KEYWORD2>
-            <KEYWORD2>break</KEYWORD2>
-            <KEYWORD2>case</KEYWORD2>
-            <KEYWORD2>continue</KEYWORD2>
-            <KEYWORD2>default</KEYWORD2>
-            <KEYWORD2>else</KEYWORD2>
-            <KEYWORD2>defer</KEYWORD2>
-            <KEYWORD2>select</KEYWORD2>
-            <KEYWORD2>fallthrough</KEYWORD2>
-            <KEYWORD2>range</KEYWORD2>
-            <KEYWORD2>map</KEYWORD2>
-            <KEYWORD2>new</KEYWORD2>
-            <KEYWORD2>make</KEYWORD2>
-            <KEYWORD2>iota</KEYWORD2>
-            
-            <KEYWORD3>string</KEYWORD3>
-            <KEYWORD3>byte</KEYWORD3>
-            <KEYWORD3>bool</KEYWORD3>
-            <KEYWORD3>float</KEYWORD3>
-            <KEYWORD3>float32</KEYWORD3>
-            <KEYWORD3>float64</KEYWORD3>
-            <KEYWORD3>int</KEYWORD3>
-            <KEYWORD3>int8</KEYWORD3>
-            <KEYWORD3>int16</KEYWORD3>
-            <KEYWORD3>int32</KEYWORD3>
-            <KEYWORD3>int64</KEYWORD3>
-            <KEYWORD3>uint</KEYWORD3>
-            <KEYWORD3>uint8</KEYWORD3>
-            <KEYWORD3>uint16</KEYWORD3>
-            <KEYWORD3>uint32</KEYWORD3>
-            <KEYWORD3>uint64</KEYWORD3>
-            <KEYWORD3>uintptr</KEYWORD3>
-            <KEYWORD3>struct</KEYWORD3>
-
-            <LITERAL2>nil</LITERAL2>
-            <LITERAL2>false</LITERAL2>
-            <LITERAL2>true</LITERAL2>
-
-        </KEYWORDS>
-    </RULES>
+  <PROPS>
+    <!-- comment -->
+    <PROPERTY NAME="commentStart" VALUE="/*" />
+    <PROPERTY NAME="commentEnd" VALUE="*/" />
+    <PROPERTY NAME="lineComment" VALUE="//" />
+    <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
+    <!-- indent -->
+    <PROPERTY NAME="indentOpenBrackets" VALUE="{" />
+    <PROPERTY NAME="indentCloseBrackets" VALUE="}" />
+    <PROPERTY NAME="unalignedOpenBrackets" VALUE="(" />
+    <PROPERTY NAME="unalignedCloseBrackets" VALUE=")" />
+    <PROPERTY NAME="indentNextLine"
+      VALUE="\s*(((if)\s*\(|else\s*|else\s+if\s*\(|for\s*\(.*\))[^{;]*)" />
+    <PROPERTY NAME="unindentThisLine"
+      VALUE="^.*(default:\s*|case.*:.*)$" />
+    <PROPERTY NAME="electricKeys" VALUE=":" />
+  </PROPS>
+
+  <RULES
+    IGNORE_CASE="FALSE"
+    HIGHLIGHT_DIGITS="TRUE"
+    DIGIT_RE="[0-9][0-9a-zA-Z]*">
+
+    <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>
+    <SPAN TYPE="LITERAL1" NO_LINE_BREAK="FALSE">
+      <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>
+    <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>
+    <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>
+      <!-- keywords: control flow -->
+      <KEYWORD1>break</KEYWORD1>
+      <KEYWORD1>case</KEYWORD1>
+      <KEYWORD1>continue</KEYWORD1>
+      <KEYWORD1>default</KEYWORD1>
+      <KEYWORD1>defer</KEYWORD1>
+      <KEYWORD1>else</KEYWORD1>
+      <KEYWORD1>fallthrough</KEYWORD1>
+      <KEYWORD1>for</KEYWORD1>
+      <KEYWORD1>go</KEYWORD1>
+      <KEYWORD1>goto</KEYWORD1>
+      <KEYWORD1>if</KEYWORD1>
+      <KEYWORD1>range</KEYWORD1>
+      <KEYWORD1>return</KEYWORD1>
+      <KEYWORD1>select</KEYWORD1>
+      <KEYWORD1>switch</KEYWORD1>
+      <!-- keywords: "declarations" (not really) -->
+      <KEYWORD1>chan</KEYWORD1>
+      <KEYWORD1>const</KEYWORD1>
+      <KEYWORD1>func</KEYWORD1>
+      <KEYWORD1>import</KEYWORD1>
+      <KEYWORD1>interface</KEYWORD1>
+      <KEYWORD1>map</KEYWORD1>
+      <KEYWORD1>package</KEYWORD1>
+      <KEYWORD1>struct</KEYWORD1>
+      <KEYWORD1>type</KEYWORD1>
+      <KEYWORD1>var</KEYWORD1>
+      <!-- types -->
+      <KEYWORD3>bool</KEYWORD3>
+      <KEYWORD3>byte</KEYWORD3>
+      <KEYWORD3>complex64</KEYWORD3>
+      <KEYWORD3>complex128</KEYWORD3>
+      <KEYWORD3>float32</KEYWORD3>
+      <KEYWORD3>float64</KEYWORD3>
+      <KEYWORD3>int8</KEYWORD3>
+      <KEYWORD3>int16</KEYWORD3>
+      <KEYWORD3>int32</KEYWORD3>
+      <KEYWORD3>int64</KEYWORD3>
+      <KEYWORD3>string</KEYWORD3>
+      <KEYWORD3>uint8</KEYWORD3>
+      <KEYWORD3>uint16</KEYWORD3>
+      <KEYWORD3>uint32</KEYWORD3>
+      <KEYWORD3>uint64</KEYWORD3>
+      <KEYWORD3>int</KEYWORD3>
+      <KEYWORD3>uint</KEYWORD3>
+      <KEYWORD3>uintptr</KEYWORD3>
+      <KEYWORD3>rune</KEYWORD3>
+      <!-- constants -->
+      <LITERAL2>true</LITERAL2>
+      <LITERAL2>false</LITERAL2>
+      <LITERAL2>iota</LITERAL2>
+      <LITERAL2>nil</LITERAL2>
+      <!-- functions -->
+      <FUNCTION>append</FUNCTION>
+      <FUNCTION>cap</FUNCTION>
+      <FUNCTION>close</FUNCTION>
+      <FUNCTION>complex</FUNCTION>
+      <FUNCTION>copy</FUNCTION>
+      <FUNCTION>imag</FUNCTION>
+      <FUNCTION>len</FUNCTION>
+      <FUNCTION>make</FUNCTION>
+      <FUNCTION>new</FUNCTION>
+      <FUNCTION>panic</FUNCTION>
+      <FUNCTION>real</FUNCTION>
+      <FUNCTION>recover</FUNCTION>
+      <FUNCTION>print</FUNCTION>
+      <FUNCTION>println</FUNCTION>
+    </KEYWORDS>
+
+  </RULES>
 
 </MODE>
 
-
- 	  	 
diff --git a/modes/kotlin.xml b/modes/kotlin.xml
new file mode 100644
index 0000000..1f35fe6
--- /dev/null
+++ b/modes/kotlin.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0"?>
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!-- Kotlin mode by Sergey Mashkov aka cy6erGn0m -->
+<MODE>
+	<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="^.*(else:\s*|when.*:.*)$" />
+	</PROPS>
+
+	<RULES
+		IGNORE_CASE="FALSE"
+		HIGHLIGHT_DIGITS="TRUE"
+		DIGIT_RE="(0x[\p{XDigit}]+[lL]?|[\p{Digit}]+(e[\p{Digit}]*)?[lLdDfF]?)">
+
+		<SPAN TYPE="COMMENT3">
+			<BEGIN>/**</BEGIN>
+			<END>*/</END>
+		</SPAN>
+
+		<SPAN TYPE="COMMENT1">
+			<BEGIN>/*</BEGIN>
+			<END>*/</END>
+		</SPAN>
+
+		<SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE" ESCAPE="\">
+			<BEGIN>"</BEGIN>
+			<END>"</END>
+		</SPAN>
+
+		<SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE" ESCAPE="\">
+			<BEGIN>'</BEGIN>
+			<END>'</END>
+		</SPAN>
+		
+		<SPAN TYPE="LITERAL1" NO_LINE_BREAK="FALSE" ESCAPE="\">
+			<BEGIN>"""</BEGIN>
+			<END>"""</END>
+		</SPAN>
+
+		<MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS>
+		<SEQ TYPE="OPERATOR">)</SEQ>
+
+		<SEQ TYPE="COMMENT2">//--></SEQ>
+		<EOL_SPAN TYPE="COMMENT2">//</EOL_SPAN>
+		<SEQ_REGEXP TYPE="MARKUP" HASH_CHAR="/" AT_WORD_START="TRUE">/[^\p{Blank}]*?/</SEQ_REGEXP>
+
+		<SEQ TYPE="COMMENT1"><!--</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>
+		<SEQ TYPE="OPERATOR">[</SEQ>
+		<SEQ TYPE="OPERATOR">?</SEQ>
+		<MARK_PREVIOUS AT_WHITESPACE_END="TRUE"
+			MATCH_TYPE="OPERATOR"
+			TYPE="LABEL">:</MARK_PREVIOUS>
+		<SEQ TYPE="OPERATOR">:</SEQ>
+
+		<KEYWORDS>
+			<KEYWORD1>break</KEYWORD1>
+			<KEYWORD1>continue</KEYWORD1>
+			<KEYWORD1>else</KEYWORD1>
+			<KEYWORD1>for</KEYWORD1>
+			<KEYWORD1>when</KEYWORD1>
+			<KEYWORD1>fun</KEYWORD1>
+			<KEYWORD1>if</KEYWORD1>
+			<KEYWORD1>return</KEYWORD1>
+			<LITERAL2>this</LITERAL2>
+			<KEYWORD1>vararg</KEYWORD1>
+			<KEYWORD1>var</KEYWORD1>
+			<KEYWORD1>val</KEYWORD1>
+			<KEYWORD1>by</KEYWORD1>
+			<KEYWORD1>while</KEYWORD1>
+			<KEYWORD1>class</KEYWORD1>
+			<KEYWORD1>companion</KEYWORD1>
+			<KEYWORD1>trait</KEYWORD1>
+			<KEYWORD1>object</KEYWORD1>
+			<KEYWORD1>abstract</KEYWORD1>
+			<KEYWORD1>override</KEYWORD1>
+			<KEYWORD2>open</KEYWORD2>
+			<KEYWORD2>attribute</KEYWORD2>
+			<KEYWORD2>inline</KEYWORD2>
+			<KEYWORD2>data</KEYWORD2>
+			<KEYWORD2>get</KEYWORD2>
+			<KEYWORD2>set</KEYWORD2>
+			
+			<KEYWORD3>Any</KEYWORD3>
+			<KEYWORD3>Boolean</KEYWORD3>
+			<KEYWORD3>Byte</KEYWORD3>
+			<KEYWORD3>Unit</KEYWORD3>
+			<KEYWORD3>String</KEYWORD3>
+			<KEYWORD3>Int</KEYWORD3>
+			<KEYWORD3>Short</KEYWORD3>
+			<KEYWORD3>Long</KEYWORD3>
+			<KEYWORD3>Double</KEYWORD3>
+			<KEYWORD3>Float</KEYWORD3>
+			<KEYWORD3>Char</KEYWORD3>
+			<KEYWORD3>Array</KEYWORD3>
+			
+			<KEYWORD1>catch</KEYWORD1>
+			<KEYWORD1>finally</KEYWORD1>
+
+			<KEYWORD1>do</KEYWORD1>
+			<KEYWORD1>enum</KEYWORD1>
+			<KEYWORD1>constructor</KEYWORD1>
+			<KEYWORD3>init</KEYWORD3>
+			<KEYWORD1>typealias</KEYWORD1>
+
+			<KEYWORD2>package</KEYWORD2>
+			<KEYWORD2>import</KEYWORD2>
+			<KEYWORD1>is</KEYWORD1>
+			<KEYWORD2>it</KEYWORD2>
+			<KEYWORD1>as</KEYWORD1>
+			<KEYWORD1>public</KEYWORD1>
+			<KEYWORD1>internal</KEYWORD1>
+			<KEYWORD1>protected</KEYWORD1>
+			<KEYWORD1>private</KEYWORD1>
+			<KEYWORD1>inner</KEYWORD1>
+			<KEYWORD1>super</KEYWORD1>
+
+			<KEYWORD1>throw</KEYWORD1>
+			<KEYWORD1>throws</KEYWORD1>
+			<KEYWORD1>transient</KEYWORD1>
+			<KEYWORD1>try</KEYWORD1>
+			<KEYWORD1>volatile</KEYWORD1>
+
+			<LITERAL2>null</LITERAL2>
+			<LITERAL2>false</LITERAL2>
+			<LITERAL2>true</LITERAL2>
+			
+			<KEYWORD1>in</KEYWORD1>
+			<KEYWORD1>out</KEYWORD1>
+		</KEYWORDS>
+	</RULES>
+</MODE>
diff --git a/modes/markdown.xml b/modes/markdown.xml
new file mode 100644
index 0000000..4826a97
--- /dev/null
+++ b/modes/markdown.xml
@@ -0,0 +1,232 @@
+<?xml version="1.0"?>
+<!DOCTYPE MODE SYSTEM "xmode.dtd"><!--
+
+  Markdown mode for jEdit by Peter Lynch (http://peterlynch.ca)
+  Original inspiration drawn from Ali Rantakari's jEdit mode at http://hasseg.org
+  Markdown home: http://daringfireball.net/projects/markdown/
+
+  Suggested Habits and limitations for using this syntax
+  * first rule - avoid being 'lazy' as defined in the spec. This means not indenting lines 2 - n in unordered lists and
+    similar laziness. Not being lazy gives you better syntax highlighting.
+  * prefix all blockquote lines with 'greater than' char, avoid being lazy, since jedit mode regexp
+    can't cross lines
+  * try to keep code blocks 4 spaces single tab deep only
+  * add an extra space for inline links or image links that are in a paragraph and happen to wrap to
+    start on the beginning of a line. A leading space should turn coloring on for those links
+  * brackets '[' or ']' appearing in paragraphs that are not part of a link definition should have the leding bracket escaped
+    to prevent this mode thinking you are starting a link reference
+  * block level html in a blockquote will still be parsed for markdown syntax, even though the spec says
+    markdown is not parsed for in block level html
+  * determining the difference between a code block and list paragraph indented 4 spaces(or tab) is impossible
+    so to help identify code blocks any paragraph indented four spaces is treated as such
+  * tabs are assumed to be taken as four spaces.
+  * link label definitions should start at the beginning of a line and NOT up to 3 spaces leading as allowed by the spec
+
+-->
+<MODE>
+  <PROPS>
+    <PROPERTY NAME="tabSize" VALUE="4" />
+    <PROPERTY NAME="indentSize" VALUE="4" />
+    <PROPERTY NAME="maxLineLen" VALUE="120" />
+    <PROPERTY NAME="commentStart" VALUE="<!--" />
+    <PROPERTY NAME="commentEnd" VALUE="-->" />
+  </PROPS>
+
+  <!-- ================ MAIN ================================= -->
+  <RULES IGNORE_CASE="TRUE">
+
+    <!-- HANDLE BLOCK LEVEL HTML ELEMENTS -->
+    <!-- SGML comment -->
+    <SPAN TYPE="COMMENT1">
+      <BEGIN><!--</BEGIN>
+      <END>--></END>
+    </SPAN>
+    <!-- JavaScript -->
+    <SPAN AT_LINE_START="TRUE" TYPE="MARKUP" DELEGATE="html::JAVASCRIPT">
+      <BEGIN><script</BEGIN>
+      <END></script></END>
+    </SPAN>
+    <!-- special hr case -->
+    <SEQ_REGEXP AT_LINE_START="TRUE" TYPE="MARKUP"><hr\b([^<>])*?/?></SEQ_REGEXP>
+    <!-- block level html must be at the start of a line we isolate this because block
+    level html should not be parsed for markdown syntax -->
+    <SPAN_REGEXP HASH_CHAR="<" AT_LINE_START="TRUE" TYPE="MARKUP" DELEGATE="BLOCK_HTML_TAGS">
+      <BEGIN><(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|noscript|form|fieldset|iframe|math|ins|del)\b</BEGIN>
+      <END></$1></END>
+    </SPAN_REGEXP>
+    <!-- ignore dangling less thans to allow for things like 4 < 5 -->
+    <SEQ TYPE="NULL"> < </SEQ>
+    <!-- HANDLE OTHER INLINE HTML ELEMENTS -->
+    <SPAN TYPE="MARKUP" DELEGATE="INLINE_MARKUP">
+      <BEGIN><</BEGIN>
+      <END>></END>
+    </SPAN>
+    <!-- THE REST IS MARKDOWN -->
+    <IMPORT DELEGATE="MARKDOWN" />
+  </RULES>
+
+  <!-- ================ INLINE HTML ================================= -->
+  <RULES SET="INLINE_MARKUP" DEFAULT="MARKUP">
+    <IMPORT DELEGATE="html::TAGS" />
+  </RULES>
+
+  <!-- ================ BLOCK LEVEL HTML ================================= -->
+  <RULES SET="BLOCK_HTML_TAGS" DEFAULT="MARKUP">
+    <!-- any line indented less than 4 spaces is not valid markdown in block html -->
+    <EOL_SPAN_REGEXP AT_LINE_START="TRUE" TYPE="INVALID">[\S]+</EOL_SPAN_REGEXP>
+    <EOL_SPAN_REGEXP AT_LINE_START="TRUE" TYPE="INVALID"> {1,3}[\S]+</EOL_SPAN_REGEXP>
+    <EOL_SPAN_REGEXP AT_LINE_START="TRUE" DELEGATE="html::MAIN">( {4}|\t)</EOL_SPAN_REGEXP>
+    <SPAN TYPE="LITERAL1">
+      <BEGIN>"</BEGIN>
+      <END>"</END>
+    </SPAN>
+    <SPAN TYPE="LITERAL1">
+      <BEGIN>'</BEGIN>
+      <END>'</END>
+    </SPAN>
+    <SEQ TYPE="OPERATOR">=</SEQ>
+  </RULES>
+
+  <!-- ================ MARKDOWN ================================= -->
+  <RULES SET="MARKDOWN" IGNORE_CASE="FALSE">
+    <!-- blockquotes, also handles nested blockquote chars 	 is tab -->
+    <EOL_SPAN_REGEXP HASH_CHARS=" >" AT_LINE_START="TRUE" MATCH_TYPE="LITERAL3" DELEGATE="MARKDOWN_BLOCKQUOTE">[ \t]*(>[ \t]{1})+</EOL_SPAN_REGEXP>
+    <!-- literal characters (i.e. cases where they won't specify formatting)  -->
+    <SEQ TYPE="NULL"> * </SEQ>
+    <SEQ TYPE="NULL"> _ </SEQ>
+    <SEQ TYPE="NULL">\][</SEQ>
+    <SEQ_REGEXP TYPE="NULL" HASH_CHAR="\">\\[\Q*_\`[](){}#+.!-\E]</SEQ_REGEXP>
+		<!-- GitHub-flavored code blocks -->
+		<SPAN TYPE="LITERAL2" AT_LINE_START="TRUE" DELEGATE="ruby::MAIN">
+		  <BEGIN>``` ruby</BEGIN>
+		  <END>```</END>
+		</SPAN>
+		<SPAN TYPE="LITERAL2" AT_LINE_START="TRUE">
+		  <BEGIN>```</BEGIN>
+		  <END>```</END>
+		</SPAN>
+    <!-- inline code: `NSString* str = @"hi!";` using backticks-->
+    <SPAN_REGEXP TYPE="LITERAL2" HASH_CHARS="`">
+      <BEGIN>(`{1,2})</BEGIN>
+      <END>$1</END>
+    </SPAN_REGEXP>
+    <!-- telling difference between code blocks and list paragraphs is impossible until regexp cross line boundaries -->
+    <EOL_SPAN_REGEXP TYPE="LITERAL2" AT_LINE_START="TRUE" HASH_CHARS=" 	">( {4,}|\t+)\S</EOL_SPAN_REGEXP>
+    <!-- <EOL_SPAN_REGEXP TYPE="LITERAL2" AT_LINE_START="TRUE" HASH_CHARS=" 	">( {4,}|\t+){2,}</EOL_SPAN_REGEXP> -->
+    <!-- headers (setext-style:) -->
+    <EOL_SPAN_REGEXP TYPE="KEYWORD1" AT_LINE_START="TRUE" HASH_CHARS="=-">[=-]+</EOL_SPAN_REGEXP>
+    <!-- headers (atx-style:) -->
+    <EOL_SPAN_REGEXP TYPE="KEYWORD1" AT_LINE_START="TRUE" HASH_CHAR="#">#{1,6}[ \t]*(.+?)</EOL_SPAN_REGEXP>
+    <!-- horizontal rules -->
+    <EOL_SPAN_REGEXP TYPE="KEYWORD1" HASH_CHARS="-*_ 	" AT_LINE_START="TRUE">[ ]{0,2}([ ]?[-_*][ ]?){3,}[ \t]*</EOL_SPAN_REGEXP>
+    <!-- lists (unordered) -->
+    <!-- <SEQ_REGEXP TYPE="KEYWORD2" AT_LINE_START="TRUE" HASH_CHARS="*+- 	">[ \t]{0,3}[*+-][ \t]+</SEQ_REGEXP> -->
+    <SEQ_REGEXP TYPE="KEYWORD2" AT_LINE_START="TRUE" HASH_CHARS="+-* 	">[ \t]{0,}[*+-][ \t]+</SEQ_REGEXP>
+    <!-- lists (ordered) -->
+    <SEQ_REGEXP TYPE="KEYWORD2" AT_LINE_START="TRUE" HASH_CHARS="0123456789 	">[ \t]{0,}\d+\.[ \t]+</SEQ_REGEXP>
+    <!-- Link Label definitions all on one line -->
+    <EOL_SPAN_REGEXP TYPE="LABEL" AT_WHITESPACE_END="TRUE" DELEGATE="LINK_LABEL_DEFINITION">\[(.*?)\]\:</EOL_SPAN_REGEXP>
+    <!-- Inline images and page links and pointers ![alt text](/path/to/img.jpg "Title for this") -->
+    <SPAN_REGEXP TYPE="KEYWORD4" MATCH_TYPE="OPERATOR" NO_LINE_BREAK="TRUE" AT_LINE_START="FALSE" HASH_CHARS=" ![" DELEGATE="LINK_INLINE_URL_TITLE">
+      <BEGIN> !?\[[\p{Alnum}\p{Blank}]*</BEGIN>
+      <END>\]</END>
+    </SPAN_REGEXP>
+    <!-- emphasis (strong) -->
+    <SPAN_REGEXP TYPE="LITERAL3" HASH_CHARS="*_" AT_WORD_START="TRUE" NO_LINE_BREAK="TRUE">
+      <BEGIN>(\*\*|__)</BEGIN>
+      <END>$1</END>
+    </SPAN_REGEXP>
+    <!-- emphasis (em) -->
+    <SPAN_REGEXP TYPE="LITERAL4" HASH_CHARS="*_" AT_WORD_START="TRUE" NO_LINE_BREAK="TRUE">
+      <BEGIN>(\*|_)</BEGIN>
+      <END>$1</END>
+    </SPAN_REGEXP>
+  </RULES>
+
+  <!-- ================ LINK PROCESSING ================================= -->
+  <RULES DEFAULT="KEYWORD3" SET="LINK_LABEL_DEFINITION">
+    <SEQ_REGEXP TYPE="NULL" HASH_CHAR="\">\\[\Q*_\`[](){}#+.!-\E]</SEQ_REGEXP>
+    <SEQ TYPE="OPERATOR">"</SEQ>
+    <SEQ TYPE="OPERATOR">(</SEQ>
+    <SEQ TYPE="OPERATOR">)</SEQ>
+    <IMPORT DELEGATE="MARKDOWN" />
+  </RULES>
+  <RULES SET="LINK_INLINE_URL_TITLE">
+    <!-- the closing bracket of the link text-->
+    <SEQ TYPE="OPERATOR">]</SEQ>
+    <!-- span containing the link label pointer to the definition -->
+    <SPAN_REGEXP TYPE="KEYWORD4" MATCH_TYPE="OPERATOR" NO_LINE_BREAK="TRUE" AT_LINE_START="FALSE" HASH_CHAR="[" DELEGATE="LINK_INLINE_LABEL_CLOSE">
+      <BEGIN>\[</BEGIN>
+      <END>\]</END>
+    </SPAN_REGEXP>
+    <!-- span containing the url and optional title -->
+    <SPAN_REGEXP TYPE="KEYWORD4" MATCH_TYPE="OPERATOR" NO_LINE_BREAK="TRUE" AT_LINE_START="FALSE" HASH_CHAR="(" DELEGATE="LINK_INLINE_URL_TITLE_CLOSE">
+      <BEGIN>\(</BEGIN>
+      <END>\)</END>
+    </SPAN_REGEXP>
+  </RULES>
+  <RULES DEFAULT="KEYWORD3" SET="LINK_INLINE_URL_TITLE_CLOSE">
+    <!-- the closing paren and loop back to MAIN -->
+    <EOL_SPAN TYPE="NULL" MATCH_TYPE="OPERATOR" DELEGATE="MAIN">)</EOL_SPAN>
+  </RULES>
+  <RULES DEFAULT="LABEL" SET="LINK_INLINE_LABEL_CLOSE">
+    <!-- the closing bracket and loop back to MAIN -->
+    <EOL_SPAN TYPE="NULL" MATCH_TYPE="OPERATOR" DELEGATE="MAIN">]</EOL_SPAN>
+  </RULES>
+
+  <!-- ================ MARKDOWN EMBEDDED IN A BLOCKQUOTE  ================================= -->
+   <!--
+    repetitive: these are the same markdown rules but no AT_LINE_START=TRUE because they are
+    part of a blockquote match which already matched at line start didn't see a better way at
+    the time
+    -->
+  <RULES SET="MARKDOWN_BLOCKQUOTE" IGNORE_CASE="FALSE">
+    <!-- ignore dangling less thans to allow for things like 4 < 5 -->
+    <SEQ TYPE="NULL"> < </SEQ>
+    <!-- HANDLE OTHER INLINE HTML ELEMENTS -->
+    <SPAN TYPE="MARKUP" DELEGATE="INLINE_MARKUP">
+      <BEGIN><</BEGIN>
+      <END>></END>
+    </SPAN>
+    <!-- literal characters (i.e. cases where they won't specify formatting)  -->
+    <SEQ TYPE="NULL"> * </SEQ>
+    <SEQ TYPE="NULL"> _ </SEQ>
+    <SEQ TYPE="NULL">\][</SEQ>
+    <SEQ_REGEXP TYPE="NULL" HASH_CHAR="\">\\[\Q*_\`[](){}#+.!-\E]</SEQ_REGEXP>
+    <!-- inline code: `NSString* str = @"hi!";` using backticks-->
+    <SPAN_REGEXP TYPE="LITERAL2" HASH_CHARS="`">
+      <BEGIN>(`{1,2})</BEGIN>
+      <END>$1</END>
+    </SPAN_REGEXP>
+    <!-- telling difference between code blocks and list paragraphs is impossible until regexp cross line boundaries -->
+    <EOL_SPAN_REGEXP TYPE="LITERAL2" HASH_CHARS=" 	">( {4,}|\t+)\S</EOL_SPAN_REGEXP>
+    <!-- <EOL_SPAN_REGEXP TYPE="LITERAL2" AT_LINE_START="TRUE" HASH_CHARS=" 	">( {4,}|\t+){2,}</EOL_SPAN_REGEXP> -->
+    <!-- headers (setext-style:) -->
+    <EOL_SPAN_REGEXP TYPE="KEYWORD1" HASH_CHARS="=-">[=-]+</EOL_SPAN_REGEXP>
+    <!-- headers (atx-style:) -->
+    <EOL_SPAN_REGEXP TYPE="KEYWORD1" HASH_CHAR="#">#{1,6}[ \t]*(.+?)</EOL_SPAN_REGEXP>
+    <!-- horizontal rules -->
+    <EOL_SPAN_REGEXP TYPE="KEYWORD1" HASH_CHARS="-*_ 	">[ ]{0,2}([ ]?[-_*][ ]?){3,}[ \t]*</EOL_SPAN_REGEXP>
+    <!-- lists (unordered) -->
+    <SEQ_REGEXP TYPE="KEYWORD2" HASH_CHARS="*+- 	">[ \t]{0,}[*+-][ \t]+</SEQ_REGEXP>
+    <!-- lists (ordered) -->
+    <SEQ_REGEXP TYPE="KEYWORD2" HASH_CHARS="0123456789 	">[ \t]{0,}\d+\.[ \t]+</SEQ_REGEXP>
+    <!-- Link Label definitions all on one line -->
+    <EOL_SPAN_REGEXP TYPE="LABEL" DELEGATE="LINK_LABEL_DEFINITION">\[(.*?)\]\:</EOL_SPAN_REGEXP>
+    <!-- Inline images and page links and pointers ![alt text](/path/to/img.jpg "Title for this") -->
+    <SPAN_REGEXP TYPE="KEYWORD4" MATCH_TYPE="OPERATOR" NO_LINE_BREAK="TRUE" AT_LINE_START="FALSE" HASH_CHARS=" ![" DELEGATE="LINK_INLINE_URL_TITLE">
+      <BEGIN> !?\[[\p{Alnum}\p{Blank}]*</BEGIN>
+      <END>\]</END>
+    </SPAN_REGEXP>
+    <!-- emphasis (strong) -->
+    <SPAN_REGEXP TYPE="LITERAL3" HASH_CHARS="*_">
+      <BEGIN>(\*\*|__)</BEGIN>
+      <END>$1</END>
+    </SPAN_REGEXP>
+    <!-- emphasis (em) -->
+    <SPAN_REGEXP TYPE="LITERAL4" HASH_CHARS="*_">
+      <BEGIN>(\*|_)</BEGIN>
+      <END>$1</END>
+    </SPAN_REGEXP>
+  </RULES>
+</MODE>
\ No newline at end of file
diff --git a/modes/mustache.xml b/modes/mustache.xml
new file mode 100644
index 0000000..d945668
--- /dev/null
+++ b/modes/mustache.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!-- CPlex LP mode, by Kevin Hunter Kesling for jEdit 4.5+ -->
+<!-- Note that this follows CanJS's implementation of Mustache, as at least -->
+<!-- some of us appreciate some logic in our templates. -->
+<!-- License: GPLv3+ -->
+
+<MODE>
+	<RULES IGNORE_CASE="FALSE" HIGHLIGHT_DIGITS="FALSE">
+
+		<SPAN TYPE="COMMENT1">
+			<BEGIN>{{!</BEGIN>
+			<END>}}</END>
+		</SPAN>
+
+		<SEQ TYPE="KEYWORD3">{{else}}</SEQ>
+		<SEQ TYPE="KEYWORD2">{{.}}</SEQ>
+
+		<SPAN TYPE="COMMENT3" MATCH_TYPE="KEYWORD4">
+			<BEGIN>{{></BEGIN>
+			<END>}}</END>
+		</SPAN>
+
+		<SPAN_REGEXP HASH_CHAR="{" MATCH_TYPE="KEYWORD3" DELEGATE='MAIN'>
+			<BEGIN><![CDATA[\{\{#(each|if) .*?\}\}]]></BEGIN>
+			<END>{{/$1}}</END>
+		</SPAN_REGEXP>
+
+		<SPAN_REGEXP HASH_CHAR="{" MATCH_TYPE="KEYWORD2" DELEGATE='MAIN'>
+			<BEGIN><![CDATA[\{\{#([\p{Alnum}_\.]+)\}\}]]></BEGIN>
+			<END>{{/$1}}</END>
+		</SPAN_REGEXP>
+
+		<SEQ_REGEXP HASH_CHAR="{" TYPE='LITERAL2'>\{\{[A-z_][A-z_.]*\}\}</SEQ_REGEXP>
+
+		<SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+			<BEGIN><%</BEGIN>
+			<END>%></END>
+		</SPAN>
+
+		<SEQ TYPE="KEYWORD4">{{{</SEQ>
+		<MARK_PREVIOUS TYPE="LITERAL4" MATCH_TYPE="KEYWORD4">}}}</MARK_PREVIOUS>
+
+		<SEQ TYPE="KEYWORD4">{{</SEQ>
+		<MARK_PREVIOUS TYPE="LITERAL2" MATCH_TYPE="KEYWORD4">}}</MARK_PREVIOUS>
+
+		<IMPORT DELEGATE="html::MAIN" />
+
+	</RULES>
+</MODE>
diff --git a/modes/patch.xml b/modes/patch.xml
index 15d2392..836b4ab 100644
--- a/modes/patch.xml
+++ b/modes/patch.xml
@@ -3,16 +3,16 @@
 <!DOCTYPE MODE SYSTEM "xmode.dtd">
 
 <MODE>
-	<RULES>
-		<EOL_SPAN TYPE="LITERAL1" AT_LINE_START="TRUE">+++</EOL_SPAN>
-		<EOL_SPAN TYPE="LITERAL2" AT_LINE_START="TRUE">---</EOL_SPAN>
-		<EOL_SPAN TYPE="KEYWORD3" AT_LINE_START="TRUE">Index: </EOL_SPAN>
-		<EOL_SPAN TYPE="KEYWORD1" AT_LINE_START="TRUE">+</EOL_SPAN>
-		<EOL_SPAN TYPE="KEYWORD1" AT_LINE_START="TRUE">></EOL_SPAN>
-		<EOL_SPAN TYPE="KEYWORD2" AT_LINE_START="TRUE">-</EOL_SPAN>
-		<EOL_SPAN TYPE="KEYWORD2" AT_LINE_START="TRUE"><</EOL_SPAN>
-		<EOL_SPAN TYPE="KEYWORD3" AT_LINE_START="TRUE">!</EOL_SPAN>
-		<EOL_SPAN TYPE="KEYWORD3" AT_LINE_START="TRUE">@@</EOL_SPAN>
-		<EOL_SPAN TYPE="KEYWORD3" AT_LINE_START="TRUE">*</EOL_SPAN>
-	</RULES>
+  <RULES>
+    <EOL_SPAN TYPE="LABEL" AT_LINE_START="TRUE">+++</EOL_SPAN>
+    <EOL_SPAN TYPE="COMMENT1" AT_LINE_START="TRUE">---</EOL_SPAN>
+    <EOL_SPAN TYPE="KEYWORD3" AT_LINE_START="TRUE">Index: </EOL_SPAN>
+    <EOL_SPAN TYPE="LABEL" AT_LINE_START="TRUE">+</EOL_SPAN>
+    <EOL_SPAN TYPE="LABEL" AT_LINE_START="TRUE">></EOL_SPAN>
+    <EOL_SPAN TYPE="COMMENT1" AT_LINE_START="TRUE">-</EOL_SPAN>
+    <EOL_SPAN TYPE="COMMENT1" AT_LINE_START="TRUE"><</EOL_SPAN>
+    <EOL_SPAN TYPE="LITERAL3" AT_LINE_START="TRUE">!</EOL_SPAN>
+    <EOL_SPAN TYPE="LITERAL2" AT_LINE_START="TRUE">@@</EOL_SPAN>
+    <EOL_SPAN TYPE="LABEL" AT_LINE_START="TRUE">*</EOL_SPAN>
+  </RULES>
 </MODE>
diff --git a/modes/props.xml b/modes/props.xml
index 57c3472..d84e964 100644
--- a/modes/props.xml
+++ b/modes/props.xml
@@ -4,25 +4,54 @@
 
 <MODE>
 	<PROPS>
-		<PROPERTY NAME="lineComment" VALUE="#" />
-		<PROPERTY NAME="contextInsensitive" VALUE="true" />
+		<PROPERTY NAME="contextInsensitive" VALUE="FALSE" />
 	</PROPS>
-	<RULES DEFAULT="KEYWORD1">
-		<EOL_SPAN TYPE="COMMENT1" AT_LINE_START="TRUE">#</EOL_SPAN>
-		<EOL_SPAN TYPE="NULL" DELEGATE="PROP_VALUE">=</EOL_SPAN>
-		<EOL_SPAN TYPE="NULL" DELEGATE="PROP_VALUE">:</EOL_SPAN>
-		<EOL_SPAN TYPE="NULL" DELEGATE="PROP_VALUE"> </EOL_SPAN>
-		<EOL_SPAN TYPE="NULL" DELEGATE="PROP_VALUE">	</EOL_SPAN>
-	</RULES>
-	<RULES SET="PROP_VALUE" HIGHLIGHT_DIGITS="TRUE"
-		DIGIT_RE="([\p{Digit}]+|#[\p{XDigit}]+)"
-		NO_WORD_SEP="#">
-		<!-- MessageFormat { ... } stuff -->
-		<SPAN TYPE="KEYWORD3" NO_LINE_BREAK="TRUE">
-			<BEGIN>{</BEGIN>
-			<END>}</END>
-		</SPAN>
-		<!-- Sillyness -->
-		<MARK_FOLLOWING TYPE="DIGIT">#</MARK_FOLLOWING>
-	</RULES>
+	<RULES>
+        <!-- 
+        Comments: indicated by either ASCII # or ! as the first non-whitespace
+        character on a line. Comments extend to the end of the line. Comments
+        placed after a key/value are considered part of the value, not as a
+        comment.
+        -->
+        <EOL_SPAN_REGEXP TYPE="COMMENT1" AT_LINE_START="TRUE">\s*[#!]</EOL_SPAN_REGEXP>
+        
+        <!-- 
+        A "natural" line, that is, a blank line. This isn't necessary, it's here
+        just to show it was considered and handled.
+        -->
+        <EOL_SPAN_REGEXP TYPE="NULL">\s*$</EOL_SPAN_REGEXP>
+	
+	    <!--
+	    Key: The key contains all of the characters in the line starting with the 
+	    first non-white space character and up to, but not including, the first 
+	    unescaped '=', ':', or white space character other than a line terminator. 
+	    All of these key termination characters may be included in the key by 
+	    escaping them with a preceding backslash character.
+	    -->
+	    <SPAN_REGEXP TYPE="KEYWORD1" NO_LINE_BREAK="TRUE" NO_WORD_BREAK="TRUE" AT_LINE_START="TRUE" ESCAPE="\">
+	        <BEGIN>\s*([\u0022-\uFFFF&&[^:=]]|[\\][:=	])+?</BEGIN>
+	        <END REGEXP="TRUE">(?=(([:=])|(\s+)))</END>
+	    </SPAN_REGEXP>
+	
+	    <!-- 
+	    Visible key termination characters.
+	    -->
+	    <SEQ_REGEXP	TYPE="OPERATOR">((\s*[:=]\s*)|(\s+))</SEQ_REGEXP>
+	    
+	    <!-- 
+	    Not a comment, not a key, not a key terminator, must be a value.
+	    Value contains all characters until the end of the line. The line may
+	    be continued to the next line by a trailing \.
+	    
+	    The seq_regexp handles the odd case where the value is only 1 character
+	    long. The tokenizer consumes that character, which means the ending
+	    regex for the span_regexp doesn't work.
+	    -->
+	    <SEQ_REGEXP	TYPE="LITERAL1">[^\\]{1}$</SEQ_REGEXP>
+        <SPAN_REGEXP TYPE="LITERAL1">
+            <BEGIN>.</BEGIN>
+            <END REGEXP="TRUE">[^\\]$</END>
+        </SPAN_REGEXP>
+    </RULES>
+	
 </MODE>
diff --git a/modes/rust.xml b/modes/rust.xml
new file mode 100644
index 0000000..a08290e
--- /dev/null
+++ b/modes/rust.xml
@@ -0,0 +1,299 @@
+<?xml version="1.0"?>
+<!--
+ * :tabSize=8:indentSize=8:noTabs=false:
+ * :folding=explicit:collapseFolds=1:
+-->
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!-- updated for Rust 1.0 -->
+<MODE>
+	<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=")" />
+	</PROPS>
+	<RULES IGNORE_CASE="FALSE"
+		HIGHLIGHT_DIGITS="TRUE"
+		DIGIT_RE="(0b[01_]+|0o[0-8_]+|0x[0-9a-fA-F_]+|[0-9_]+)([iu](8|16|32|64)|isize|usize)?|[0-9_]+([eE][0-9_]*)?(f32|f64)?">
+
+		<!-- Silly comment -->
+		<SEQ TYPE="COMMENT1">/**/</SEQ>
+
+		<!-- Doc comment -->
+		<SPAN TYPE="COMMENT3" DELEGATE="NESTED_DOC_COMMENT">
+			<BEGIN>/**</BEGIN>
+			<END>*/</END>
+		</SPAN>
+
+		<!-- Range comment -->
+		<SPAN TYPE="COMMENT1" DELEGATE="NESTED_COMMENT">
+			<BEGIN>/*</BEGIN>
+			<END>*/</END>
+		</SPAN>
+
+		<EOL_SPAN TYPE="COMMENT3">///</EOL_SPAN>
+
+		<EOL_SPAN TYPE="COMMENT2">//</EOL_SPAN>
+
+		<SEQ_REGEXP TYPE="LITERAL1">br(#*)".*?"(\1)</SEQ_REGEXP>
+		<SPAN TYPE="LITERAL1" DELEGATE="DOUBLEQUOTE_LITERAL" NO_LINE_BREAK="FALSE">
+			<BEGIN>b"</BEGIN>
+			<END>"</END>
+		</SPAN>
+		<SEQ_REGEXP TYPE="LITERAL1">r(#*)".*?"(\1)</SEQ_REGEXP>
+		<SPAN TYPE="LITERAL1" DELEGATE="DOUBLEQUOTE_LITERAL" NO_LINE_BREAK="FALSE">
+			<BEGIN>"</BEGIN>
+			<END>"</END>
+		</SPAN>
+		<SEQ_REGEXP TYPE="LITERAL3">b?'(.|\\([\\'nrt0]|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'</SEQ_REGEXP>
+
+		<!-- Lifetimes -->
+		<!-- I tried to use MARK_FOLLOWING here, but it breaks the char
+		literal _above_ -->
+		<SEQ_REGEXP TYPE="KEYWORD4">'\w+</SEQ_REGEXP>
+
+		<!-- Attributes -->
+		<SPAN TYPE="KEYWORD4" DELEGATE="ATTRIBUTE" NO_LINE_BREAK="FALSE">
+			<BEGIN>#[</BEGIN>
+			<END>]</END>
+		</SPAN>
+		<SPAN TYPE="KEYWORD4" DELEGATE="ATTRIBUTE" NO_LINE_BREAK="FALSE">
+			<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>
+
+		<!-- workaround to stop "*" from being colorized
+		     in use 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>
+
+		<!-- Function calls -->
+		<MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS>
+		<SEQ TYPE="OPERATOR">)</SEQ>
+
+		<SEQ TYPE="OPERATOR">=</SEQ>
+		<SEQ TYPE="OPERATOR">(</SEQ>
+		<SEQ TYPE="OPERATOR">)</SEQ>
+		<SEQ TYPE="OPERATOR">,</SEQ>
+
+		<KEYWORDS>
+			<!--{{{ stmts and exprs -->
+			<KEYWORD1>as</KEYWORD1>
+			<KEYWORD1>box</KEYWORD1>
+			<KEYWORD1>break</KEYWORD1>
+			<KEYWORD1>const</KEYWORD1>
+			<KEYWORD1>continue</KEYWORD1>
+			<KEYWORD1>else</KEYWORD1>
+			<KEYWORD1>for</KEYWORD1>
+			<KEYWORD1>if</KEYWORD1>
+			<KEYWORD1>in</KEYWORD1>
+			<KEYWORD1>let</KEYWORD1>
+			<KEYWORD1>loop</KEYWORD1>
+			<KEYWORD1>match</KEYWORD1>
+			<KEYWORD1>move</KEYWORD1>
+			<KEYWORD1>mut</KEYWORD1>
+			<KEYWORD1>ref</KEYWORD1>
+			<KEYWORD1>return</KEYWORD1>
+			<KEYWORD1>unsafe</KEYWORD1>
+			<KEYWORD1>while</KEYWORD1>
+			<!--}}}-->
+
+			<!--{{{ view item keywords -->
+			<KEYWORD2>extern</KEYWORD2>
+			<KEYWORD2>crate</KEYWORD2>
+			<KEYWORD2>mod</KEYWORD2>
+			<KEYWORD2>fn</KEYWORD2>
+			<KEYWORD2>type</KEYWORD2>
+			<KEYWORD2>struct</KEYWORD2>
+			<KEYWORD2>enum</KEYWORD2>
+			<KEYWORD2>static</KEYWORD2>
+			<KEYWORD2>trait</KEYWORD2>
+			<KEYWORD2>impl</KEYWORD2>
+			<KEYWORD2>use</KEYWORD2>
+			<KEYWORD2>super</KEYWORD2>
+			<KEYWORD2>priv</KEYWORD2>
+			<KEYWORD2>pub</KEYWORD2>
+			<KEYWORD2>where</KEYWORD2>
+			<!--}}}-->
+
+			<!--{{{ literals -->
+			<LITERAL2>false</LITERAL2>
+			<LITERAL2>true</LITERAL2>
+			<LITERAL2>self</LITERAL2>
+			<!--}}}-->
+
+			<!--{{{ primitive types from libcore -->
+			<KEYWORD3>bool</KEYWORD3>
+			<KEYWORD3>char</KEYWORD3>
+			<KEYWORD3>f32</KEYWORD3>
+			<KEYWORD3>f64</KEYWORD3>
+			<KEYWORD3>i16</KEYWORD3>
+			<KEYWORD3>i32</KEYWORD3>
+			<KEYWORD3>i64</KEYWORD3>
+			<KEYWORD3>i8</KEYWORD3>
+			<KEYWORD3>isize</KEYWORD3>
+			<KEYWORD3>str</KEYWORD3>
+			<KEYWORD3>u16</KEYWORD3>
+			<KEYWORD3>u32</KEYWORD3>
+			<KEYWORD3>u64</KEYWORD3>
+			<KEYWORD3>u8</KEYWORD3>
+			<KEYWORD3>usize</KEYWORD3>
+
+			<KEYWORD4>Copy</KEYWORD4>
+			<KEYWORD4>Send</KEYWORD4>
+			<KEYWORD4>Sized</KEYWORD4>
+			<KEYWORD4>Sync</KEYWORD4>
+			<KEYWORD4>Drop</KEYWORD4>
+			<KEYWORD4>Fn</KEYWORD4>
+			<KEYWORD4>FnMut</KEYWORD4>
+			<KEYWORD4>FnOnce</KEYWORD4>
+			<KEYWORD4>drop</KEYWORD4>
+			<KEYWORD4>Box</KEYWORD4>
+			<KEYWORD4>Clone</KEYWORD4>
+			<KEYWORD4>PartialEq</KEYWORD4>
+			<KEYWORD4>PartialOrd</KEYWORD4>
+			<KEYWORD4>Eq</KEYWORD4>
+			<KEYWORD4>Ord</KEYWORD4>
+			<KEYWORD4>AsRef</KEYWORD4>
+			<KEYWORD4>AsMut</KEYWORD4>
+			<KEYWORD4>Into</KEYWORD4>
+			<KEYWORD4>From</KEYWORD4>
+			<KEYWORD4>DoubleEndedIterator</KEYWORD4>
+			<KEYWORD4>ExactSizeIterator</KEYWORD4>
+			<KEYWORD4>Iterator</KEYWORD4>
+			<KEYWORD4>Extend</KEYWORD4>
+			<KEYWORD4>Option</KEYWORD4>
+			<KEYWORD4>Some</KEYWORD4>
+			<KEYWORD4>None</KEYWORD4>
+			<KEYWORD4>Result</KEYWORD4>
+			<KEYWORD4>Ok</KEYWORD4>
+			<KEYWORD4>Err</KEYWORD4>
+			<KEYWORD4>String</KEYWORD4>
+			<KEYWORD4>ToString</KEYWORD4>
+			<KEYWORD4>Vec</KEYWORD4>
+			<!--}}}-->
+		</KEYWORDS>
+	</RULES>
+
+	<!--{{{ DOUBLEQUOTE_LITERAL rule -->
+	<RULES SET="DOUBLEQUOTE_LITERAL" DEFAULT="LITERAL1" IGNORE_CASE="TRUE">
+		<SEQ TYPE="LITERAL4">\"</SEQ>
+		<SEQ TYPE="LITERAL4">\\</SEQ>
+		<SEQ TYPE="LITERAL4">\n</SEQ>
+		<SEQ TYPE="LITERAL4">\r</SEQ>
+		<SEQ TYPE="LITERAL4">\t</SEQ>
+		<SEQ TYPE="LITERAL4">\0</SEQ>
+		<SEQ_REGEXP HASH_CHAR="\x" TYPE="LITERAL4">\\x[a-f\d]{2}</SEQ_REGEXP>
+		<SEQ_REGEXP HASH_CHAR="\u" TYPE="LITERAL4">\\u\{[a-f\d]{1,6}\}</SEQ_REGEXP>
+	</RULES> <!--}}}-->
+
+	<!--{{{ ATTRIBUTE rule -->
+	<RULES SET="ATTRIBUTE" DEFAULT="KEYWORD4" IGNORE_CASE="FALSE">
+	<KEYWORDS>
+		<!-- Crate-only attributes -->
+		<KEYWORD2>crate_name</KEYWORD2>
+		<KEYWORD2>crate_type</KEYWORD2>
+		<KEYWORD2>feature</KEYWORD2>
+		<KEYWORD2>no_builtins</KEYWORD2>
+		<KEYWORD2>no_main</KEYWORD2>
+		<KEYWORD2>no_start</KEYWORD2>
+		<KEYWORD2>no_std</KEYWORD2>
+		<KEYWORD2>plugin</KEYWORD2>
+
+		<!-- Module-only attributes -->
+		<KEYWORD2>no_implicit_prelude</KEYWORD2>
+		<KEYWORD2>path</KEYWORD2>
+
+		<!-- Function-only attributes -->
+		<KEYWORD2>main</KEYWORD2>
+		<KEYWORD2>plugin_registrar</KEYWORD2>
+		<KEYWORD2>start</KEYWORD2>
+		<KEYWORD2>test</KEYWORD2>
+		<KEYWORD2>should_panic</KEYWORD2>
+		<KEYWORD2>cold</KEYWORD2>
+
+		<!-- Static-only attributes -->
+		<KEYWORD2>thread_local</KEYWORD2>
+
+		<!-- FFI attributes -->
+		<KEYWORD2>link_args</KEYWORD2>
+		<KEYWORD2>link</KEYWORD2>
+		<KEYWORD2>link_name</KEYWORD2>
+		<KEYWORD2>linkage</KEYWORD2>
+		<KEYWORD2>repr</KEYWORD2>
+
+		<!-- Macro-related attributes -->
+		<KEYWORD2>macro_use</KEYWORD2>
+		<KEYWORD2>macro_reexport</KEYWORD2>
+		<KEYWORD2>macro_export</KEYWORD2>
+		<KEYWORD2>no_link</KEYWORD2>
+
+		<!-- Miscellaneous attributes -->
+		<KEYWORD2>export_name</KEYWORD2>
+		<KEYWORD2>link_section</KEYWORD2>
+		<KEYWORD2>no_mangle</KEYWORD2>
+		<KEYWORD2>packed</KEYWORD2>
+		<KEYWORD2>simd</KEYWORD2>
+		<KEYWORD2>static_assert</KEYWORD2>
+		<KEYWORD2>unsafe_destructor</KEYWORD2>
+		<KEYWORD2>unsafe_no_drop_flag</KEYWORD2>
+		<KEYWORD2>doc</KEYWORD2>
+		<KEYWORD2>rustc_on_unimplemented</KEYWORD2>
+
+		<KEYWORD2>cfg</KEYWORD2>
+
+		<KEYWORD2>allow</KEYWORD2>
+		<KEYWORD2>deny</KEYWORD2>
+		<KEYWORD2>forbid</KEYWORD2>
+		<KEYWORD2>warn</KEYWORD2>
+
+		<KEYWORD2>lang</KEYWORD2>
+
+		<KEYWORD2>inline</KEYWORD2>
+
+		<KEYWORD2>derive</KEYWORD2>
+	</KEYWORDS>
+	</RULES> <!--}}}-->
+
+	<!--{{{ NESTED_DOC_COMMENT rule -->
+	<RULES SET="NESTED_DOC_COMMENT" DEFAULT="COMMENT3">
+		<!-- mark everything in doc comment as doc comment -->
+		<SPAN TYPE="COMMENT3" DELEGATE="NESTED_DOC_COMMENT">
+			<BEGIN>/*</BEGIN>
+			<END>*/</END>
+		</SPAN>
+	</RULES> <!--}}}-->
+
+	<!--{{{ NESTED_COMMENT rule -->
+	<RULES SET="NESTED_COMMENT" DEFAULT="COMMENT1">
+		<SPAN TYPE="COMMENT1" DELEGATE="NESTED_COMMENT">
+			<BEGIN>/*</BEGIN>
+			<END>*/</END>
+		</SPAN>
+	</RULES> <!--}}}-->
+
+</MODE>
diff --git a/modes/scala.xml b/modes/scala.xml
index 05ca602..6fc3885 100644
--- a/modes/scala.xml
+++ b/modes/scala.xml
@@ -1,13 +1,15 @@
 <?xml version="1.0"?>
-<!-- Scala mode by Daniel Spiewak downloaded on 2012-03-10 from https://github.com/djspiewak/jedit-modes/blob/master/scala.xml -->
+<!-- Scala mode by Daniel Spiewak downloaded on 2015-05-17 from https://github.com/djspiewak/jedit-modes/blob/master/scala.xml -->
+
 <!DOCTYPE MODE SYSTEM "xmode.dtd">
+
 <MODE>
   <PROPS>
     <PROPERTY NAME="indentOpenBrackets" VALUE="{" />
     <PROPERTY NAME="indentCloseBrackets" VALUE="}" />
     <PROPERTY NAME="lineUpClosingBracket" VALUE="true" />
-<PROPERTY NAME="indentNextLine"
-VALUE="(.*((if|while|else\s+if|for)\s*\().*\)|\s*else|\s*case.*=>|.*(def|val|var|type).*=)\s*$"/>
+  <PROPERTY NAME="indentNextLine"
+    VALUE="(.*((if|while|else\s+if|for)\s*\().*\)|\s*else|\s*case.*=>|.*(def|val|var|type).*=)\s*$"/>
     <!-- set this to 'true' if you want to use GNU coding style -->
     <PROPERTY NAME="doubleBracketIndent" VALUE="false" />
     <PROPERTY NAME="commentStart" VALUE="/*" />
@@ -18,15 +20,15 @@ VALUE="(.*((if|while|else\s+if|for)\s*\().*\)|\s*else|\s*case.*=>|.*(def|val|var
     <PROPERTY NAME="indentSize" VALUE="2" />
     <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
   </PROPS>
-  
+
   <RULES IGNORE_CASE="FALSE" HIGHLIGHT_DIGITS="TRUE"
-   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]))">
+      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]))">
 
-<MARK_FOLLOWING TYPE="LABEL">@</MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="LABEL">@</MARK_FOLLOWING>
 
-<IMPORT DELEGATE="PRIMARY"/>
+  <IMPORT DELEGATE="PRIMARY"/>
   </RULES>
-  
+
   <RULES SET="PRIMARY">
     <!-- Silly comment -->
     <SEQ TYPE="COMMENT1">/**/</SEQ>
@@ -40,21 +42,31 @@ VALUE="(.*((if|while|else\s+if|for)\s*\().*\)|\s*else|\s*case.*=>|.*(def|val|var
     </SPAN>
 
     <!-- Scala comment (Java style) -->
-    <SPAN TYPE="COMMENT1">
+    <SPAN TYPE="COMMENT1" DELEGATE="COMMENT_BLOCK">
       <BEGIN>/*</BEGIN>
       <END>*/</END>
     </SPAN>
-    
+
     <SPAN MATCH_TYPE="NULL" DELEGATE="MAIN">
-     <BEGIN>{</BEGIN>
-     <END>}</END>
+      <BEGIN>{</BEGIN>
+      <END>}</END>
     </SPAN>
-    
+
     <!-- XML literals; keep this in sync with the XML_LITERAL rule set! -->
-   <IMPORT DELEGATE="XML_SHARED"/>
+    <IMPORT DELEGATE="XML_SHARED"/>
+
+    <!-- interpolated stuff -->
+    <SPAN_REGEXP DELEGATE="STRING" MATCH_TYPE="LITERAL1" NO_LINE_BREAK="FALSE" ESCAPE="">
+      <BEGIN>[0-9a-zA-Z><=+]([0-9a-zA-Z><=+]|_[0-9a-zA-Z><=+])*"""</BEGIN>
+      <END>"""</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP DELEGATE="STRING" MATCH_TYPE="LITERAL1" NO_LINE_BREAK="FALSE" ESCAPE="\">
+      <BEGIN>[0-9a-zA-Z><=+]([0-9a-zA-Z><=+]|_[0-9a-zA-Z><=+])*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
 
     <!-- string and character literals -->
-    <SPAN TYPE="LITERAL1" NO_LINE_BREAK="FALSE" ESCAPE="FALSE">
+    <SPAN TYPE="LITERAL1" NO_LINE_BREAK="FALSE" ESCAPE="">
       <BEGIN>"""</BEGIN>
       <END>"""</END>
     </SPAN>
@@ -62,20 +74,20 @@ VALUE="(.*((if|while|else\s+if|for)\s*\().*\)|\s*else|\s*case.*=>|.*(def|val|var
       <BEGIN>"</BEGIN>
       <END>"</END>
     </SPAN>
-<SEQ_REGEXP HASH_CHAR="'" TYPE="LITERAL1">'([^'\\]|\\.)'</SEQ_REGEXP>
+  <SEQ_REGEXP HASH_CHAR="'" TYPE="LITERAL1">'([^'\\]|\\.)'</SEQ_REGEXP>
 
     <!-- symbol literals -->
     <SEQ_REGEXP HASH_CHAR="'" TYPE="LABEL">'[0-9a-zA-Z><=+]([0-9a-zA-Z><=+]|_[0-9a-zA-Z><=+])*</SEQ_REGEXP>
 
     <SPAN MATCH_TYPE="LITERAL3" DELEGATE="TYPE_PARAMS">
-<BEGIN>[</BEGIN>
-<END>]</END>
-</SPAN>
+    <BEGIN>[</BEGIN>
+    <END>]</END>
+  </SPAN>
 
-<SPAN MATCH_TYPE="NULL">
-<BEGIN>`</BEGIN>
-<END>`</END>
-</SPAN>
+  <SPAN MATCH_TYPE="NULL">
+    <BEGIN>`</BEGIN>
+    <END>`</END>
+  </SPAN>
 
     <SEQ TYPE="OPERATOR">(</SEQ>
     <SEQ TYPE="OPERATOR">)</SEQ>
@@ -89,19 +101,96 @@ VALUE="(.*((if|while|else\s+if|for)\s*\().*\)|\s*else|\s*case.*=>|.*(def|val|var
     <!-- Function calls -->
     <!-- <MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS> -->
 
-<!-- Function declarations (overloaded for different spacing styles)-->
-<MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def </MARK_FOLLOWING>
-<MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def </MARK_FOLLOWING>
-<MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def </MARK_FOLLOWING>
-<MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def </MARK_FOLLOWING>
-<MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def </MARK_FOLLOWING>
-<MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def </MARK_FOLLOWING>
-<MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def </MARK_FOLLOWING>
+    <EOL_SPAN MATCH_TYPE="KEYWORD1" DELEGATE="TYPE">import </EOL_SPAN>
+
+  <!-- Function declarations (overloaded for different spacing styles)-->
+  <MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def       </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def      </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def     </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def    </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def   </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def  </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">def </MARK_FOLLOWING>
+
+  <!-- class declarations (overloaded for different spacing styles)-->
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">class       </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">class      </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">class     </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">class    </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">class   </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">class  </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">class </MARK_FOLLOWING>
 
-<SPAN DELEGATE="PATTERN" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE" NO_LINE_BREAK="TRUE">
-<BEGIN>case </BEGIN>
-<END>=></END>
-</SPAN>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case class       </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case class      </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case class     </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case class    </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case class   </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case class  </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case class </MARK_FOLLOWING>
+
+  <!-- instantiations (overloaded for different spacing styles)-->
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">new       </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">new      </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">new     </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">new    </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">new   </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">new  </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">new </MARK_FOLLOWING>
+
+  <!-- object declarations (overloaded for different spacing styles)-->
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">object       </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">object      </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">object     </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">object    </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">object   </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">object  </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">object </MARK_FOLLOWING>
+
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case object       </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case object      </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case object     </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case object    </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case object   </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case object  </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">case object </MARK_FOLLOWING>
+
+  <!-- trait declarations (overloaded for different spacing styles)-->
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">trait       </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">trait      </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">trait     </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">trait    </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">trait   </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">trait  </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD3" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">trait </MARK_FOLLOWING>
+
+  <!-- extends (overloaded for different spacing styles)-->
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">extends       </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">extends      </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">extends     </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">extends    </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">extends   </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">extends  </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">extends </MARK_FOLLOWING>
+
+  <!-- with (overloaded for different spacing styles)-->
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">with       </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">with      </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">with     </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">with    </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">with   </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">with  </MARK_FOLLOWING>
+  <MARK_FOLLOWING TYPE="KEYWORD4" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE">with </MARK_FOLLOWING>
+
+  <SPAN DELEGATE="PATTERN" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE" NO_LINE_BREAK="FALSE">
+    <BEGIN>case </BEGIN>
+    <END>=></END>
+  </SPAN>
+
+  <SPAN DELEGATE="PATTERN" MATCH_TYPE="KEYWORD1" AT_WORD_START="TRUE" NO_LINE_BREAK="TRUE">
+    <BEGIN>val </BEGIN>
+    <END>=</END>
+  </SPAN>
 
     <KEYWORDS>
       <KEYWORD1>abstract</KEYWORD1>
@@ -120,6 +209,7 @@ VALUE="(.*((if|while|else\s+if|for)\s*\().*\)|\s*else|\s*case.*=>|.*(def|val|var
       <KEYWORD1>implicit</KEYWORD1>
       <KEYWORD1>import</KEYWORD1>
       <KEYWORD1>lazy</KEYWORD1>
+      <KEYWORD1>macro</KEYWORD1>
       <KEYWORD1>match</KEYWORD1>
       <KEYWORD1>new</KEYWORD1>
       <KEYWORD1>object</KEYWORD1>
@@ -161,25 +251,41 @@ VALUE="(.*((if|while|else\s+if|for)\s*\().*\)|\s*else|\s*case.*=>|.*(def|val|var
       <KEYWORD3>AnyRef</KEYWORD3>
       <KEYWORD3>Nothing</KEYWORD3>
 
-<LITERAL2>false</LITERAL2>
-<LITERAL2>null</LITERAL2>
-<LITERAL2>super</LITERAL2>
-<LITERAL2>this</LITERAL2>
-<LITERAL2>true</LITERAL2>
+    <LITERAL2>false</LITERAL2>
+    <LITERAL2>null</LITERAL2>
+    <LITERAL2>super</LITERAL2>
+    <LITERAL2>this</LITERAL2>
+    <LITERAL2>true</LITERAL2>
+
+    <INVALID>???</INVALID>
+
+    <!-- reserved -->
+    <INVALID>then</INVALID>
     </KEYWORDS>
   </RULES>
-  
+
   <RULES SET="TYPE_PARAMS" DEFAULT="LITERAL3">
-   <SPAN MATCH_TYPE="LITERAL3" DELEGATE="TYPE_PARAMS">
-<BEGIN>[</BEGIN>
-<END>]</END>
-</SPAN>
+    <SPAN MATCH_TYPE="LITERAL3" DELEGATE="TYPE_PARAMS">
+    <BEGIN>[</BEGIN>
+    <END>]</END>
+  </SPAN>
   </RULES>
-  
-  <RULES SET="PATTERN" DEFAULT="NULL" IGNORE_CASE="FALSE">
-   <IMPORT DELEGATE="PRIMARY"/>
 
-<SEQ TYPE="OPERATOR">@</SEQ>
+  <RULES SET="PATTERN" DEFAULT="NULL" IGNORE_CASE="FALSE"
+    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]))">
+
+    <IMPORT DELEGATE="PRIMARY"/>
+
+  <SEQ TYPE="OPERATOR">@</SEQ>
+
+  <SEQ_REGEXP AT_WORD_START="TRUE" TYPE="KEYWORD4">[A-Z][^(\s:@)\[\]]*</SEQ_REGEXP>
+  </RULES>
+
+  <RULES SET="COMMENT_BLOCK" DEFAULT="COMMENT1">
+    <SPAN TYPE="COMMENT1" DELEGATE="COMMENT_BLOCK">
+      <BEGIN>/*</BEGIN>
+      <END>*/</END>
+    </SPAN>
   </RULES>
 
   <RULES SET="SCALADOC" DEFAULT="COMMENT3" IGNORE_CASE="TRUE">
@@ -256,51 +362,67 @@ VALUE="(.*((if|while|else\s+if|for)\s*\().*\)|\s*else|\s*case.*=>|.*(def|val|var
   </RULES>
 
   <RULES SET="SCALADOC_PRE" DEFAULT="COMMENT3" />
-  
+
   <RULES SET="XML_SHARED">
-   <SPAN TYPE="COMMENT2">
-   <BEGIN><!--</BEGIN>
-   <END>--></END>
-   </SPAN>
-  
-   <SPAN TYPE="LITERAL3">
-   <BEGIN><?</BEGIN>
-   <END>?></END>
-   </SPAN>
-  
-   <SPAN MATCH_TYPE="LITERAL3" TYPE="COMMENT4">
-   <BEGIN><![CDATA[</BEGIN>
-   <END>]]></END>
-   </SPAN>
-    
+    <SPAN TYPE="COMMENT2">
+      <BEGIN><!--</BEGIN>
+      <END>--></END>
+    </SPAN>
+
+    <SPAN_REGEXP TYPE="LITERAL3" HASH_CHARS="<">
+      <BEGIN><\?[^\s]</BEGIN>
+      <END>?></END>
+    </SPAN_REGEXP>
+
+    <SPAN MATCH_TYPE="LITERAL3" TYPE="COMMENT4">
+      <BEGIN><![CDATA[</BEGIN>
+      <END>]]></END>
+    </SPAN>
+
     <SEQ_REGEXP HASH_CHAR="<" TYPE="LITERAL3"><([\d\w_\-:.]+)(\s+[\d\w_\-:.]+=('[^']*'|"[^"]*"))*\s*/\s*></SEQ_REGEXP>
-    
+
     <SPAN_REGEXP DELEGATE="XML_LITERAL" HASH_CHAR="<" MATCH_TYPE="LITERAL3" TYPE="NULL">
-     <BEGIN><([\d\w_\-:.]+)(\s+[\d\w_\-:.]+=('[^']*'|"[^"]*"))*\s*></BEGIN>
-     <END></$1></END>
+      <BEGIN><([\d\w_\-:.]+)(\s+[\d\w_\-:.]+=('[^']*'|"[^"]*"))*\s*></BEGIN>
+      <END></$1></END>
     </SPAN_REGEXP>
   </RULES>
-  
+
   <!-- TODO find a way to highlight attribute names as LABEL, attribute values as LITERAL1 -->
   <RULES SET="XML_LITERAL" DEFAULT="COMMENT4">
-   <PROPS>
-<PROPERTY NAME="commentStart" VALUE="<!--" />
-<PROPERTY NAME="commentEnd" VALUE="-->" />
-<PROPERTY NAME="lineComment" VALUE="" />
-   </PROPS>
-  
-   <IMPORT DELEGATE="XML_SHARED"/>
-  
+    <PROPS>
+    <PROPERTY NAME="commentStart" VALUE="<!--" />
+    <PROPERTY NAME="commentEnd" VALUE="-->" />
+    <PROPERTY NAME="lineComment" VALUE="" />
+    </PROPS>
+
+    <IMPORT DELEGATE="XML_SHARED"/>
+
     <SPAN DELEGATE="MAIN">
       <BEGIN>{</BEGIN>
       <END>}</END>
     </SPAN>
-    
+
     <SPAN TYPE="LABEL" NO_WORD_BREAK="TRUE">
-     <BEGIN>&</BEGIN>
-     <END>;</END>
+      <BEGIN>&</BEGIN>
+      <END>;</END>
     </SPAN>
-    
-    <SEQ_REGEXP HASH_CHAR="<" TYPE="INVALID"></[\d\w_\-:.]+></SEQ_REGEXP> <!-- unmatched closing tags -->
+
+    <SEQ_REGEXP HASH_CHAR="<" TYPE="INVALID"></[\d\w_\-:.]+></SEQ_REGEXP>		<!-- unmatched closing tags -->
   </RULES>
-</MODE>
\ No newline at end of file
+
+  <RULES SET="STRING" DEFAULT="LITERAL1">
+    <SEQ TYPE="LITERAL1">$$</SEQ>
+
+    <SPAN DELEGATE="MAIN">
+      <BEGIN>${</BEGIN>
+      <END>}</END>
+    </SPAN>
+
+    <MARK_FOLLOWING TYPE="NULL" MATCH_TYPE="NULL">$</MARK_FOLLOWING>
+  </RULES>
+
+  <RULES SET="TYPE" DEFAULT="KEYWORD4">
+    <IMPORT DELEGATE="MAIN"/>
+  </RULES>
+</MODE>
+
diff --git a/org/gjt/sp/jedit/Abbrevs.java b/org/gjt/sp/jedit/Abbrevs.java
index bf26453..eef9d73 100644
--- a/org/gjt/sp/jedit/Abbrevs.java
+++ b/org/gjt/sp/jedit/Abbrevs.java
@@ -33,7 +33,7 @@ import org.gjt.sp.util.Log;
 /**
  * Abbreviation manager.
  * @author Slava Pestov
- * @version $Id: Abbrevs.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: Abbrevs.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 public class Abbrevs
 {
@@ -41,7 +41,7 @@ public class Abbrevs
 
 	//{{{ getExpandOnInput() method
 	/**
-	 * Returns if abbreviations should be expanded after the
+	 * @return if abbreviations should be expanded after the
 	 * user finishes typing a word.
 	 */
 	public static boolean getExpandOnInput()
@@ -68,6 +68,7 @@ public class Abbrevs
 	 * @param view The view
 	 * @param add If true and abbrev not found, will ask user if
 	 * it should be added
+	 * @return if expanded
 	 * @since jEdit 2.6pre4
 	 */
 	public static boolean expandAbbrev(View view, boolean add)
@@ -190,7 +191,7 @@ public class Abbrevs
 
 	//{{{ getGlobalAbbrevs() method
 	/**
-	 * Returns the global abbreviation set.
+	 * @return the global abbreviation set.
 	 * @since jEdit 2.3pre1
 	 */
 	public static Hashtable<String,String> getGlobalAbbrevs()
@@ -215,7 +216,7 @@ public class Abbrevs
 
 	//{{{ getModeAbbrevs() method
 	/**
-	 * Returns the mode-specific abbreviation set.
+	 * @return the mode-specific abbreviation set.
 	 * @since jEdit 2.3pre1
 	 */
 	public static Hashtable<String,Hashtable<String,String>> getModeAbbrevs()
diff --git a/org/gjt/sp/jedit/AbstractOptionPane.java b/org/gjt/sp/jedit/AbstractOptionPane.java
index 8d47ba8..058244e 100644
--- a/org/gjt/sp/jedit/AbstractOptionPane.java
+++ b/org/gjt/sp/jedit/AbstractOptionPane.java
@@ -56,7 +56,7 @@ import java.awt.*;
  *
  * @author Slava Pestov
  * @author John Gellene (API documentation)
- * @version $Id: AbstractOptionPane.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: AbstractOptionPane.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 // even though this class is called AbstractOptionPane, it is not really
 // abstract, since BufferOptions uses an instance of it to lay out its
@@ -119,6 +119,8 @@ public class AbstractOptionPane extends JPanel implements OptionPane
 
 	//{{{ newLabel()
 	/**
+	 * @param label The label to associate with comp
+	 * @param comp The component to associate the label
 	 * @return a label which has the same tooltiptext as the Component
 	 *    that it is a label for. This is used to create labels from inside
 	 *    AbstractOptionPane.
diff --git a/org/gjt/sp/jedit/ActionSet.java b/org/gjt/sp/jedit/ActionSet.java
index c6b3802..5399a30 100644
--- a/org/gjt/sp/jedit/ActionSet.java
+++ b/org/gjt/sp/jedit/ActionSet.java
@@ -33,7 +33,7 @@ import org.gjt.sp.util.Log;
 
 /**
  * A set of actions, either loaded from an XML file, or constructed at runtime
- * by a plugin. <p>
+ * by a plugin. 
  *
  * <h3>Action sets loaded from XML files</h3>
  *
@@ -139,7 +139,7 @@ import org.gjt.sp.util.Log;
  *
  * @author Slava Pestov
  * @author John Gellene (API documentation)
- * @version $Id: ActionSet.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: ActionSet.java 23981 2015-08-10 14:56:24Z daleanson $
  * @since jEdit 4.0pre1
  */
 public class ActionSet extends JEditActionSet<EditAction> implements Comparable
@@ -229,7 +229,7 @@ public class ActionSet extends JEditActionSet<EditAction> implements Comparable
 
 	//{{{ getLabel() method
 	/**
-	 * Return the action source label.
+	 * @return the action source label.
 	 * @since jEdit 4.0pre1
 	 */
 	public String getLabel()
@@ -252,7 +252,7 @@ public class ActionSet extends JEditActionSet<EditAction> implements Comparable
 
 	//{{{ getPluginJAR() method
 	/**
-	 * Return the plugin this action set was loaded from, or null.
+	 * @return the plugin this action set was loaded from, or null.
 	 * @since jEdit 4.2pre13
 	 */
 	public PluginJAR getPluginJAR()
diff --git a/org/gjt/sp/jedit/BeanShell.java b/org/gjt/sp/jedit/BeanShell.java
index f3ce696..9f7a38a 100644
--- a/org/gjt/sp/jedit/BeanShell.java
+++ b/org/gjt/sp/jedit/BeanShell.java
@@ -58,7 +58,7 @@ import org.gjt.sp.util.TaskManager;
  * </ul>
  *
  * @author Slava Pestov
- * @version $Id: BeanShell.java 22851 2013-03-17 11:03:48Z thomasmey $
+ * @version $Id: BeanShell.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 public class BeanShell
 {
@@ -72,6 +72,8 @@ public class BeanShell
 	//{{{ evalSelection() method
 	/**
 	 * Evaluates the text selected in the specified text area.
+	 * @param view The view
+	 * @param textArea The text area
 	 * @since jEdit 2.7pre2
 	 */
 	public static void evalSelection(View view, JEditTextArea textArea)
@@ -82,6 +84,7 @@ public class BeanShell
 	//{{{ showEvaluateDialog() method
 	/**
 	 * Prompts for a BeanShell expression to evaluate.
+	 * @param view the View
 	 * @since jEdit 2.7pre2
 	 */
 	public static void showEvaluateDialog(View view)
@@ -125,6 +128,7 @@ public class BeanShell
 	//{{{ showEvaluateLinesDialog() method
 	/**
 	 * Evaluates the specified script for each selected line.
+	 * @param view The view
 	 * @since jEdit 4.0pre1
 	 */
 	public static void showEvaluateLinesDialog(View view)
@@ -370,6 +374,7 @@ public class BeanShell
 	 * are determined with reference to this parameter.
 	 * @param namespace The namespace
 	 * @param command The expression
+	 * @return an object
 	 * @since jEdit 4.0pre8
 	 */
 	public static Object eval(View view, NameSpace namespace, String command)
@@ -387,6 +392,7 @@ public class BeanShell
 	 * are determined with reference to this parameter.
 	 * @param namespace The namespace
 	 * @param command The expression
+	 * @return the object
 	 * @exception Exception instances are thrown when various BeanShell
 	 * errors occur
 	 * @since jEdit 3.2pre7
@@ -404,6 +410,7 @@ public class BeanShell
 	 * @param id An identifier. If null, a unique identifier is generated
 	 * @param code The code
 	 * @param namespace If true, the namespace will be set
+	 * @return a bsh method
 	 * @exception Exception instances are thrown when various BeanShell errors
 	 * occur
 	 * @since jEdit 4.1pre1
@@ -421,6 +428,7 @@ public class BeanShell
 	 * @param method The method instance returned by cacheBlock()
 	 * @param view The view
 	 * @param namespace The namespace to run the code in
+	 * @return an object
 	 * @exception Exception instances are thrown when various BeanShell
 	 * errors occur
 	 * @since jEdit 4.1pre1
@@ -433,7 +441,7 @@ public class BeanShell
 
 	//{{{ isScriptRunning() method
 	/**
-	 * Returns if a BeanShell script or macro is currently running.
+	 * @return if a BeanShell script or macro is currently running.
 	 * @since jEdit 2.7pre2
 	 */
 	public static boolean isScriptRunning()
@@ -443,7 +451,7 @@ public class BeanShell
 
 	//{{{ getNameSpace() method
 	/**
-	 * Returns the global namespace.
+	 * @return the global namespace.
 	 * @since jEdit 3.2pre5
 	 */
 	public static NameSpace getNameSpace()
diff --git a/org/gjt/sp/jedit/BeanShellFacade.java b/org/gjt/sp/jedit/BeanShellFacade.java
index 391e3d7..4d86cd9 100644
--- a/org/gjt/sp/jedit/BeanShellFacade.java
+++ b/org/gjt/sp/jedit/BeanShellFacade.java
@@ -73,6 +73,8 @@ public abstract class BeanShellFacade<T>
 	//{{{ evalSelection() method
 	/**
 	 * Evaluates the text selected in the specified text area.
+	 * @param param some sort of parameter
+	 * @param textArea the textArea
 	 */
 	public void evalSelection(T param, TextArea textArea)
 	{
@@ -92,6 +94,7 @@ public abstract class BeanShellFacade<T>
 	 * Evaluates the specified BeanShell expression with the global namespace
 	 * @param param The parameter
 	 * @param command The expression
+	 * @return an object
 	 */
 	public Object eval(T param, String command)
 	{
@@ -105,6 +108,7 @@ public abstract class BeanShellFacade<T>
 	 * @param param The parameter
 	 * @param namespace The namespace
 	 * @param command The expression
+	 * @return an object
 	 */
 	public Object eval(T param, NameSpace namespace, String command)
 	{
@@ -132,6 +136,7 @@ public abstract class BeanShellFacade<T>
 	 * are determined with reference to this parameter.
 	 * @param namespace The namespace
 	 * @param command The expression
+	 * @return an object
 	 * @exception Exception instances are thrown when various BeanShell
 	 * errors occur
 	 */
@@ -173,6 +178,7 @@ public abstract class BeanShellFacade<T>
 	 * @param id An identifier.
 	 * @param code The code
 	 * @param namespace If true, the namespace will be set
+	 * @return a hsh method
 	 * @exception Exception instances are thrown when various BeanShell errors
 	 * occur
 	 */
@@ -202,7 +208,9 @@ public abstract class BeanShellFacade<T>
 	 * Runs a cached block of code in the specified namespace. Faster than
 	 * evaluating the block each time.
 	 * @param method The method instance returned by cacheBlock()
+	 * @param param a parameter
 	 * @param namespace The namespace to run the code in
+	 * @return an object
 	 * @exception Exception instances are thrown when various BeanShell
 	 * errors occur
 	 */
@@ -248,7 +256,7 @@ public abstract class BeanShellFacade<T>
 
 	//{{{ getNameSpace() method
 	/**
-	 * Returns the global namespace.
+	 * @return the global namespace.
 	 */
 	public NameSpace getNameSpace()
 	{
@@ -271,7 +279,7 @@ public abstract class BeanShellFacade<T>
 	 * @param nameSpace the namespace
 	 * @param name the name of the variable
 	 * @param object the value of the variable
-	 * @throws UtilEvalError
+	 * @throws UtilEvalError when there is an error
 	 */
 	protected void setVariable(NameSpace nameSpace, String name, Object object) throws UtilEvalError
 	{
@@ -303,6 +311,8 @@ public abstract class BeanShellFacade<T>
 	/**
 	 * This extracts an exception from a 'wrapping' exception, as BeanShell
 	 * sometimes throws. This gives the user a more accurate error traceback
+	 * @param e the exception
+	 * @throws Exception on error
 	 */
 	protected static void unwrapException(Exception e) throws Exception
 	{
diff --git a/org/gjt/sp/jedit/Buffer.java b/org/gjt/sp/jedit/Buffer.java
index 6ca59cd..2dbe994 100644
--- a/org/gjt/sp/jedit/Buffer.java
+++ b/org/gjt/sp/jedit/Buffer.java
@@ -92,7 +92,7 @@ import org.gjt.sp.util.ThreadUtilities;
 
  *
  * @author Slava Pestov
- * @version $Id: Buffer.java 23221 2013-09-29 20:03:32Z shlomy $
+ * @version $Id: Buffer.java 24087 2015-09-19 20:56:09Z daleanson $
  */
 public class Buffer extends JEditBuffer
 {
@@ -174,7 +174,7 @@ public class Buffer extends JEditBuffer
 	 * @param view The view
 	 * @param reload If true, user will not be asked to recover autosave
 	 * file, if any
-	 *
+	 * @return true if loaded
 	 * @since 2.5pre1
 	 */
 	public boolean load(final View view, final boolean reload)
@@ -311,7 +311,7 @@ public class Buffer extends JEditBuffer
 	 * Loads a file from disk, and inserts it into this buffer.
 	 * @param view The view
 	 * @param path the path of the file to insert
-	 *
+	 * @return true if the file was inserted
 	 * @since 4.0pre1
 	 */
 	public boolean insertFile(View view, String path)
@@ -443,7 +443,7 @@ public class Buffer extends JEditBuffer
 			GUIUtilities.error(view,"buffer-multiple-io",null);
 			return false;
 		}
-
+		
 		setBooleanProperty(BufferIORequest.ERROR_OCCURRED,false);
 
 		if(path == null && getFlag(NEW_FILE))
@@ -631,6 +631,7 @@ public class Buffer extends JEditBuffer
 	public static final int FILE_DELETED = 2;
 	/**
 	 * Check if the buffer has changed on disk.
+	 * @param view the View
 	 * @return One of <code>FILE_NOT_CHANGED</code>, <code>FILE_CHANGED</code>, or
 	 * <code>FILE_DELETED</code>.
 	 *
@@ -681,7 +682,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getLastModified() method
 	/**
-	 * Returns the last time jEdit modified the file on disk.
+	 * @return the last time jEdit modified the file on disk.
 	 * This method is thread-safe.
 	 */
 	public long getLastModified()
@@ -701,7 +702,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getAutoReload() method
 	/**
-	 * Returns the status of the AUTORELOAD flag
+	 * @return the status of the AUTORELOAD flag
 	 * If true, reload changed files automatically
 	 */
 	public boolean getAutoReload()
@@ -735,7 +736,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getAutoReloadDialog() method
 	/**
-	 * Returns the status of the AUTORELOAD_DIALOG flag
+	 * @return the status of the AUTORELOAD_DIALOG flag
 	 * If true, prompt for reloading or notify user
 	 * when the file has changed on disk
 	 */
@@ -761,6 +762,7 @@ public class Buffer extends JEditBuffer
 	/**
 	 * Returns the virtual filesystem responsible for loading and
 	 * saving this buffer. This method is thread-safe.
+	 * @return the VFS
 	 */
 	public VFS getVFS()
 	{
@@ -769,7 +771,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getAutosaveFile() method
 	/**
-	 * Returns the autosave file for this buffer. This may be null if
+	 * @return the autosave file for this buffer. This may be null if
 	 * the file is non-local.
 	 */
 	public File getAutosaveFile()
@@ -793,7 +795,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getName() method
 	/**
-	 * Returns the name of this buffer. This method is thread-safe.
+	 * @return the name of this buffer. This method is thread-safe.
 	 */
 	public String getName()
 	{
@@ -802,7 +804,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getPath() method
 	/**
-	 * Returns the path name of this buffer. This method is thread-safe.
+	 * @return the path name of this buffer. This method is thread-safe.
 	 */
 	public String getPath()
 	{
@@ -812,6 +814,7 @@ public class Buffer extends JEditBuffer
 	//{{{ getPath() method
 	/**
 	  * @param shortVersion if true, replaces home path with ~/ on unix
+	  * @return the path
 	  */
 	public String getPath(Boolean shortVersion)
 	{
@@ -821,7 +824,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getSymlinkPath() method
 	/**
-	 * If this file is a symbolic link, returns the link destination.
+	 * @return If this file is a symbolic link, returns the link destination.
 	 * Otherwise returns the file's path. This method is thread-safe.
 	 * @since jEdit 4.2pre1
 	 */
@@ -832,7 +835,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getDirectory() method
 	/**
-	 * Returns the directory containing this buffer.
+	 * @return the directory containing this buffer.
 	 * @since jEdit 4.1pre11
 	 */
 	public String getDirectory()
@@ -842,7 +845,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ isClosed() method
 	/**
-	 * Returns true if this buffer has been closed with
+	 * @return true if this buffer has been closed with
 	 * {@link org.gjt.sp.jedit.jEdit#closeBuffer(View,Buffer)}.
 	 * This method is thread-safe.
 	 */
@@ -853,7 +856,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ isLoaded() method
 	/**
-	 * Returns true if the buffer is loaded. This method is thread-safe.
+	 * @return true if the buffer is loaded. This method is thread-safe.
 	 */
 	public boolean isLoaded()
 	{
@@ -862,7 +865,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ isNewFile() method
 	/**
-	 * Returns whether this buffer lacks a corresponding version on disk.
+	 * @return whether this buffer lacks a corresponding version on disk.
 	 * This method is thread-safe.
 	 */
 	public boolean isNewFile()
@@ -884,7 +887,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ isUntitled() method
 	/**
-	 * Returns true if this file is 'untitled'. This method is thread-safe.
+	 * @return true if this file is 'untitled'. This method is thread-safe.
 	 */
 	public boolean isUntitled()
 	{
@@ -931,7 +934,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ isTemporary() method
 	/**
-	 * Returns if this is a temporary buffer. This method is thread-safe.
+	 * @return if this is a temporary buffer. This method is thread-safe.
 	 * @see jEdit#openTemporary(View,String,String,boolean)
 	 * @see jEdit#commitTemporary(Buffer)
 	 * @since jEdit 2.2pre7
@@ -943,7 +946,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getIcon() method
 	/**
-	 * Returns this buffer's icon.
+	 * @return this buffer's icon.
 	 * @since jEdit 2.6pre6
 	 */
 	public Icon getIcon()
@@ -1248,6 +1251,7 @@ public class Buffer extends JEditBuffer
 	/**
 	 * @deprecated Do not call this method, use {@link #getPath()}
 	 * instead.
+	 * @return the file
 	 */
 	@Deprecated
 	public File getFile()
@@ -1261,7 +1265,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getMarkers() method
 	/**
-	 * Returns a vector of markers.
+	 * @return a vector of markers.
 	 * @since jEdit 3.2pre1
 	 */
 	public Vector<Marker> getMarkers()
@@ -1271,7 +1275,8 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getMarkerStatusPrompt() method
 	/**
-	 * Returns the status prompt for the given marker action. Only
+	 * @param action some action
+	 * @return the status prompt for the given marker action. Only
 	 * intended to be called from <code>actions.xml</code>.
 	 * @since jEdit 4.2pre2
 	 */
@@ -1283,7 +1288,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getMarkerNameString() method
 	/**
-	 * Returns a string of all set markers, used by the status bar
+	 * @return a string of all set markers, used by the status bar
 	 * (eg, "a b $ % ^").
 	 * @since jEdit 4.2pre2
 	 */
@@ -1379,7 +1384,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getMarkerInRange() method
 	/**
-	 * Returns the first marker within the specified range.
+	 * @return the first marker within the specified range.
 	 * @param start The start offset
 	 * @param end The end offset
 	 * @since jEdit 4.0pre4
@@ -1398,7 +1403,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getMarkerAtLine() method
 	/**
-	 * Returns the first marker at the specified line, or <code>null</code>
+	 * @return the first marker at the specified line, or <code>null</code>
 	 * if there is none.
 	 * @param line The line number
 	 * @since jEdit 3.2pre2
@@ -1461,7 +1466,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getMarker() method
 	/**
-	 * Returns the marker with the specified shortcut.
+	 * @return the marker with the specified shortcut.
 	 * @param shortcut The shortcut
 	 * @since jEdit 3.2pre2
 	 */
@@ -1481,6 +1486,7 @@ public class Buffer extends JEditBuffer
 	 * @param vfs The appropriate VFS
 	 * @param path the path of the buffer, it can be different from the field
 	 * when using save-as
+	 * @return the marker path
 	 * @since jEdit 4.3pre10
 	 */
 	public static String getMarkersPath(VFS vfs, String path)
@@ -1496,6 +1502,7 @@ public class Buffer extends JEditBuffer
 	 * Handling markers is now independent from saving the buffer.
 	 * Changing markers will not set the buffer dirty any longer.
 	 * @param view The current view
+	 * @return true if markers were updated
 	 * @since jEdit 4.3pre7
 	 */
 	public boolean updateMarkersFile(View view)
@@ -1522,7 +1529,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ markersChanged() method
 	/**
-	 * Return true when markers have changed and the markers file needs
+	 * @return true when markers have changed and the markers file needs
 	 * to be updated
 	 * @since jEdit 4.3pre7
 	 */
@@ -1534,6 +1541,7 @@ public class Buffer extends JEditBuffer
 	//{{{ setMarkersChanged() method
 	/**
 	 * Sets/unsets the MARKERS_CHANGED flag
+	 * @param changed changed
 	 * @since jEdit 4.3pre7
 	 */
 	public void setMarkersChanged(boolean changed)
@@ -1548,6 +1556,7 @@ public class Buffer extends JEditBuffer
 	//{{{ setWaitSocket() method
 	/**
 	 * This socket is closed when the buffer is closed.
+	 * @param waitSocket the socket
 	 */
 	public void setWaitSocket(Socket waitSocket)
 	{
@@ -1556,7 +1565,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getNext() method
 	/**
-	 * Returns the next buffer in the list.
+	 * @return the next buffer in the list.
 	 */
 	public Buffer getNext()
 	{
@@ -1565,7 +1574,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getPrev() method
 	/**
-	 * Returns the previous buffer in the list.
+	 * @return the previous buffer in the list.
 	 */
 	public Buffer getPrev()
 	{
@@ -1574,7 +1583,7 @@ public class Buffer extends JEditBuffer
 
 	//{{{ getIndex() method
 	/**
-	 * Returns the position of this buffer in the buffer list.
+	 * @return the position of this buffer in the buffer list.
 	 */
 	public int getIndex()
 	{
@@ -2192,8 +2201,6 @@ public class Buffer extends JEditBuffer
 						!newMode.equals(getMode()
 						.getName()))
 						setMode();
-					else
-						propertiesChanged();
 				}
 
 				updateHash();
diff --git a/org/gjt/sp/jedit/Debug.java b/org/gjt/sp/jedit/Debug.java
index 9bf7d22..64598ae 100644
--- a/org/gjt/sp/jedit/Debug.java
+++ b/org/gjt/sp/jedit/Debug.java
@@ -27,7 +27,7 @@ package org.gjt.sp.jedit;
  * development) and debugging routines.
  * @since jEdit 4.2pre1
  * @author Slava Pestov
- * @version $Id: Debug.java 23185 2013-09-18 20:01:10Z ezust $
+ * @version $Id: Debug.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 public class Debug
 {
@@ -154,6 +154,7 @@ public class Debug
 	 * the given period of time. Used to force conditions that are
 	 * hard to reproduce, for example deadlock cases.
 	 * @param time Required delay, in ms
+	 * @return an integer
 	 */
 	public static int compDelay(long time)
 	{
diff --git a/org/gjt/sp/jedit/EBMessage.java b/org/gjt/sp/jedit/EBMessage.java
index 8eee381..1f3d3a5 100644
--- a/org/gjt/sp/jedit/EBMessage.java
+++ b/org/gjt/sp/jedit/EBMessage.java
@@ -34,7 +34,7 @@ package org.gjt.sp.jedit;
  *
  * @author Slava Pestov
  * @author John Gellene (API documentation)
- * @version $Id: EBMessage.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: EBMessage.java 23981 2015-08-10 14:56:24Z daleanson $
  *
  * @since jEdit 2.2pre6
  */
@@ -63,7 +63,7 @@ public abstract class EBMessage
 
 	//{{{ getSource() method
 	/**
-	 * Returns the sender of this message.
+	 * @return the sender of this message.
 	 * @since jEdit 4.2pre1
 	 */
 	public Object getSource()
@@ -86,7 +86,7 @@ public abstract class EBMessage
 
 	//{{{ paramString() method
 	/**
-	 * Returns a string representation of this message's parameters.
+	 * @return a string representation of this message's parameters.
 	 */
 	public String paramString()
 	{
diff --git a/org/gjt/sp/jedit/EditAction.java b/org/gjt/sp/jedit/EditAction.java
index 8a550a1..552d353 100644
--- a/org/gjt/sp/jedit/EditAction.java
+++ b/org/gjt/sp/jedit/EditAction.java
@@ -37,7 +37,7 @@ import java.awt.event.ActionListener;
  * @see ActionSet
  *
  * @author Slava Pestov
- * @version $Id: EditAction.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: EditAction.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 public abstract class EditAction extends JEditAbstractEditAction<View>
 {
@@ -58,7 +58,7 @@ public abstract class EditAction extends JEditAbstractEditAction<View>
 			
 	//{{{ getLabel() method
 	/**
-	 * Returns the action's label. This returns the
+	 * @return the action's label. This returns the
 	 * value of the property named by {@link #getName()} suffixed
 	 * with <code>.label</code>.
 	 * 
@@ -74,7 +74,7 @@ public abstract class EditAction extends JEditAbstractEditAction<View>
 
 	//{{{ getMouseOverText() method
 	/**
-	 * Returns the action's mouse over message. This returns the
+	 * @return the action's mouse over message. This returns the
 	 * value of the property named by {@link #getName()} suffixed
 	 * with <code>.mouse-over</code>.
 	 */
@@ -97,7 +97,7 @@ public abstract class EditAction extends JEditAbstractEditAction<View>
 
 	//{{{ isToggle() method
 	/**
-	 * Returns if this edit action should be displayed as a check box
+	 * @return if this edit action should be displayed as a check box
 	 * in menus. This returns the
 	 * value of the property named by {@link #getName()} suffixed
 	 * with <code>.toggle</code>.
@@ -111,7 +111,7 @@ public abstract class EditAction extends JEditAbstractEditAction<View>
 
 	//{{{ isSelected() method
 	/**
-	 * If this edit action is a toggle, returns if it is selected or not.
+	 * @return If this edit action is a toggle, returns if it is selected or not.
 	 * @param comp The component
 	 * @since jEdit 4.2pre1
 	 */
@@ -122,7 +122,7 @@ public abstract class EditAction extends JEditAbstractEditAction<View>
 
 	//{{{ noRepeat() method
 	/**
-	 * Returns if this edit action should not be repeated. Returns false
+	 * @return if this edit action should not be repeated. Returns false
 	 * by default.
 	 * @since jEdit 2.7pre2
 	 */
@@ -133,7 +133,7 @@ public abstract class EditAction extends JEditAbstractEditAction<View>
 
 	//{{{ noRecord() method
 	/**
-	 * Returns if this edit action should not be recorded. Returns false
+	 * @return if this edit action should not be recorded. Returns false
 	 * by default.
 	 * @since jEdit 2.7pre2
 	 */
@@ -144,7 +144,7 @@ public abstract class EditAction extends JEditAbstractEditAction<View>
 
 	//{{{ noRememberLast() method
 	/**
-	 * Returns if this edit action should not be remembered as the most
+	 * @return if this edit action should not be remembered as the most
 	 * recently invoked action.
 	 * @since jEdit 4.2pre1
 	 */
@@ -155,7 +155,7 @@ public abstract class EditAction extends JEditAbstractEditAction<View>
 
 	//{{{ getCode() method
 	/**
-	 * Returns the BeanShell code that will replay this action.
+	 * @return the BeanShell code that will replay this action.
 	 * BeanShellAction.getCode() returns something more interesting for Actions that were loaded
 	 * from the actions.xml file. 
 	 * You do not need to override this method if your action name is unique,
@@ -184,6 +184,8 @@ public abstract class EditAction extends JEditAbstractEditAction<View>
 		
 		/**
 		 * Creates a new action listener wrapper.
+		 * @param context the action context
+		 * @param actionName the name of the action
 		 * @since jEdit 4.2pre1
 		 */
 		public Wrapper(ActionContext context, String actionName)
diff --git a/org/gjt/sp/jedit/EditBus.java b/org/gjt/sp/jedit/EditBus.java
index fed3df4..c07b9e3 100644
--- a/org/gjt/sp/jedit/EditBus.java
+++ b/org/gjt/sp/jedit/EditBus.java
@@ -80,7 +80,7 @@ import org.gjt.sp.util.ThreadUtilities;
  *
  * @author Slava Pestov
  * @author John Gellene (API documentation)
- * @version $Id: EditBus.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: EditBus.java 24044 2015-09-03 13:34:54Z daleanson $
  *
  * @since jEdit 2.2pre6
  */
@@ -113,7 +113,7 @@ public class EditBus
 	public static @interface EBHandler
 	{
 		/**
-		 * Whether the message should match the exact type of
+		 * @return Whether the message should match the exact type of
 		 * the parameter, instead of a compatible type.
 		 */
 		boolean exact() default false;
@@ -238,7 +238,7 @@ public class EditBus
 				     EBMessage msg)
 		throws Exception
 	{
-		if (emh.handler != null)
+		if (emh.handler != null && emh.comp != null)
 			emh.handler.invoke(emh.comp, msg);
 		else
 		{
diff --git a/org/gjt/sp/jedit/EditPane.java b/org/gjt/sp/jedit/EditPane.java
index 72c7f16..0c5f947 100644
--- a/org/gjt/sp/jedit/EditPane.java
+++ b/org/gjt/sp/jedit/EditPane.java
@@ -89,7 +89,7 @@ import org.gjt.sp.util.ThreadUtilities;
  * @see View#getEditPanes()
  *
  * @author Slava Pestov
- * @version $Id: EditPane.java 23701 2014-10-26 14:09:49Z ezust $
+ * @version $Id: EditPane.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 public class EditPane extends JPanel implements BufferSetListener
 {
@@ -494,6 +494,7 @@ public class EditPane extends JPanel implements BufferSetListener
 	//{{{ goToNextMarker() method
 	/**
 	 * Moves the caret to the next marker.
+	 * @param select whether to select the marker
 	 * @since jEdit 4.3pre3
 	 */
 	public void goToNextMarker(boolean select)
@@ -531,6 +532,7 @@ public class EditPane extends JPanel implements BufferSetListener
 	//{{{ goToPrevMarker() method
 	/**
 	 * Moves the caret to the previous marker.
+	 * @param select whether to select the marker
 	 * @since jEdit 2.7pre2
 	 */
 	public void goToPrevMarker(boolean select)
@@ -770,36 +772,36 @@ public class EditPane extends JPanel implements BufferSetListener
 	EditPane(@Nonnull View view, @Nullable BufferSet bufferSetSource, @Nonnull Buffer buffer)
 	{
 		super(new BorderLayout());
-        BufferSet.Scope scope = jEdit.getBufferSetManager().getScope();
-        BufferSet source = bufferSetSource;
-        switch (scope)
-        {
-            case editpane:
-                // do nothing
-                break;
-            case view:
-                {
-                    EditPane editPane = view.getEditPane();
-                    if (editPane != null)
-                    {
-                        // if we have an editpane we copy it
-                        source = editPane.getBufferSet();
-                    }
-                }
-                break;
-            case global:
-                View activeView = jEdit.getActiveView();
-                if (activeView != null)
-                {
-                    EditPane editPane = activeView.getEditPane();
-                    if (editPane != null)
-                    {
-                        source = editPane.getBufferSet();
-                    }
-                }
-                break;
-        }
-        bufferSet = new BufferSet(source);
+		BufferSet.Scope scope = jEdit.getBufferSetManager().getScope();
+		BufferSet source = bufferSetSource;
+		switch (scope)
+		{
+			case editpane:
+				// do nothing
+				break;
+			case view:
+				{
+					EditPane editPane = view.getEditPane();
+					if (editPane != null)
+					{
+						// if we have an editpane we copy it
+						source = editPane.getBufferSet();
+					}
+				}
+				break;
+			case global:
+				View activeView = jEdit.getActiveView();
+				if (activeView != null)
+				{
+					EditPane editPane = activeView.getEditPane();
+					if (editPane != null)
+					{
+						source = editPane.getBufferSet();
+					}
+				}
+				break;
+		}
+		bufferSet = new BufferSet(source);
 
 		init = true;
 
@@ -999,6 +1001,8 @@ public class EditPane extends JPanel implements BufferSetListener
 			jEdit.getColorProperty("view.structureHighlightColor"));
 		painter.setEOLMarkersPainted(jEdit.getBooleanProperty(
 			"view.eolMarkers"));
+		painter.setEOLMarkerChar(
+			jEdit.getProperty("view.eolMarkerChar", "·"));
 		painter.setEOLMarkerColor(
 			jEdit.getColorProperty("view.eolMarkerColor"));
 		painter.setWrapGuidePainted(jEdit.getBooleanProperty(
diff --git a/org/gjt/sp/jedit/EditPlugin.java b/org/gjt/sp/jedit/EditPlugin.java
index 2018823..003f440 100644
--- a/org/gjt/sp/jedit/EditPlugin.java
+++ b/org/gjt/sp/jedit/EditPlugin.java
@@ -172,7 +172,6 @@ plugin.console.ConsolePlugin.depend.3=optional plugin projectviewer.ProjectPlugi
  * property <code>plugin.<i>className</i>.browser-menu.code</code> to be BeanShell
  * code that evaluates to an implementation of
  * {@link org.gjt.sp.jedit.menu.DynamicMenuProvider}.</p>
- *<p>
  *
  *<p> In all cases, each action's
  * menu item label is taken from the <code><i>actionName</i>.label</code>
@@ -201,7 +200,7 @@ plugin.console.ConsolePlugin.depend.3=optional plugin projectviewer.ProjectPlugi
  * for the pane in the dialog box.</li>
  * <li><code>options.<i>paneName</i>.code</code> - BeanShell code that
  * evaluates to an instance of the {@link OptionPane} class.</li>
- *
+ * </ul>
  * <h3>Example</h3>
  *
  * Here is an example set of plugin properties:
@@ -541,7 +540,7 @@ public abstract class EditPlugin
 
 	//{{{ getResourceAsOutputStream() method
 	/**
-	 * <p>Returns an output stream to the specified resource, or <code>null</node> if access
+	 * <p>Returns an output stream to the specified resource, or <code>null</code> if access
 	 * to that resource is denied.</p>
 	 *
 	 * <p>This method doesn't need the plugin to be activated. You can pass
@@ -684,7 +683,7 @@ public abstract class EditPlugin
 
 	//{{{ getClassName() method
 	/**
-	 * Returns the plugin's class name. This might not be the same as
+	 * @return the plugin's class name. This might not be the same as
 	 * the class of the actual <code>EditPlugin</code> instance, for
 	 * example if the plugin is not loaded yet.
 	 *
@@ -697,7 +696,7 @@ public abstract class EditPlugin
 
 	//{{{ getPluginJAR() method
 	/**
-	 * Returns the JAR file containing this plugin.
+	 * @return the JAR file containing this plugin.
 	 * @since jEdit 4.2pre1
 	 */
 	public PluginJAR getPluginJAR()
@@ -710,7 +709,7 @@ public abstract class EditPlugin
 	 * Called by the view when constructing its <b>Plugins</b> menu.
 	 * See the description of this class for details about how the
 	 * menu items are constructed from plugin properties.
-	 *
+	 * @return the menu item
 	 * @since jEdit 4.2pre1
 	 */
 	public final JMenuItem createMenuItems()
@@ -742,6 +741,7 @@ public abstract class EditPlugin
 	 * <b>Plugins</b> menu.
 	 * See the description of this class for details about how the
 	 * menu items are constructed from plugin properties.
+	 * @return the menu item
 	 *
 	 * @since jEdit 4.2pre1
 	 */
diff --git a/org/gjt/sp/jedit/EditServer.java b/org/gjt/sp/jedit/EditServer.java
index b6d216a..05b74b0 100644
--- a/org/gjt/sp/jedit/EditServer.java
+++ b/org/gjt/sp/jedit/EditServer.java
@@ -58,7 +58,7 @@ import org.gjt.sp.util.Log;
  * complicated stuff can be done too.
  *
  * @author Slava Pestov
- * @version $Id: EditServer.java 23220 2013-09-29 19:19:24Z shlomy $
+ * @version $Id: EditServer.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 public class EditServer extends Thread
 {
@@ -175,7 +175,8 @@ public class EditServer extends Thread
 	 * @param newView Open a new view?
 	 * @param newPlainView Open a new plain view?
 	 * @param parent The client's parent directory
-	 * @param args A list of files. Null entries are ignored, for convinience
+	 * @param args A list of files. Null entries are ignored, for convenience
+	 * @return the buffer
 	 * @since jEdit 4.2pre1
 	 */
 	public static Buffer handleClient(boolean restore,
diff --git a/org/gjt/sp/jedit/GUIUtilities.java b/org/gjt/sp/jedit/GUIUtilities.java
index 33a04f4..23dc5bb 100644
--- a/org/gjt/sp/jedit/GUIUtilities.java
+++ b/org/gjt/sp/jedit/GUIUtilities.java
@@ -60,18 +60,27 @@ import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
 import javax.swing.JTextPane;
 import javax.swing.JToolBar;
 import javax.swing.ListSelectionModel;
 import javax.swing.SwingUtilities;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
 
 
 import java.awt.*;
 import java.awt.event.*;
+import java.awt.font.FontRenderContext;
+import java.awt.font.LineMetrics;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
 //}}}
 
-/** Various GUI utility functions related to icons, menus, toolbars, keyboard shortcuts, etc. 
+/** Various GUI utility functions related to icons, menus, toolbars, keyboard shortcuts, etc.
  *
  * The most frequently used members of this class are:
  *
@@ -88,7 +97,7 @@ import java.awt.event.*;
  * </ul>
  *
  * @author Slava Pestov
- * @version $Id: GUIUtilities.java 23449 2014-03-30 19:14:26Z kerik-sf $
+ * @version $Id: GUIUtilities.java 24110 2015-10-19 16:23:13Z vampire0 $
  */
 public class GUIUtilities
 {
@@ -97,6 +106,7 @@ public class GUIUtilities
 	//{{{ setIconPath() method
 	/**
 	 * Sets the path where jEdit looks for icons.
+	 * @param iconPath the icon path
 	 * @since jEdit 4.2pre5
 	 */
 	public static void setIconPath(String iconPath)
@@ -109,6 +119,7 @@ public class GUIUtilities
 	/**
 	 * Loads an icon.
 	 * @param iconName The icon name
+	 * @return the icon
 	 * @since jEdit 2.6pre7
 	 */
 	public static Icon loadIcon(String iconName)
@@ -168,7 +179,7 @@ public class GUIUtilities
 
 	//{{{ getEditorIcon() method
 	/**
-	 * Returns the default editor window image.
+	 * @return the default editor window image.
 	 */
 	public static Image getEditorIcon()
 	{
@@ -177,7 +188,7 @@ public class GUIUtilities
 
 	//{{{ getPluginIcon() method
 	/**
-	 * Returns the default plugin window image.
+	 * @return the default plugin window image.
 	 */
 	public static Image getPluginIcon()
 	{
@@ -192,6 +203,7 @@ public class GUIUtilities
 	/**
 	 * Creates a menubar. Plugins should not need to call this method.
 	 * @param name The menu bar name
+	 * @return the menu bar
 	 * @since jEdit 3.2pre5
 	 */
 	public static JMenuBar loadMenuBar(String name)
@@ -204,6 +216,7 @@ public class GUIUtilities
 	 * Creates a menubar. Plugins should not need to call this method.
 	 * @param context An action context
 	 * @param name The menu bar name
+	 * @return the menu bar
 	 * @since jEdit 4.2pre1
 	 */
 	public static JMenuBar loadMenuBar(ActionContext context, String name)
@@ -230,6 +243,7 @@ public class GUIUtilities
 	 * separated list of action names. An action name of <code>-</code>
 	 * inserts a separator in the menu.
 	 * @param name The menu name
+	 * @return a menu
 	 * @see #loadMenuItem(String)
 	 * @since jEdit 2.6pre2
 	 */
@@ -249,6 +263,7 @@ public class GUIUtilities
 	 * <code>jEdit.getActionContext()</code> or
 	 * <code>VFSBrowser.getActionContext()</code>.
 	 * @param name The menu name
+	 * @return a menu
 	 * @see #loadMenuItem(String)
 	 * @since jEdit 4.2pre1
 	 */
@@ -263,6 +278,9 @@ public class GUIUtilities
 	/**
 	 * Creates a popup menu.
 	 * @param name The menu name
+	 * @param evt mouse event
+	 * @param textArea the text area
+	 * @return a popup menu
 	 * @since jEdit 2.6pre2
 	 */
 	public static JPopupMenu loadPopupMenu(String name, JEditTextArea textArea, MouseEvent evt)
@@ -272,8 +290,7 @@ public class GUIUtilities
 
 	//{{{ loadPopupMenu() method
 	/**
-	 * Creates a popup menu.
-
+	 * @return a popup menu.
 	 * @param name The menu name
 	 * @since jEdit 2.6pre2
 	 */
@@ -290,6 +307,7 @@ public class GUIUtilities
 	 * <code>jEdit.getActionContext()</code> or
 	 * <code>VFSBrowser.getActionContext()</code>.
 	 * @param name The menu name
+	 * @return a popup menu
 	 * @since jEdit 4.2pre1
 	 */
 	public static JPopupMenu loadPopupMenu(ActionContext context, String name)
@@ -307,6 +325,7 @@ public class GUIUtilities
 	 * @param textArea the textArea wanting to show the popup.
 	 * 	If not null, include context menu items defined by services.
 	 * @param evt additional context info about where the mouse was when menu was requested
+	 * @return the popup menu
 	 * @since jEdit 4.3pre15
 	 */
 	public static JPopupMenu loadPopupMenu(ActionContext context, String name, JEditTextArea textArea, MouseEvent evt)
@@ -348,6 +367,7 @@ public class GUIUtilities
 	 * @return a list of menu items defined by services.
 	 *
 	 * @param textArea the TextArea desiring to display these menu items
+	 * @param evt a mouse event
 	 * @since jEdit 4.3pre15
 	 */
 	public static List<JMenuItem> getServiceContextMenuItems(JEditTextArea textArea, MouseEvent evt)
@@ -381,6 +401,7 @@ public class GUIUtilities
 	 * {@link EditAction#getLabel()} method.
 	 *
 	 * @param name The menu item name
+	 * @return the menu item
 	 * @see #loadMenu(String)
 	 * @since jEdit 2.6pre1
 	 */
@@ -394,6 +415,7 @@ public class GUIUtilities
 	 * Creates a menu item.
 	 * @param name The menu item name
 	 * @param setMnemonic True if the menu item should have a mnemonic
+	 * @return a menu item
 	 * @since jEdit 3.1pre1
 	 */
 	public static JMenuItem loadMenuItem(String name, boolean setMnemonic)
@@ -409,6 +431,7 @@ public class GUIUtilities
 	 * <code>VFSBrowser.getActionContext()</code>.
 	 * @param name The menu item name
 	 * @param setMnemonic True if the menu item should have a mnemonic
+	 * @return the menu item
 	 * @since jEdit 4.2pre1
 	 */
 	public static JMenuItem loadMenuItem(ActionContext context, String name,
@@ -432,7 +455,7 @@ public class GUIUtilities
 
 	//{{{ loadToolBar() method
 	/**
-	 * Creates a toolbar.
+	 * @return a toolbar.
 	 * @param name The toolbar name
 	 * @since jEdit 4.2pre2
 	 */
@@ -448,6 +471,7 @@ public class GUIUtilities
 	 * <code>jEdit.getActionContext()</code> or
 	 * <code>VFSBrowser.getActionContext()</code>.
 	 * @param name The toolbar name
+	 * @return the toolbar
 	 * @since jEdit 4.2pre2
 	 */
 	public static Container loadToolBar(ActionContext context, String name)
@@ -488,6 +512,7 @@ public class GUIUtilities
 	 * from the resource named '/org/gjt/sp/jedit/icons/' suffixed
 	 * with the value of the <code><i>name</i>.icon</code> property.
 	 * @param name The name of the button
+	 * @return a button
 	 */
 	public static EnhancedButton loadToolButton(String name)
 	{
@@ -505,6 +530,7 @@ public class GUIUtilities
 	 * <code>jEdit.getActionContext()</code> or
 	 * <code>VFSBrowser.getActionContext()</code>.
 	 * @param name The name of the button
+	 * @return the button
 	 * @since jEdit 4.2pre1
 	 */
 	public static EnhancedButton loadToolButton(ActionContext context,
@@ -543,6 +569,8 @@ public class GUIUtilities
 	 * `Prettifies' a menu item label by removing the `$' sign. This
 	 * can be used to process the contents of an <i>action</i>.label
 	 * property.
+	 * @param label the label
+	 * @return a pretty label
 	 */
 	public static String prettifyMenuLabel(String label)
 	{
@@ -574,7 +602,7 @@ public class GUIUtilities
 				out.append(' ');
 			out.append(getMacShortcutLabel(strokes[i]));
 		}
-		
+
 		return out.toString();
         } //}}}
 
@@ -582,7 +610,7 @@ public class GUIUtilities
 	/**
 	 * Returns a label string to show users what shortcut are
 	 * assigned to the action.
-	 * @param platform if true, show fancy platform-specific label for the modifiers. 
+	 * @param platform if true, show fancy platform-specific label for the modifiers.
 	 */
 	public static String getShortcutLabel(String action, Boolean platform)
 	{
@@ -664,13 +692,13 @@ public class GUIUtilities
 		if (EventQueue.isDispatchThread())
 		{
 			hideSplashScreen();
-	
+
 			JOptionPane.showMessageDialog(comp,
 				jEdit.getProperty(name.concat(".message"),args),
 				jEdit.getProperty(name.concat(".title"),args),
 				JOptionPane.INFORMATION_MESSAGE);
 		}
-                else 
+                else
                 {
                         try
                         {
@@ -708,13 +736,13 @@ public class GUIUtilities
 		if (EventQueue.isDispatchThread())
 		{
 			hideSplashScreen();
-	
+
 			JOptionPane.showMessageDialog(comp,
 				jEdit.getProperty(name.concat(".message"),args),
 				jEdit.getProperty(name.concat(".title"),args),
 				JOptionPane.ERROR_MESSAGE);
 		}
-                else 
+                else
                 {
                         try
                         {
@@ -784,7 +812,7 @@ public class GUIUtilities
 		if (EventQueue.isDispatchThread())
 		{
 			hideSplashScreen();
-	
+
 			return (String)JOptionPane.showInputDialog(comp,
 				jEdit.getProperty(name.concat(".message"),args),
 				jEdit.getProperty(name.concat(".title")),
@@ -807,7 +835,7 @@ public class GUIUtilities
 			return null;
 		}
 		return retValue[0];
-		
+
 	} //}}}
 
 	//{{{ inputProperty() method
@@ -829,7 +857,7 @@ public class GUIUtilities
 		if (EventQueue.isDispatchThread())
 		{
 			hideSplashScreen();
-	
+
 			String retVal = (String)JOptionPane.showInputDialog(comp,
 				jEdit.getProperty(name.concat(".message"),args),
 				jEdit.getProperty(name.concat(".title")),
@@ -856,7 +884,7 @@ public class GUIUtilities
 			return null;
 		}
 		return retValue[0];
-		
+
 	} //}}}
 
 	//{{{ confirm() method
@@ -881,7 +909,7 @@ public class GUIUtilities
 		if (EventQueue.isDispatchThread())
 		{
 			hideSplashScreen();
-	
+
 			return JOptionPane.showConfirmDialog(comp,
 				jEdit.getProperty(name + ".message",args),
 				jEdit.getProperty(name + ".title"),buttons,type);
@@ -975,12 +1003,12 @@ public class GUIUtilities
 		{
 			JList list = new JList(listModel);
 			list.setVisibleRowCount(8);
-	
+
 			Object[] message = {
 				jEdit.getProperty(name + ".message",args),
 				new JScrollPane(list)
 			};
-	
+
 			return JOptionPane.showConfirmDialog(comp,
 				message,
 				jEdit.getProperty(name + ".title"),
@@ -1004,7 +1032,7 @@ public class GUIUtilities
 			return JOptionPane.CANCEL_OPTION;
 		}
 		return retValue[0];
-		
+
 	} //}}}
 
 	//{{{ listConfirm() method
@@ -1026,19 +1054,19 @@ public class GUIUtilities
 	public static int listConfirm(final Component comp, final String name, final String[] args,
 		final Object[] listModel, final List selectedItems)
 	{
-		
+
 		if (EventQueue.isDispatchThread())
 		{
 			JList list = new JList(listModel);
 			list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
 			list.setVisibleRowCount(8);
 			list.addSelectionInterval(0,listModel.length - 1);
-	
+
 			Object[] message = {
 				jEdit.getProperty(name + ".message",args),
 				new JScrollPane(list)
 			};
-	
+
 			int ret = JOptionPane.showConfirmDialog(comp,
 								message,
 								jEdit.getProperty(name + ".title"),
@@ -1065,7 +1093,7 @@ public class GUIUtilities
 			return JOptionPane.CANCEL_OPTION;
 		}
 		return retValue[0];
-		
+
 	} //}}}
 
 	//{{{ showVFSFileDialog() methods
@@ -1149,6 +1177,32 @@ public class GUIUtilities
 
 	//}}}
 
+	//{{{ menuAcceleratorFont() method
+	/**
+	 * Menu accelerator font according to L&F defaults, with workarounds.
+	 */
+	public static Font menuAcceleratorFont()
+	{
+		if (OperatingSystem.isMacOSLF()) {
+			return UIManager.getFont("Menu.acceleratorFont");
+		}
+		else {
+			// Menu.acceleratorFont is unreliable, often not properly scaled:
+			// imitate Menu.font instead.
+			Font font1 = UIManager.getFont("Menu.font");
+			if (font1 == null) {
+				return new Font("Monospaced", Font.PLAIN, 12);
+			}
+			else {
+				Font font2 = new Font("Lucida Sans Typewriter", Font.PLAIN, font1.getSize());
+				FontRenderContext frc = new FontRenderContext(null, true, false);
+				float scale =
+					font1.getLineMetrics("", frc).getHeight() / font2.getLineMetrics("", frc).getHeight();
+				return new Font(font2.getFamily(), font2.getStyle(), (int)(scale * font1.getSize()));
+			}
+		}
+	} //}}}
+
 	//{{{ Colors and styles
 
 	//{{{ parseColor() method
@@ -1439,7 +1493,7 @@ public class GUIUtilities
 	 * Saves a window's geometry to the properties.
 	 * The geometry is saved to the <code><i>name</i>.x</code>,
 	 * <code><i>name</i>.y</code>, <code><i>name</i>.width</code> and
-	 * <code><i>name</i>.height</code> properties.<br />
+	 * <code><i>name</i>.height</code> properties.<br>
 	 * For Frame's and descendents use {@link #addSizeSaver(Frame,String)} to save the sizes
 	 * correct even if the Frame is in maximized or iconified state.
 	 * @param win The window to load geometry from
@@ -1456,7 +1510,7 @@ public class GUIUtilities
 	 * Saves a window's geometry to the properties.
 	 * The geometry is saved to the <code><i>name</i>.x</code>,
 	 * <code><i>name</i>.y</code>, <code><i>name</i>.width</code> and
-	 * <code><i>name</i>.height</code> properties.<br />
+	 * <code><i>name</i>.height</code> properties.<br>
 	 * For Frame's and descendents use {@link #addSizeSaver(Frame,Container,String)} to save the sizes
 	 * correct even if the Frame is in maximized or iconified state.
 	 * @param win The window to load geometry from
@@ -1506,25 +1560,25 @@ public class GUIUtilities
 
 	//{{{ applyTextAreaColors() method
 	/**
-	 * experimental - applies the text area colors on a Component 
-	 * (such as a dockable window) and its children. 
+	 * experimental - applies the text area colors on a Component
+	 * (such as a dockable window) and its children.
 	 * @since jEdit 5.0pre1
 	 * @author ezust
-	 * 
+	 *
 	 */
-	public static void applyTextAreaColors(Container win) 
-	{		
-		for (Component child: win.getComponents()) 
+	public static void applyTextAreaColors(Container win)
+	{
+		for (Component child: win.getComponents())
 		{
 			child.setBackground(jEdit.getColorProperty("view.bgColor", Color.WHITE));
 			child.setForeground(jEdit.getColorProperty("view.fgColor", Color.BLACK));
-			if (child instanceof JTextPane)  
+			if (child instanceof JTextPane)
 				((JTextPane)child).setUI(new javax.swing.plaf.basic.BasicEditorPaneUI());
 			if (child instanceof Container)
 				applyTextAreaColors((Container)child);
 		}
 	} //}}}
-	
+
 	//{{{ createMultilineLabel() method
 	/**
 	 * Creates a component that displays a multiple line message. This
@@ -1834,6 +1888,52 @@ public class GUIUtilities
 		return (View)getComponentParent(comp,View.class);
 	} //}}}
 
+	//{{{ setButtonContentMargin() method
+	/**
+	 * Sets the content margin of a button (for Nimbus L&F).
+	 * @param button  the button to modify
+	 * @param margin  the new margin
+	 * @since jEdit 5.3
+	 */
+	public static void setButtonContentMargin(AbstractButton button, Insets margin)
+	{
+		UIDefaults defaults = new UIDefaults();
+		defaults.put("Button.contentMargins", margin);
+		defaults.put("ToggleButton.contentMargins", margin);
+		button.putClientProperty("Nimbus.Overrides", defaults);
+	} //}}}
+
+	//{{{ defaultTableDimension() method
+	/**
+	 * JTable cell size, based on global defaults.
+	 */
+	public static Dimension defaultTableCellSize()
+	{
+		JLabel label = new JLabel("miniminiminiminiminiminiminiminiminimini");
+		UIDefaults defaults = UIManager.getDefaults();
+		Object font = defaults.get("Table.font");
+		if (font instanceof Font) label.setFont((Font)font);
+		return label.getPreferredSize();
+	} //}}}
+
+	//{{{ defaultColumnWidth() method
+	/**
+	 * Column width for JTable, based on global defaults.
+	 */
+	public static int defaultColumnWidth()
+	{
+		return defaultTableCellSize().width;
+	} //}}}
+
+	//{{{ defaultRowHeight() method
+	/**
+	 * Row height for JTable, based on global defaults.
+	 */
+	public static int defaultRowHeight()
+	{
+		return defaultTableCellSize().height;
+	} //}}}
+
 	//{{{ addSizeSaver() method
 	/**
 	* Adds a SizeSaver to the specified Frame. For non-Frame's use {@link #saveGeometry(Window,String)}
@@ -2050,7 +2150,7 @@ public class GUIUtilities
 	} //}}}
 
 	private static HashMap<String, String> macKeySymbols = null;
-	
+
 	/*
 	 * Create a list of unicode characters to be used in displaying keyboard shortcuts
 	 * on Mac OS X.
@@ -2058,7 +2158,7 @@ public class GUIUtilities
 	static
 	{
 		macKeySymbols = new HashMap<String, String>();
-		
+
 		// These are the unicode code points used in cocoa apps for displaying
 		// shortcuts.
 		macKeySymbols.put("ENTER",         "\u21A9");
@@ -2083,9 +2183,9 @@ public class GUIUtilities
 	 * names and modifiers (e.g. C+PERIOD) to symbols.
 	 */
 	private static String getMacShortcutLabel(String label)
-	{	
+	{
 		StringBuilder out = new StringBuilder();
-		
+
 		// Show the list of modifiers in standard order
 		int endOfModifiers = label.indexOf('+');
 		if (endOfModifiers != -1)
@@ -2108,13 +2208,13 @@ public class GUIUtilities
 				out.append('\u2318');  // cmd
 			}
 		}
-		
+
 		// We've done the modifiers, now do the key
 		String key = label.substring(endOfModifiers + 1);
-		
+
 		// Some keys have Mac-specific symbols
 		String text = macKeySymbols.get(key);
-		
+
 		// Others don't
 		if (text == null)
 		{
@@ -2124,7 +2224,7 @@ public class GUIUtilities
 			{
 				// e.g., convert the string "PERIOD" to the int KeyEvent.VK_PERIOD
 				int keyCode = KeyEvent.class.getField("VK_".concat(key)).getInt(null);
-				
+
 				// And then convert KeyEvent.VK_PERIOD to the string "."
 				text = KeyEvent.getKeyText(keyCode).toUpperCase();
 			}
@@ -2136,22 +2236,31 @@ public class GUIUtilities
 			}
 		}
 		out.append(text);
-		
+
 		return out.toString();
 	} //}}}
-	
+
 	private GUIUtilities() {}
 	//}}}
 
 	//{{{ Inner classes
 
+	private static final AtomicLong executorThreadsCounter = new AtomicLong();
+	private static final ScheduledExecutorService schedExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory()
+	{
+		@Override
+		public Thread newThread(Runnable r)
+		{
+			return new Thread(r, "SizeSaver-" + executorThreadsCounter.incrementAndGet());
+		}
+	});
 	//{{{ SizeSaver class
 	/**
 	 * A combined ComponentListener and WindowStateListener to continually save a Frames size.<br />
 	 * For non-Frame's use {@link GUIUtilities#saveGeometry(Window,String)}
 	 *
 	 * @author Björn Kautler
-	 * @version $Id: GUIUtilities.java 23449 2014-03-30 19:14:26Z kerik-sf $
+	 * @version $Id: GUIUtilities.java 24110 2015-10-19 16:23:13Z vampire0 $
 	 * @since jEdit 4.3pre6
 	 * @see GUIUtilities#saveGeometry(Window,Container,String)
 	 */
@@ -2160,6 +2269,7 @@ public class GUIUtilities
 		private final Frame frame;
 		private final Container parent;
 		private final String name;
+		private Future<?> resizeDelayFuture;
 
 		//{{{ SizeSaver constructors
 		/**
@@ -2193,6 +2303,8 @@ public class GUIUtilities
 		//{{{ save() method
 		private void save(int extendedState, Rectangle bounds)
 		{
+			cancelResizeSave();
+
 			switch (extendedState)
 			{
 				case Frame.MAXIMIZED_VERT:
@@ -2210,6 +2322,16 @@ public class GUIUtilities
 					break;
 			}
 		} //}}}
+		
+		//{{{ cancelResizeSave() method
+		private void cancelResizeSave()
+		{
+			if (resizeDelayFuture != null) {
+				resizeDelayFuture.cancel(false);
+				resizeDelayFuture = null;
+			}
+		}
+		//}}}
 
 		//{{{ componentResized() method
 		@Override
@@ -2228,25 +2350,19 @@ public class GUIUtilities
 				@Override
 				public void run()
 				{
-					int extendedState = frame.getExtendedState();
-					save(extendedState, bounds);
-				}
-			};
-			new Thread("Sizesavingdelay")
-			{
-				@Override
-				public void run()
-				{
-					try
+					EventQueue.invokeLater(new Runnable()
 					{
-						Thread.sleep(500L);
-					}
-					catch (InterruptedException ie)
-					{
-					}
-					EventQueue.invokeLater(sizeSaver);
+						@Override
+						public void run()
+						{
+							save(frame.getExtendedState(), bounds);
+						}
+					});
 				}
-			}.start();
+			};
+
+			cancelResizeSave();
+			resizeDelayFuture = schedExecutor.schedule(sizeSaver, 500, TimeUnit.MILLISECONDS);
 		} //}}}
 	} //}}}
 
diff --git a/org/gjt/sp/jedit/JEditActionContext.java b/org/gjt/sp/jedit/JEditActionContext.java
index 86df03a..344a6d5 100644
--- a/org/gjt/sp/jedit/JEditActionContext.java
+++ b/org/gjt/sp/jedit/JEditActionContext.java
@@ -55,7 +55,7 @@ public abstract class JEditActionContext<F extends JEditAbstractEditAction, E ex
 
 	//{{{ addActionSet() method
 	/**
-	 * Adds a new action set to the context.
+	 * @param actionSet Adds a new action set to the context.
 	 * @since jEdit 4.3pre13
 	 */
 	public void addActionSet(E actionSet)
@@ -79,7 +79,7 @@ public abstract class JEditActionContext<F extends JEditAbstractEditAction, E ex
 
 	//{{{ removeActionSet() method
 	/**
-	 * Removes an action set from the context.
+	 * @param actionSet Removes an action set from the context.
 	 * @since jEdit 4.23pre13
 	 */
 	public void removeActionSet(E actionSet)
@@ -101,7 +101,7 @@ public abstract class JEditActionContext<F extends JEditAbstractEditAction, E ex
 
 	//{{{ getActionSets() method
 	/**
-	 * Returns all registered action sets.
+	 * @return all registered action sets.
 	 * @since jEdit 4.3pre13
 	 */
 	public E[] getActionSets()
@@ -145,7 +145,7 @@ public abstract class JEditActionContext<F extends JEditAbstractEditAction, E ex
 
 	//{{{ getActionNames() method
 	/**
-	 * Returns all registered action names.
+	 * @return all registered action names.
 	 */
 	public String[] getActionNames()
 	{
diff --git a/org/gjt/sp/jedit/JEditActionSet.java b/org/gjt/sp/jedit/JEditActionSet.java
index 90b1f66..00d0263 100644
--- a/org/gjt/sp/jedit/JEditActionSet.java
+++ b/org/gjt/sp/jedit/JEditActionSet.java
@@ -226,7 +226,7 @@ public abstract class JEditActionSet<E extends JEditAbstractEditAction> implemen
 
 	//{{{ getAction() method
 	/**
-	 * Returns an action with the specified name.<p>
+	 * @return an action with the specified name.<p>
 	 *
 	 * <b>Deferred loading:</b> this will load the action set if necessary.
 	 *
@@ -252,7 +252,7 @@ public abstract class JEditActionSet<E extends JEditAbstractEditAction> implemen
 
 	//{{{ getActionCount() method
 	/**
-	 * Returns the number of actions in the set.
+	 * @return the number of actions in the set.
 	 * @since jEdit 4.0pre1
 	 */
 	public int getActionCount()
@@ -262,7 +262,7 @@ public abstract class JEditActionSet<E extends JEditAbstractEditAction> implemen
 
 	//{{{ getActionNames() method
 	/**
-	 * Returns an array of all action names in this action set.
+	 * @return an array of all action names in this action set.
 	 * @since jEdit 4.2pre1
 	 */
 	public String[] getActionNames()
@@ -279,7 +279,7 @@ public abstract class JEditActionSet<E extends JEditAbstractEditAction> implemen
 
 	//{{{ getCacheableActionNames() method
 	/**
-	 * Returns an array of all action names in this action set that should
+	 * @return an array of all action names in this action set that should
 	 * be cached; namely, <code>BeanShellAction</code>s.
 	 * @since jEdit 4.2pre1
 	 */
@@ -314,7 +314,7 @@ public abstract class JEditActionSet<E extends JEditAbstractEditAction> implemen
 
 	//{{{ getActions() method
 	/**
-	 * Returns an array of all actions in this action set.<p>
+	 * @return an array of all actions in this action set.<p>
 	 *
 	 * <b>Deferred loading:</b> this will load the action set if necessary.
 	 *
@@ -335,7 +335,7 @@ public abstract class JEditActionSet<E extends JEditAbstractEditAction> implemen
 
 	//{{{ contains() method
 	/**
-	 * Returns if this action set contains the specified action.
+	 * @return if this action set contains the specified action.
 	 * @param action The action
 	 * @since jEdit 4.2pre1
 	 */
@@ -348,7 +348,7 @@ public abstract class JEditActionSet<E extends JEditAbstractEditAction> implemen
 
 	//{{{ size() method
 	/**
-	 * Returns the number of actions in this action set.
+	 * @return the number of actions in this action set.
 	 * @since jEdit 4.2pre2
 	 */
 	public int size()
@@ -407,6 +407,13 @@ public abstract class JEditActionSet<E extends JEditAbstractEditAction> implemen
 	/**
 	 * This method should be implemented to return an action that will execute
 	 * the given code
+	 * @param actionName the action name
+	 * @param code the code
+	 * @param selected selected
+	 * @param noRepeat noRepeat
+	 * @param noRecord noRecord
+	 * @param noRememberLast noRememberLast
+	 * @return an action
 	 * @since 4.3pre13
 	 */
 	protected abstract JEditAbstractEditAction createBeanShellAction(String actionName,
diff --git a/org/gjt/sp/jedit/MiscUtilities.java b/org/gjt/sp/jedit/MiscUtilities.java
index e222256..088171f 100644
--- a/org/gjt/sp/jedit/MiscUtilities.java
+++ b/org/gjt/sp/jedit/MiscUtilities.java
@@ -57,7 +57,7 @@ import org.gjt.sp.util.StringList;
  * <li>{@link #constructPath(String,String)}</li>
  * </ul>
  *
- * @version $Id: MiscUtilities.java 23749 2014-12-04 19:51:43Z ezust $
+ * @version $Id: MiscUtilities.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 public class MiscUtilities
 {
@@ -198,7 +198,7 @@ public class MiscUtilities
 	 *
 	 *	@return an abbreviated path, replacing values with variables, if a prefix exists.
 	 *  @see #expandVariables
-	 *  @since jEdit 4.3pre16
+	 *  @since jEdit 4.3
 	 */
 	public static String abbreviate(String path)
 	{
@@ -756,7 +756,7 @@ public class MiscUtilities
 	 * Checks whether the last backup was not earlier than
 	 * <code>backupTimeDistance</code> ms ago.
 	 * @param path The file to back up.
-	 * @param backups The number of backups. Must be >= 1. If > 1, backup
+	 * @param backups The number of backups. Must be >= 1. If > 1, backup
 	 * files will be numbered.
 	 * @param backupDirectory The directory determined externally or
 	 * obtained from <code>prepareBackupDirectory</code>.
@@ -848,7 +848,7 @@ public class MiscUtilities
 	/**
 	 * Saves a backup (optionally numbered) of a file.
 	 * @param file A local file
-	 * @param backups The number of backups. Must be >= 1. If > 1, backup
+	 * @param backups The number of backups. Must be >= 1. If > 1, backup
 	 * files will be numbered.
 	 * @param backupPrefix The backup file name prefix
 	 * @param backupSuffix The backup file name suffix
@@ -867,7 +867,7 @@ public class MiscUtilities
 	 * Saves a backup (optionally numbered) of a file. Requires
 	 * specifying the backup directory and generates the backup filename.
 	 * @param file A local file
-	 * @param backups The number of backups. Must be >= 1. If > 1, backup
+	 * @param backups The number of backups. Must be >= 1. If > 1, backup
 	 * files will be numbered.
 	 * @param backupPrefix The backup file name prefix
 	 * @param backupSuffix The backup file name suffix
@@ -1505,6 +1505,27 @@ loop:		for(;;)
 
 	//}}}
 
+	//{{{ storeProperties() method
+	/**
+	 * Stores properties with sorted keys.
+     * @param props  Given properties.
+     * @param out  Output stream.
+     * @param comments  Description of the property list.
+     * @since jEdit 5.3
+	 */
+	public static void storeProperties(Properties props, OutputStream out, String comments)
+        throws IOException
+	{
+		Properties sorted = new Properties() {
+			@Override
+			public synchronized Enumeration<Object> keys() {
+				return Collections.enumeration(new TreeSet<Object>(super.keySet()));
+			}
+		};
+		sorted.putAll(props);
+		sorted.store(out, comments);
+	} //}}}
+
 	static VarCompressor svc = null;
 
 	//{{{ VarCompressor class
diff --git a/org/gjt/sp/jedit/Mode.java b/org/gjt/sp/jedit/Mode.java
index 51f1ad2..e8d6108 100644
--- a/org/gjt/sp/jedit/Mode.java
+++ b/org/gjt/sp/jedit/Mode.java
@@ -25,11 +25,7 @@ package org.gjt.sp.jedit;
 
 //{{{ Imports
 import java.lang.reflect.Method;
-import java.util.Hashtable;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
@@ -48,7 +44,7 @@ import org.gjt.sp.util.StandardUtilities;
  * One instance of this class is created for each supported edit mode.
  *
  * @author Slava Pestov
- * @version $Id: Mode.java 23224 2013-09-30 20:51:42Z shlomy $
+ * @version $Id: Mode.java 23980 2015-08-10 13:44:17Z daleanson $
  */
 public class Mode
 {
@@ -64,7 +60,7 @@ public class Mode
 	{
 		this.name = name;
 		this.ignoreWhitespace = true;
-		props = new Hashtable<String, Object>();
+		props = new Hashtable<>();
 	} //}}}
 
 	//{{{ init() method
@@ -89,7 +85,9 @@ public class Mode
 				{
 					// replace path separators by both separator possibilities in the regex
 					filepathRE = filepathRE.replaceAll("/|\\\\\\\\", "[/\\\\\\\\]");
-				} else {
+				}
+				else
+				{
 					// glob is for a filename without path, prepend the regex with
 					// an optional path prefix to be able to match against full paths
 					filepathRE = String.format("(?:.*[/\\\\])?%s", filepathRE);
@@ -156,6 +154,18 @@ public class Mode
 		}
 	} //}}}
 
+	//{{{ isUserMode method
+	public boolean isUserMode() 
+	{
+		return isUserMode;	
+	} //}}}
+	
+	//{{{ setUserMode method
+	public void setUserMode(boolean b) 
+	{
+		isUserMode = b;	
+	} //}}}
+	
 	//{{{ getProperty() method
 	/**
 	 * Returns a mode property.
@@ -325,7 +335,7 @@ public class Mode
 			int lastWindowsPos = filePath.lastIndexOf('\\');
 			int index = Math.max(lastUnixPos, lastWindowsPos);
 			String filename = filePath.substring(index + 1);
-			return filename != null && filename.equalsIgnoreCase(filenameGlob);
+			return filename.equalsIgnoreCase(filenameGlob);
 		}
 
 		return false;
@@ -477,7 +487,7 @@ public class Mode
 			if(value != null)
 			{
 				Method m = IndentRuleFactory.class.getMethod(
-					prop,new Class[] { String.class });
+					prop, String.class);
 				return (IndentRule)m.invoke(null, value);
 			}
 		}
@@ -493,7 +503,7 @@ public class Mode
 
 	//{{{ createBracketIndentRules() method
 	private void createBracketIndentRules(String prop,
-						List<IndentRule> rules)
+						Collection<IndentRule> rules)
 	{
 		String value = (String) getProperty(prop + 's');
 
@@ -506,7 +516,7 @@ public class Mode
 					char ch = value.charAt(i);
 
 					Method m = IndentRuleFactory.class.getMethod(
-						prop,new Class[] { char.class });
+						prop, char.class);
 					rules.add((IndentRule) m.invoke(null, ch));
 				}
 			}
@@ -530,5 +540,6 @@ public class Mode
 	private List<IndentRule> indentRules;
 	private String electricKeys;
 	private boolean ignoreWhitespace;
+	private boolean isUserMode;
 	//}}}
 }
diff --git a/org/gjt/sp/jedit/OptionPane.java b/org/gjt/sp/jedit/OptionPane.java
index a7f976f..74632ca 100644
--- a/org/gjt/sp/jedit/OptionPane.java
+++ b/org/gjt/sp/jedit/OptionPane.java
@@ -31,12 +31,12 @@ import java.awt.Component;
  * {@link AbstractOptionPane} instead.
  *
  * @author Slava Pestov
- * @version $Id: OptionPane.java 12504 2008-04-22 23:12:43Z ezust $
+ * @version $Id: OptionPane.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 public interface OptionPane
 {
 	/**
-	 * Returns the internal name of this option pane. The option pane's label
+	 * @return the internal name of this option pane. The option pane's label
 	 * is set to the value of the property named
 	 * <code>options.<i>name</i>.label</code>.
 	 * @see jEdit#getProperty(String)
@@ -44,7 +44,7 @@ public interface OptionPane
 	String getName();
 
 	/**
-	 * Returns the component that should be displayed for this option pane.
+	 * @return the component that should be displayed for this option pane.
 	 */
 	Component getComponent();
 
diff --git a/org/gjt/sp/jedit/PluginJAR.java b/org/gjt/sp/jedit/PluginJAR.java
index 7244b2c..9ece4fe 100644
--- a/org/gjt/sp/jedit/PluginJAR.java
+++ b/org/gjt/sp/jedit/PluginJAR.java
@@ -144,7 +144,7 @@ import static org.gjt.sp.jedit.EditBus.EBHandler;
  * @see ServiceManager
  *
  * @author Slava Pestov
- * @version $Id: PluginJAR.java 23224 2013-09-30 20:51:42Z shlomy $
+ * @version $Id: PluginJAR.java 24110 2015-10-19 16:23:13Z vampire0 $
  * @since jEdit 4.2pre1
  */
 public class PluginJAR
@@ -228,19 +228,13 @@ public class PluginJAR
 		}
 		
 		// Load extra jars that are part of this plugin
-		String jars = jEdit.getProperty("plugin." + className + ".jars");
-		if(jars != null)
+		Collection<String> jarsPaths = jar.getJars();
+		for(String _jarPath: jarsPaths)
 		{
-			String dir = MiscUtilities.getParentOfPath(path);
-			StringTokenizer st = new StringTokenizer(jars);
-			while(st.hasMoreTokens())
+			PluginJAR _jar = jEdit.getPluginJAR(_jarPath);
+			if(_jar == null)
 			{
-				String _jarPath = MiscUtilities.constructPath(dir,st.nextToken());
-				PluginJAR _jar = jEdit.getPluginJAR(_jarPath);
-				if(_jar == null)
-				{
-					jEdit.addPluginJAR(_jarPath);
-				}
+				jEdit.addPluginJAR(_jarPath);
 			}
 		}
 		jar.checkDependencies();
@@ -276,6 +270,85 @@ public class PluginJAR
 		return jar;
 	} // }}}
 	
+	//{{{ parseJarsFilesString(String path, String jarsString) method
+	/**
+	 * parse the files listed in plugin.CLASSNAME.jars or plugin.CLASSNAME.files
+	 * and return full paths to each file of the list.
+	 * @since jEdit 5.3pre1
+	 */
+	public static Collection<String> parseJarsFilesString(String path, String jarsString)
+	{
+		String dir = MiscUtilities.getParentOfPath(path);
+		StringTokenizer st = new StringTokenizer(jarsString);
+		Collection<String> jarPaths = new LinkedList<String>();
+		while(st.hasMoreTokens())
+		{
+			String _jarPath = MiscUtilities.constructPath(dir,st.nextToken());
+			jarPaths.add(_jarPath);
+		}
+		return jarPaths;
+	}
+	// }}}
+	//{{{ parseJarsFilesStringNames(String path, String jarsString) method
+	/**
+	 * parse the files listed in plugin.CLASSNAME.jars or plugin.CLASSNAME.files
+	 * and return them as a collection
+	 * @since jEdit 5.3pre1
+	 */
+	public static Collection<String> parseJarsFilesStringNames(String jarsString)
+	{
+		StringTokenizer st = new StringTokenizer(jarsString);
+		Collection<String> jarPaths = new LinkedList<String>();
+		while(st.hasMoreTokens())
+		{
+			jarPaths.add(st.nextToken());
+		}
+		return jarPaths;
+	}
+	// }}}
+
+	//{{{ getJars() method
+	/**
+	 * Get the jars listed in this plugin and return full paths to them
+	 *
+	 * @return jars full paths or empty collection if plugin is null
+	 * @since jEdit 5.3pre1
+	 */
+	public Collection<String> getJars()
+	{
+		if(plugin != null)
+		{
+			String jars = jEdit.getProperty("plugin." + plugin.getClassName() + ".jars");
+			if(jars != null)
+			{
+				return parseJarsFilesString(path, jars);
+			}
+		}
+		return Collections.emptyList();
+	}
+	// }}}
+
+	// {{{ getFiles() method
+	/**
+	 * Get the files listed in this plugin and return full paths to them
+	 *
+	 * @return files full paths or empty collection if plugin is null
+	 * @since jEdit 5.3pre1
+	 */
+	public Collection<String> getFiles()
+	{
+		if(plugin != null)
+		{
+			String files = jEdit.getProperty("plugin." + plugin.getClassName() + ".files");
+			if(files != null)
+			{
+				return parseJarsFilesString(path, files);
+			}
+		}
+		return Collections.emptyList();
+	}
+	// }}}
+
 	//{{{ getPath() method
 	/**
 	 * Returns the full path name of this plugin's JAR file.
@@ -598,29 +671,21 @@ public class PluginJAR
 
 		// each JAR file listed in the plugin's jars property
 		// needs to know that we need them
-		String jars = jEdit.getProperty("plugin."
-			+ plugin.getClassName() + ".jars");
-		if(jars != null)
-		{
-			String dir = MiscUtilities.getParentOfPath(path);
+		Collection<String> jarsPaths = getJars();
 
-			StringTokenizer st = new StringTokenizer(jars);
-			while(st.hasMoreTokens())
+		for(String jarPath: jarsPaths)
+		{
+			PluginJAR jar = jEdit.getPluginJAR(jarPath);
+			if(jar == null)
 			{
-				String jarPath = MiscUtilities.constructPath(
-					dir,st.nextToken());
-				PluginJAR jar = jEdit.getPluginJAR(jarPath);
-				if(jar == null)
-				{
-					String[] args = { jarPath };
-					jEdit.pluginError(path, "plugin-error.missing-jar",args);
-					ok = false;
-				}
-				else
-				{
-					weRequireThese.add(jarPath);
-					jar.theseRequireMe.add(path);
-				}
+				String[] args = { jarPath };
+				jEdit.pluginError(path, "plugin-error.missing-jar",args);
+				ok = false;
+			}
+			else
+			{
+				weRequireThese.add(jarPath);
+				jar.theseRequireMe.add(path);
 			}
 		}
 		
@@ -796,7 +861,7 @@ public class PluginJAR
 	//{{{ getAllDependentPlugins() method
 	/**
 	* @return an array of plugin names that have a dependency or an optional dependency on this plugin,
-	* this returns a combination of <code>getDependentPlugins</code> and getOptionallyDependentPlugins</code>.
+	* this returns a combination of <code>getDependentPlugins</code> and <code>getOptionallyDependentPlugins</code>.
 	*/
 	public String[] getAllDependentPlugins()
 	{
@@ -980,8 +1045,7 @@ public class PluginJAR
 			Buffer buffer = jEdit.getFirstBuffer();
 			while(buffer != null)
 			{
-				if(buffer.getFoldHandler() != null
-					&& buffer.getFoldHandler().getClass()
+				if(buffer.getFoldHandler().getClass()
 					.getClassLoader() == classLoader)
 				{
 					buffer.setFoldHandler(
@@ -1134,6 +1198,43 @@ public class PluginJAR
 		}
 	} //}}}
 
+	//{{{ getPluginCacheEntry() method
+	/**
+	 * Returns the cache entry for an installed but not loaded plugin.
+	 * There is no need to use this method if the plugin is loaded.
+	 *
+	 * @param path path to the the plugin jar
+	 * @return cache entry or null
+	 * @throws IOException if jEdit cannot generate cache
+	 * @since jEdit 5.3pre1
+	 */
+	public static PluginJAR.PluginCacheEntry getPluginCacheEntry(String path) throws IOException
+	{
+		PluginJAR pluginJAR = new PluginJAR(new File(path));
+		PluginJAR.PluginCacheEntry pluginCacheEntry = PluginJAR.getPluginCache(pluginJAR);
+		if (pluginCacheEntry == null)
+		{
+			try
+			{
+				pluginCacheEntry = pluginJAR.generateCache();
+			}
+			finally
+			{
+				IOUtilities.closeQuietly(pluginJAR.getZipFile());
+			}
+		}
+		if(pluginCacheEntry == null)
+		{
+			// this happens when, for some reason, two versions
+			// of a plugin are installed, e.g when XSLT.jar and
+			// xslt.jar are both in $JEDIT_HOME/jars on Linux.
+			Log.log(Log.WARNING, PluginJAR.class,
+					"couldn't load plugin "+pluginJAR.getPath()
+					+" (most likely other version exists)");
+		}
+		return pluginCacheEntry;
+	}//}}}
+
 	//}}}
 
 	//{{{ PluginJAR constructor
@@ -1674,9 +1775,7 @@ public class PluginJAR
 				FoldHandler.getFoldHandler(
 				buffer.getStringProperty("folding"));
 			// == null before loaded
-			if(buffer.getFoldHandler() != null
-				&& handler != null
-				&& handler != buffer.getFoldHandler())
+			if(handler != null && handler != buffer.getFoldHandler())
 			{
 				buffer.setFoldHandler(handler);
 			}
diff --git a/org/gjt/sp/jedit/PropertyManager.java b/org/gjt/sp/jedit/PropertyManager.java
index a4193f6..ab7d3e1 100644
--- a/org/gjt/sp/jedit/PropertyManager.java
+++ b/org/gjt/sp/jedit/PropertyManager.java
@@ -77,7 +77,7 @@ class PropertyManager
 	void saveUserProps(OutputStream out)
 		throws IOException
 	{
-		user.store(out,"jEdit properties");
+		MiscUtilities.storeProperties(user, out, "jEdit properties");
 	} //}}}
 
 	//{{{ loadPluginProps() method
diff --git a/org/gjt/sp/jedit/ServiceManager.java b/org/gjt/sp/jedit/ServiceManager.java
index f722784..796adac 100644
--- a/org/gjt/sp/jedit/ServiceManager.java
+++ b/org/gjt/sp/jedit/ServiceManager.java
@@ -84,7 +84,7 @@ import org.gjt.sp.jedit.buffer.FoldHandler;
  * Plugins may define/provide more, so the only way to see a
  * complete list of service types currently in use is by calling
  * {@link #getServiceTypes()}.
- * <br />
+ * <br>
  * To use a service from a plugin, add a piece of code somewhere that calls
  * {@link #getServiceNames(String)} and  {@link #getService(String,String)}.
  *
@@ -94,7 +94,7 @@ import org.gjt.sp.jedit.buffer.FoldHandler;
  *
  * @since jEdit 4.2pre1
  * @author Slava Pestov
- * @version $Id: ServiceManager.java 23722 2014-11-09 16:26:59Z ezust $
+ * @version $Id: ServiceManager.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 public class ServiceManager
 {
diff --git a/org/gjt/sp/jedit/View.java b/org/gjt/sp/jedit/View.java
index 9dceda1..ff264f3 100644
--- a/org/gjt/sp/jedit/View.java
+++ b/org/gjt/sp/jedit/View.java
@@ -39,7 +39,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.Stack;
@@ -134,7 +134,7 @@ import org.gjt.sp.util.StandardUtilities;
  *
  * @author Slava Pestov
  * @author John Gellene (API documentation)
- * @version $Id: View.java 23412 2014-02-11 05:06:18Z ezust $
+ * @version $Id: View.java 23878 2015-02-26 18:30:45Z ezust $
  */
 public class View extends JFrame implements InputHandlerProvider
 {
@@ -282,7 +282,7 @@ public class View extends JFrame implements InputHandlerProvider
 			if (dockingFrameworkProvider == null)
 			{
 				Log.log(Log.ERROR, View.class, "No docking framework " + framework +
-							       " available, using the original one");
+								   " available, using the original one");
 				dockingFrameworkProvider = (DockingFrameworkProvider)
 				ServiceManager.getService(
 					DOCKING_FRAMEWORK_PROVIDER_SERVICE, ORIGINAL_DOCKING_FRAMEWORK);
@@ -967,7 +967,8 @@ public class View extends JFrame implements InputHandlerProvider
 	//{{{ getBuffers() method
 	/**
 	 * Returns all Buffers opened in this View,
-	 * sorted according to View options. (as of jEdit 5.2)
+	 * Sorted according to View options. (as of jEdit 5.2)
+	 * With order preserved for unsorted buffersets (as of jEdit 5.3)
 	 * @since jEdit 5.1
 	 */
 	public Buffer[] getBuffers()
@@ -980,7 +981,7 @@ public class View extends JFrame implements InputHandlerProvider
 			if (retval == null) {
 				Comparator<Buffer> sorter = bs.getSorter();
 				if (sorter == null)
-					retval = new HashSet<Buffer>();
+					retval = new LinkedHashSet<Buffer>();
 				else
 					retval = new TreeSet<Buffer>(sorter);
 			}
@@ -1309,7 +1310,7 @@ public class View extends JFrame implements InputHandlerProvider
 
 	// {{{ closeAllMenus()
 	/** closes any popup menus that may have been opened
-	    @since jEdit 4.4pre1
+		@since jEdit 4.4pre1
 	*/
 	public void closeAllMenus()
 	{
@@ -1452,6 +1453,7 @@ public class View extends JFrame implements InputHandlerProvider
 		closeAllMenus();
 		// so you can keep typing in your editpane afterwards...
 		editPane.getTextArea().requestFocus();
+		EditBus.send(new ViewUpdate(this,ViewUpdate.FULL_SCREEN_TOGGLED));
 	} //}}}
 
 	//{{{ confirmToCloseDirty() methods
@@ -1784,7 +1786,7 @@ loop:		while (true)
 						if (buffer == null)
 						{
 							buffer = jEdit.openTemporary(jEdit.getActiveView(), null,
-											    path, true, null);
+												path, true, null);
 							jEdit.commitTemporary(buffer);
 						}
 					}
@@ -1885,7 +1887,7 @@ loop:		while (true)
 		getContentPane().remove(status);
 
 		boolean showStatus = plainView ? jEdit.getBooleanProperty("view.status.plainview.visible") :
-				    jEdit.getBooleanProperty("view.status.visible");
+					jEdit.getBooleanProperty("view.status.visible");
 		if (jEdit.getBooleanProperty("view.toolbar.alternateLayout"))
 		{
 			getContentPane().add(BorderLayout.NORTH,topToolBars);
@@ -2131,7 +2133,7 @@ loop:		while (true)
 	//{{{ getOpenBuffers() method
 	private Set<Buffer> getOpenBuffers()
 	{
-		Set<Buffer> openBuffers = new HashSet<Buffer>();
+		Set<Buffer> openBuffers = new LinkedHashSet<Buffer>();
 		for (EditPane editPane: getEditPanes())
 		{
 			openBuffers.addAll(Arrays.asList(
diff --git a/org/gjt/sp/jedit/actions.xml b/org/gjt/sp/jedit/actions.xml
index 8c199d3..d64e89f 100644
--- a/org/gjt/sp/jedit/actions.xml
+++ b/org/gjt/sp/jedit/actions.xml
@@ -1616,16 +1616,6 @@
 	</CODE>
 </ACTION>
 
-<ACTION NAME="userFeedback">
-	<CODE>
-		import java.awt.Desktop;
-		if (Desktop.isDesktopSupported())
-		{
-			Desktop.getDesktop().browse(new URI("http://jEdit.uservoice.com"));
-		}
-	</CODE>
-</ACTION>
-
 <ACTION NAME="vertical-paste">
 	<CODE>
 		Registers.paste(textArea,'$',true);
diff --git a/org/gjt/sp/jedit/browser/VFSDirectoryEntryTable.java b/org/gjt/sp/jedit/browser/VFSDirectoryEntryTable.java
index 3a01440..577862a 100644
--- a/org/gjt/sp/jedit/browser/VFSDirectoryEntryTable.java
+++ b/org/gjt/sp/jedit/browser/VFSDirectoryEntryTable.java
@@ -49,7 +49,7 @@ import org.gjt.sp.util.ThreadUtilities;
 
 /**
  * @author Slava Pestov
- * @version $Id: VFSDirectoryEntryTable.java 23222 2013-09-29 20:43:34Z shlomy $
+ * @version $Id: VFSDirectoryEntryTable.java 24021 2015-08-14 18:36:19Z makarius $
  * @since jEdit 4.2pre1
  */
 public class VFSDirectoryEntryTable extends JTable
@@ -67,7 +67,7 @@ public class VFSDirectoryEntryTable extends JTable
 			renderer = new FileCellRenderer());
 
 		header = getTableHeader();
-		header.setReorderingAllowed(false);
+		header.setReorderingAllowed(true);
 		addMouseListener(new MainMouseHandler());
 		header.addMouseListener(new MouseHandler());
 		header.setDefaultRenderer(new HeaderRenderer(
@@ -495,8 +495,7 @@ public class VFSDirectoryEntryTable extends JTable
 	{
 		VFSDirectoryEntryTableModel model = (VFSDirectoryEntryTableModel)getModel();
 
-		FontRenderContext fontRenderContext = new FontRenderContext(
-			null,false,false);
+		FontRenderContext fontRenderContext = new FontRenderContext(null,true,false);
 		int[] widths = new int[model.getColumnCount()];
 		for(int i = 0; i < widths.length; i++)
 		{
@@ -576,7 +575,9 @@ public class VFSDirectoryEntryTable extends JTable
 	{
 		public void columnAdded(TableColumnModelEvent e) {}
 		public void columnRemoved(TableColumnModelEvent e) {}
-		public void columnMoved(TableColumnModelEvent e) {}
+		public void columnMoved(TableColumnModelEvent e) {
+			((VFSDirectoryEntryTableModel)getModel()).columnMoved(e.getFromIndex(), e.getToIndex());
+		}
 		public void columnSelectionChanged(ListSelectionEvent e) {}
 
 		public void columnMarginChanged(ChangeEvent e)
diff --git a/org/gjt/sp/jedit/browser/VFSDirectoryEntryTableModel.java b/org/gjt/sp/jedit/browser/VFSDirectoryEntryTableModel.java
index 0e60a58..faf6151 100644
--- a/org/gjt/sp/jedit/browser/VFSDirectoryEntryTableModel.java
+++ b/org/gjt/sp/jedit/browser/VFSDirectoryEntryTableModel.java
@@ -36,7 +36,7 @@ import org.gjt.sp.util.StandardUtilities;
 
 /**
  * @author Slava Pestov
- * @version $Id: VFSDirectoryEntryTableModel.java 23336 2013-11-16 12:05:40Z ezust $
+ * @version $Id: VFSDirectoryEntryTableModel.java 23970 2015-08-08 18:10:36Z daleanson $
  * @since jEdit 4.2pre1
  */
 public class VFSDirectoryEntryTableModel extends AbstractTableModel
@@ -272,6 +272,18 @@ public class VFSDirectoryEntryTableModel extends AbstractTableModel
 			+ extAttr + ".width",w);
 	} //}}}
 	
+	//{{{ columnMoved() method
+	protected void columnMoved(int from, int to) {
+		if (from == to)
+			return;
+		if (from < 1 || from > getColumnCount())
+			return;
+		if (to < 1 || to > getColumnCount())
+			return;
+		ExtendedAttribute ea = extAttrs.remove(from - 1);
+		extAttrs.add(to - 1, ea);
+	} //}}}
+	
 	//{{{ getFiles() method
 	public VFSFile[] getFiles()
 	{
diff --git a/org/gjt/sp/jedit/browser/VFSFileNameField.java b/org/gjt/sp/jedit/browser/VFSFileNameField.java
index c334005..2e87e36 100644
--- a/org/gjt/sp/jedit/browser/VFSFileNameField.java
+++ b/org/gjt/sp/jedit/browser/VFSFileNameField.java
@@ -36,7 +36,7 @@ import org.gjt.sp.util.TaskManager;
 
 /**
  * @author Slava Pestov
- * @version $Id: VFSFileNameField.java 22851 2013-03-17 11:03:48Z thomasmey $
+ * @version $Id: VFSFileNameField.java 23549 2014-05-17 18:44:55Z ezust $
  * @since jEdit 4.2pre1 (public since 4.5pre1)
  */
 public class VFSFileNameField extends HistoryTextField
diff --git a/org/gjt/sp/jedit/buffer/BufferUndoListener.java b/org/gjt/sp/jedit/buffer/BufferUndoListener.java
index 0ff5a03..583893b 100644
--- a/org/gjt/sp/jedit/buffer/BufferUndoListener.java
+++ b/org/gjt/sp/jedit/buffer/BufferUndoListener.java
@@ -29,11 +29,11 @@ package org.gjt.sp.jedit.buffer;
  * undo/redo actions in a buffer.
  *
  * Buffer undo listeners are added and removed from a buffer using
- * <code>JEditBuffer.addBufferUndoListener<code> and
- * <code>JEditBuffer.removeBufferUndoListener<code>, respectively.
+ * <code>JEditBuffer.addBufferUndoListener</code> and
+ * <code>JEditBuffer.removeBufferUndoListener</code>, respectively.
  *
  * @author Shlomy Reinstein
- * @version $Id: BufferUndoListener.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: BufferUndoListener.java 23981 2015-08-10 14:56:24Z daleanson $
  * @since jEdit 4.3pre18
  */
 public interface BufferUndoListener
diff --git a/org/gjt/sp/jedit/buffer/FoldHandler.java b/org/gjt/sp/jedit/buffer/FoldHandler.java
index 08f4398..64ea220 100644
--- a/org/gjt/sp/jedit/buffer/FoldHandler.java
+++ b/org/gjt/sp/jedit/buffer/FoldHandler.java
@@ -33,13 +33,13 @@ import javax.swing.text.Segment;
  * <code>services.xml</code> files like so:
  *
  * <pre><SERVICE CLASS="org.gjt.sp.jedit.buffer.FoldHandler" NAME="<i>name</i>">
- *    new <i>MyFoldHandler<i>();
+ *    new <i>MyFoldHandler</i>();
  *</SERVICE></pre>
  *
  * See {@link org.gjt.sp.jedit.ServiceManager} for details.
  *
  * @author Slava Pestov
- * @version $Id: FoldHandler.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: FoldHandler.java 23981 2015-08-10 14:56:24Z daleanson $
  * @since jEdit 4.3pre3
  */
 public abstract class FoldHandler
diff --git a/org/gjt/sp/jedit/buffer/JEditBuffer.java b/org/gjt/sp/jedit/buffer/JEditBuffer.java
index e9141dc..f08605a 100644
--- a/org/gjt/sp/jedit/buffer/JEditBuffer.java
+++ b/org/gjt/sp/jedit/buffer/JEditBuffer.java
@@ -68,7 +68,7 @@ import java.util.regex.Pattern;
  * </ul>
  *
  * @author Slava Pestov
- * @version $Id: JEditBuffer.java 23224 2013-09-30 20:51:42Z shlomy $
+ * @version $Id: JEditBuffer.java 24027 2015-08-25 14:21:12Z makarius $
  *
  * @since jEdit 4.3pre3
  */
@@ -144,7 +144,7 @@ public class JEditBuffer
 
 	//{{{ isDirty() method
 	/**
-	 * Returns whether there have been unsaved changes to this buffer.
+	 * @return whether there have been unsaved changes to this buffer.
 	 * This method is thread-safe.
 	 */
 	public boolean isDirty()
@@ -166,7 +166,7 @@ public class JEditBuffer
 
 	//{{{ isPerformingIO() method
 	/**
-	 * Returns true if the buffer is currently performing I/O.
+	 * @return true if the buffer is currently performing I/O.
 	 * This method is thread-safe.
 	 * @since jEdit 2.7pre1
 	 */
@@ -177,7 +177,7 @@ public class JEditBuffer
 
 	//{{{ setPerformingIO() method
 	/**
-	 * Returns true if the buffer is currently performing I/O.
+	 * @param io true if the buffer is currently performing I/O.
 	 * This method is thread-safe.
 	 * @since jEdit 2.7pre1
 	 */
@@ -188,19 +188,19 @@ public class JEditBuffer
 
 	//{{{ isEditable() method
 	/**
-	 * Returns true if this file is editable, false otherwise. A file may
+	 * @return true if this file is editable, false otherwise. A file may
 	 * become uneditable if it is read only, or if I/O is in progress.
 	 * This method is thread-safe.
 	 * @since jEdit 2.7pre1
 	 */
 	public boolean isEditable()
 	{
-		return !(isReadOnly() || isPerformingIO());
+		return !(isPerformingIO());
 	} //}}}
 
 	//{{{ isReadOnly() method
 	/**
-	 * Returns true if this file is read only, false otherwise.
+	 * @return true if this file is read only, false otherwise.
 	 * This method is thread-safe.
 	 */
 	public boolean isReadOnly()
@@ -220,7 +220,7 @@ public class JEditBuffer
 
 	//{{{ setDirty() method
 	/**
-	 * Sets the 'dirty' (changed since last save) flag of this buffer.
+	 * @param d Sets the 'dirty' (changed since last save) flag of this buffer.
 	 */
 	public void setDirty(boolean d)
 	{
@@ -298,7 +298,7 @@ public class JEditBuffer
 
 	//{{{ getLength() method
 	/**
-	 * Returns the number of characters in the buffer. This method is thread-safe.
+	 * @return the number of characters in the buffer. This method is thread-safe.
 	 */
 	public int getLength()
 	{
@@ -308,7 +308,7 @@ public class JEditBuffer
 
 	//{{{ getLineCount() method
 	/**
-	 * Returns the number of physical lines in the buffer.
+	 * @return the number of physical lines in the buffer.
 	 * This method is thread-safe.
 	 * @since jEdit 3.1pre1
 	 */
@@ -323,6 +323,7 @@ public class JEditBuffer
 	 * Returns the line containing the specified offset.
 	 * This method is thread-safe.
 	 * @param offset The offset
+	 * @return the line of the offset
 	 * @since jEdit 4.0pre1
 	 */
 	public int getLineOfOffset(int offset)
@@ -400,7 +401,7 @@ public class JEditBuffer
 
 	//{{{ getLineLength() method
 	/**
-	 * Returns the length of the specified line.
+	 * @return the length of the specified line.
 	 * This method is thread-safe.
 	 * @param line The line
 	 * @since jEdit 4.0pre1
@@ -423,6 +424,8 @@ public class JEditBuffer
 	//{{{ getPriorNonEmptyLine() method
 	/**
 	 * Auto indent needs this.
+	 * @param lineIndex the line
+	 * @return the previous non-empty line
 	 */
 	public int getPriorNonEmptyLine(int lineIndex)
 	{
@@ -486,13 +489,14 @@ public class JEditBuffer
 	/**
 	 * Returns the specified line in a <code>Segment</code>.<p>
 	 *
-	 * Using a <classname>Segment</classname> is generally more
-	 * efficient than using a <classname>String</classname> because it
+	 * Using a <code>Segment</code> is generally more
+	 * efficient than using a <code>String</code> because it
 	 * results in less memory allocation and array copying.<p>
 	 *
 	 * This method is thread-safe.
 	 *
 	 * @param line The line
+	 * @param segment the segment
 	 * @since jEdit 4.0pre1
 	 */
 	public void getLineText(int line, Segment segment)
@@ -503,13 +507,15 @@ public class JEditBuffer
 	/**
 	 * Returns the specified line from the starting point passed in relativeStartOffset  in a <code>Segment</code>.<p>
 	 *
-	 * Using a <classname>Segment</classname> is generally more
-	 * efficient than using a <classname>String</classname> because it
+	 * Using a <code>Segment</code> is generally more
+	 * efficient than using a <code>String</code> because it
 	 * results in less memory allocation and array copying.<p>
 	 *
 	 * This method is thread-safe.
 	 *
 	 * @param line The line
+	 * @param segment the segment
+	 * @param relativeStartOffset the relative start offset
 	 * @since jEdit 4.0pre1
 	 */
 	public void getLineText(int line,int relativeStartOffset, Segment segment)
@@ -570,7 +576,7 @@ public class JEditBuffer
 
 	//{{{ getText() methods
 	/**
-	 * Returns the specified text range. This method is thread-safe.
+	 * @return the specified text range. This method is thread-safe.
 	 * @param start The start offset
 	 * @param length The number of characters to get
 	 */
@@ -593,7 +599,7 @@ public class JEditBuffer
 	}
 
 	/**
-	 * Returns the full buffer content. This method is thread-safe
+	 * @return the full buffer content. This method is thread-safe
 	 * @since 4.4.1
 	 */
 	public String getText()
@@ -612,8 +618,8 @@ public class JEditBuffer
 	/**
 	 * Returns the specified text range in a <code>Segment</code>.<p>
 	 *
-	 * Using a <classname>Segment</classname> is generally more
-	 * efficient than using a <classname>String</classname> because it
+	 * Using a <code>Segment</code> is generally more
+	 * efficient than using a <code>String</code> because it
 	 * results in less memory allocation and array copying.<p>
 	 *
 	 * This method is thread-safe.
@@ -708,9 +714,6 @@ public class JEditBuffer
 		if(len == 0)
 			return;
 
-		if(isReadOnly())
-			throw new RuntimeException("buffer read-only");
-
 		try
 		{
 			writeLock();
@@ -753,9 +756,6 @@ public class JEditBuffer
 		if(length == 0)
 			return;
 
-		if(isReadOnly())
-			throw new RuntimeException("buffer read-only");
-
 		try
 		{
 			transaction = true;
@@ -1066,7 +1066,7 @@ public class JEditBuffer
 
 	//{{{ getCurrentIndentForLine() method
 	/**
-	 * Returns the line's current leading indent.
+	 * @return the line's current leading indent.
 	 * @param lineIndex The line number
 	 * @param whitespaceChars If this is non-null, the number of whitespace
 	 * characters is stored at the 0 index
@@ -1106,7 +1106,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getIdealIndentForLine() method
 	/**
-	 * Returns the ideal leading indent for the specified line.
+	 * @return the ideal leading indent for the specified line.
 	 * This will apply the various auto-indent rules.
 	 * @param lineIndex The line number
 	 */
@@ -1156,7 +1156,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getVirtualWidth() method
 	/**
-	 * Returns the virtual column number (taking tabs into account) of the
+	 * @return the virtual column number (taking tabs into account) of the
 	 * specified position.
 	 *
 	 * @param line The line number
@@ -1301,11 +1301,14 @@ loop:		for(int i = 0; i < seg.count; i++)
 	/**
 	 * Should inserting this character trigger a re-indent of
 	 * the current line?
+	 * @param ch a character
+	 * @param line the line
+	 * @return true if is electric key
 	 * @since jEdit 4.3pre9
 	 */
 	public boolean isElectricKey(char ch, int line)
 	{
-		TokenMarker.LineContext ctx = lineMgr.getLineContext(line);
+		TokenMarker.LineContext ctx = getLineContext(line);
 		Mode mode = ModeProvider.instance.getMode(ctx.rules.getModeName());
 
 		// mode can be null, though that's probably an error "further up":
@@ -1318,6 +1321,16 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ Syntax highlighting
 
+	//{{{ getLineContext() method
+	/**
+	 * Returns the line context of the token marker for the specified line.
+	 */
+	public TokenMarker.LineContext getLineContext(int line)
+	{
+		return lineMgr.getLineContext(line);
+	}
+	//}}}
+
 	//{{{ markTokens() method
 	/**
 	 * Returns the syntax tokens for the specified line.
@@ -1353,11 +1366,11 @@ loop:		for(int i = 0; i < seg.count; i++)
 		{
 			getLineText(i,seg);
 
-			oldContext = lineMgr.getLineContext(i);
+			oldContext = getLineContext(i);
 
 			TokenMarker.LineContext prevContext = (
 				(i == 0 || contextInsensitive) ? null
-				: lineMgr.getLineContext(i - 1)
+				: getLineContext(i - 1)
 			);
 
 			TokenHandler _tokenHandler = i == lineIndex ? tokenHandler : DummyTokenHandler.INSTANCE;
@@ -1405,6 +1418,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 	 * The position is retained despite text editions.
 	 * <p>No explicit removal of position is necessary, only dereferencing it.
 	 * @param offset The offset
+	 * @return the position
 	 */
 	public Position createPosition(int offset)
 	{
@@ -1450,7 +1464,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getTabSize() method
 	/**
-	 * Returns the tab size used in this buffer. This is equivalent
+	 * @return the tab size used in this buffer. This is equivalent
 	 * to calling <code>getProperty("tabSize")</code>.
 	 * This method is thread-safe.
 	 */
@@ -1465,7 +1479,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getIndentSize() method
 	/**
-	 * Returns the indent size used in this buffer. This is equivalent
+	 * @return the indent size used in this buffer. This is equivalent
 	 * to calling <code>getProperty("indentSize")</code>.
 	 * This method is thread-safe.
 	 * @since jEdit 2.7pre1
@@ -1481,7 +1495,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getProperty() method
 	/**
-	 * Returns the value of a buffer-local property.<p>
+	 * @return the value of a buffer-local property.
 	 *
 	 * Using this method is generally discouraged, because it returns an
 	 * <code>Object</code> which must be cast to another type
@@ -1592,7 +1606,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getStringProperty() method
 	/**
-	 * Returns the value of a string property. This method is thread-safe.
+	 * @return the value of a string property. This method is thread-safe.
 	 * @param name The property name
 	 * @since jEdit 4.0pre1
 	 */
@@ -1619,7 +1633,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getBooleanProperty() methods
 	/**
-	 * Returns the value of a boolean property. This method is thread-safe.
+	 * @return the value of a boolean property. This method is thread-safe.
 	 * @param name The property name
 	 * @since jEdit 4.0pre1
 	 */
@@ -1629,7 +1643,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 	}
 
 	/**
-	 * Returns the value of a boolean property. This method is thread-safe.
+	 * @return the value of a boolean property. This method is thread-safe.
 	 * @param name The property name
 	 * @param def The default value
 	 * @since jEdit 4.3pre17
@@ -1654,8 +1668,9 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getIntegerProperty() method
 	/**
-	 * Returns the value of an integer property. This method is thread-safe.
+	 * @return the value of an integer property. This method is thread-safe.
 	 * @param name The property name
+	 * @param defaultValue the default value to use
 	 * @since jEdit 4.0pre1
 	 */
 	public int getIntegerProperty(String name, int defaultValue)
@@ -1711,7 +1726,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getPatternProperty()
 	/**
-	 * Returns the value of a property as a regular expression.
+	 * @return the value of a property as a regular expression.
 	 * This method is thread-safe.
 	 * @param name The property name
 	 * @param flags Regular expression compilation flags
@@ -1752,7 +1767,8 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getRuleSetAtOffset() method
 	/**
-	 * Returns the syntax highlighting ruleset at the specified offset.
+	 * @return the syntax highlighting ruleset at the specified offset.
+	 * @param offset the offset
 	 * @since jEdit 4.1pre1
 	 */
 	public ParserRuleSet getRuleSetAtOffset(int offset)
@@ -1770,7 +1786,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getKeywordMapAtOffset() method
 	/**
-	 * Returns the syntax highlighting keyword map in effect at the
+	 * @return the syntax highlighting keyword map in effect at the
 	 * specified offset. Used by the <b>Complete Word</b> command to
 	 * complete keywords.
 	 * @param offset The offset
@@ -1788,6 +1804,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 	 * JavaScript, for example).
 	 * @param offset The offset
 	 * @param name The property name
+	 * @return the property value
 	 * @since jEdit 4.0pre3
 	 */
 	public String getContextSensitiveProperty(int offset, String name)
@@ -1808,7 +1825,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getMode() method
 	/**
-	 * Returns this buffer's edit mode. This method is thread-safe.
+	 * @return this buffer's edit mode. This method is thread-safe.
 	 */
 	public Mode getMode()
 	{
@@ -1873,7 +1890,8 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ isFoldStart() method
 	/**
-	 * Returns if the specified line begins a fold.
+	 * @param line the line
+	 * @return if the specified line begins a fold.
 	 * @since jEdit 3.1pre1
 	 */
 	public boolean isFoldStart(int line)
@@ -1884,13 +1902,15 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ isFoldEnd() method
 	/**
-	 * Returns if the specified line ends a fold.
+	 * @return if the specified line ends a fold.
+	 * @param line the line
 	 * @since jEdit 4.2pre5
 	 */
 	public boolean isFoldEnd(int line)
 	{
-		return line != getLineCount() - 1
-			&& getFoldLevel(line) > getFoldLevel(line + 1);
+        int foldLevel = getFoldLevel(line);
+        int nextLineFoldLevel = line == getLineCount() - 1 ? 0 : getFoldLevel(line + 1);
+        return foldLevel > nextLineFoldLevel;
 	} //}}}
 
 	//{{{ invalidateCachedFoldLevels() method
@@ -1906,7 +1926,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getFoldLevel() method
 	/**
-	 * Returns the fold level of the specified line.
+	 * @return the fold level of the specified line.
 	 * @param line A physical line index
 	 * @since jEdit 3.1pre1
 	 */
@@ -1981,7 +2001,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getFoldAtLine() method
 	/**
-	 * Returns an array. The first element is the start line, the
+	 * @return an array. The first element is the start line, the
 	 * second element is the end line, of the fold containing the
 	 * specified line number.
 	 * @param line The line number
@@ -2040,7 +2060,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getFoldHandler() method
 	/**
-	 * Returns the current buffer's fold handler.
+	 * @return the current buffer's fold handler.
 	 * @since jEdit 4.2pre1
 	 */
 	@Nonnull
@@ -2052,6 +2072,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 	//{{{ setFoldHandler() method
 	/**
 	 * Sets the buffer's fold handler.
+	 * @param foldHandler the fold handler
 	 * @since jEdit 4.2pre2
 	 */
 	public void setFoldHandler(@Nonnull FoldHandler foldHandler)
@@ -2075,7 +2096,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 	//{{{ undo() method
 	/**
 	 * Undoes the most recent edit.
-	 *
+	 * @param textArea the text area
 	 * @since jEdit 4.0pre1
 	 */
 	public void undo(TextArea textArea)
@@ -2117,7 +2138,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 	//{{{ redo() method
 	/**
 	 * Redoes the most recently undone edit.
-	 *
+	 * @param textArea the textArea
 	 * @since jEdit 2.7pre2
 	 */
 	public void redo(TextArea textArea)
@@ -2159,7 +2180,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ isTransactionInProgress() method
 	/**
-	 * Returns if an undo or compound edit is currently in progress. If this
+	 * @return if an undo or compound edit is currently in progress. If this
 	 * method returns true, then eventually a
 	 * {@link org.gjt.sp.jedit.buffer.BufferListener#transactionComplete(JEditBuffer)}
 	 * buffer event will get fired.
@@ -2221,7 +2242,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ insideCompoundEdit() method
 	/**
-	 * Returns if a compound edit is currently active.
+	 * @return if a compound edit is currently active.
 	 * @since jEdit 3.1pre1
 	 */
 	public boolean insideCompoundEdit()
@@ -2231,7 +2252,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ isUndoInProgress() method
 	/**
-	 * Returns if an undo or redo is currently being performed.
+	 * @return if an undo or redo is currently being performed.
 	 * @since jEdit 4.3pre3
 	 */
 	public boolean isUndoInProgress()
@@ -2241,7 +2262,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getUndoId() method
 	/**
-	 * Returns an object that identifies the undo operation to which the
+	 * @return an object that identifies the undo operation to which the
 	 * current content change belongs. This method can be used by buffer
 	 * listeners during content changes (contentInserted/contentRemoved)
 	 * to find out which content changes belong to the same "undo" operation.
@@ -2328,7 +2349,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ getBufferListeners() method
 	/**
-	 * Returns an array of registered buffer change listeners.
+	 * @return an array of registered buffer change listeners.
 	 * @since jEdit 4.3pre3
 	 */
 	public BufferListener[] getBufferListeners()
@@ -2358,7 +2379,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ canUndo() method
 	/**
-	 * Returns true if an undo operation can be performed.
+	 * @return true if an undo operation can be performed.
 	 * @since jEdit 4.3pre18
 	 */
 	public boolean canUndo()
@@ -2370,7 +2391,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 
 	//{{{ canRedo() method
 	/**
-	 * Returns true if a redo operation can be performed.
+	 * @return true if a redo operation can be performed.
 	 * @since jEdit 4.3pre18
 	 */
 	public boolean canRedo()
@@ -2879,7 +2900,7 @@ loop:		for(int i = 0; i < seg.count; i++)
 	private List<IndentRule> getIndentRules(int line)
 	{
 		String modeName = null;
-		TokenMarker.LineContext ctx = lineMgr.getLineContext(line);
+		TokenMarker.LineContext ctx = getLineContext(line);
 		if (ctx != null && ctx.rules != null)
 			modeName = ctx.rules.getModeName();
 		if (modeName == null)
diff --git a/org/gjt/sp/jedit/bufferset/BufferSetManager.java b/org/gjt/sp/jedit/bufferset/BufferSetManager.java
index 4ad4a70..982a39e 100644
--- a/org/gjt/sp/jedit/bufferset/BufferSetManager.java
+++ b/org/gjt/sp/jedit/bufferset/BufferSetManager.java
@@ -173,7 +173,8 @@ public class BufferSetManager
 	//{{{ addBuffer() methods
 	/**
 	 * Add a buffer into the current editPane of the given view.
-	 * If the view is null, it will be added to the global bufferSet
+	 * If the view is null, it will be added to the current
+	 * editPane of the active view.
 	 * @param view a view (or null)
 	 * @param buffer the buffer to add
 	 */
@@ -184,8 +185,9 @@ public class BufferSetManager
 	}
 
 	/**
-	 * Add a buffer into the current editPane of the given editPane.
-	 * If the editPane is null, it will be added to the global bufferSet
+	 * Add a buffer into the given editPane.
+	 * If the editPane is null, it will be added to the current
+	 * editPane of the active view.
 	 * @param editPane an EditPane (or null)
 	 * @param buffer the buffer to add
 	 */
diff --git a/org/gjt/sp/jedit/default.abbrevs b/org/gjt/sp/jedit/default.abbrevs
index b5d86fc..20308b9 100644
--- a/org/gjt/sp/jedit/default.abbrevs
+++ b/org/gjt/sp/jedit/default.abbrevs
@@ -1,205 +1,204 @@
 ; Default set of abbreviations for jEdit.
 ; :mode=ini:encoding=UTF-8:
 [global]
+!!|\|¡
 --|—
-alpha|α
-beta|β
-gamma|γ
-delta|δ
-epsilon|ε
-zeta|ζ
-eta|η
-theta|ϴ
-iota|ι
-kappa|κ
-lambda|λ
-mu|μ
-nu|ν
-xi|ξ
-pi|π
-rho|ρ
-sigma|σ
-tau|τ
-upsilon|υ
-phi|ϕ
-varphi|φ
-chi|χ
-psi|ψ
-omega|ω
-Gamma|Γ
++-|±
+->|→
+<->|↔
+<-|←
+<=|⇐
+=>|⇒
+??|¿
+AA|Å
+AE|Æ
+Box|∞
 Delta|Δ
-Theta|Θ
+Diamond|◇
+Downarrow|⇓
+Gamma|Γ
 Lambda|Λ
-Xi|Ξ
+Leftarrow|⇐
+OE|Œ
+OO|Ø
+Omega|Ω
+Phi|Φ
 Pi|Π
+Psi|Ψ
+Rightarrow|⇒
 Sigma|Σ
+S|§
+Theta|Θ
+Uparrow|⇑
+Updownarrow|⇳
 Upsilon|Υ
-Phi|Φ
-Psi|Ψ
-Omega|Ω
-pm|±
-mp|∓
-times|
-div|∻
-divides|∣
-doesnotdivide|∤
+Xi|Ξ
+aa|å
+ae|æ
+aleph|א
+alpha|α
+and|∧
+angle|∠
+approx|≈
 ast|∗
-star|∗
-circ|∘
-bullet|∙
-setminus|∖
-cdot|⋅
-diamond|◇
-bigtriangleup|∆
-bigtriangledown|∇
-ominus|⊝
-sqcap|⊔
-wr|≀
-triangleleft|⊲
-triangleright|⊳
-lhd|▷
-rhd|◁
-nabla|∇
-increment|∆
-oslash|⊘
+asymp|≍
+bemol|♭
+beta|β
 bigcirc|◯
-odot|⊙
-oplus♁
-otimes|⊗
-female|♀
-male|♂
-sun|☼
-sqcup|⊔
+bigtriangledown|∇
+bigtriangleup|∆
+bowtie|⋈
+bullet|∙
+c->|↪
 cap|∩
-inter|∩
-cup|∪
-union|∪
+cdot|⋅
+chi|χ
+circ|∘
+clubsuit|♣
 complement|∁
-vee|∨
-or|∨
-wedge|∧
-and|∧
-leq|≤
-prec|≺
-preceq|≼
-ll|≪
-subset|⊂
-subseteq|⊆
-in|∈
-smallin|∊
-notin|∉
-vdash
-geq|≥
-succ|≻
-succeq|≽
-gg|≫
-supset|⊃
-supseteq|⊇
-ni|∋
-niton|∌
-nillams|∍
+cong|≅
+coprod|∐
+copyright|©
+cup|∪
+dag|†
 dashv|⊢
-equiv|≡
-sim|∼
-notsim|≁
-simeq|≃
-approx|≈
+ddag|‡
+delta|δ
+diamondsuit|♢
+diamond|◇
+divides|∣
+div|∻
+doesnotdivide|∤
 doteq|≐
-propto|∝
-cong|≅
-neq|≠
-models|⊨
-top|⊤
-perp|⊥
-parallel|∥
-notparallel|∦
-sqsubset|⊏
-sqsubseteq|⊑
-sqsupset|⊐
-sqsupseteq|⊒
-asymp|≍
-mid||
-bowtie|⋈
-smile|‿
+downarrow|↓
+emptyset|∅
+epsilon|ε
+equiv|≡
+eta|η
+exists|∃
+female|♀
+forall|∀
 frown|⁀
-leftarrow|←
-<-|←
-Leftarrow|⇐
-<=|⇐
-rightarrow|→
-->|→
-Rightarrow|⇒
-=>|⇒
-leftrightarrow|↔
-<->|↔
-mapsto|↦
-uparrow|↑
+gamma|γ
+geq|≥
+gg|≫
+heartsuit|♡
 hookleftarrow|↪
-c->|↪
 hookrightarrow|↩
+increment|∆
+infty|
+inter|∩
+int|∫
+in|∈
+iota|ι
+kappa|κ
+lambda|λ
+lceil|⎡
+leadsto|↝
 leftarpoonup|↼
-rightharpoonup|⇀
+leftarrow|←
 leftharpoondown|↽
-rightharpoondown|⇁
-rightleftharpoons|⇋
+leftrightarrow|↔
 leftrighthaproons|⇌
-leadsto|↝
-nearrow|↗
-searrow|↘
-swarrow|↙
-nwarrow|↖
-downarrow|↓
-uparrow|↑
-updownarrow|↕
-Downarrow|⇓
-Uparrow|⇑
-Updownarrow|⇳
-dag|†
-pounds|£
-ddag|‡
-copyright|©
-qed|∎
-aleph|א
-emptyset|∅
-angle|∠
+leq|≤
+lfloor|⎣
+lhd|▷
+ll|≪
+male|♂
 mangle|∢
-sangle|∢
-forall|∀
-exists|∃
-notexists|∄
+mapsto|↦
+mid||
+models|⊨
+mp|∓
+mu|μ
+nabla|∇
+nearrow|↗
 neg|¬
+neq|≠
+nillams|∍
+niton|∌
+ni|∋
+notexists|∄
+notin|∉
+notparallel|∦
+notsim|≁
+nu|ν
+nwarrow|↖
+odot|⊙
+oe|œ
+oint|∮
+omega|ω
+ominus|⊝
+oo|ø
+oplus♁
+or|∨
+oslash|⊘
+otimes|⊗
+parallel|∥
 partial|∂
-infty|
-Box|∞
-sum|∑
+perp|⊥
+phi|ϕ
+pi|π
+pm|±
+pounds|£
+preceq|≼
+prec|≺
 prod|∏
-coprod|∐
-int|∫
-oint|∮
-S|§
-Diamond|◇
-clubsuit|♣
-diamondsuit|♢
-heartsuit|♡
-spadesuit|♠
-surd|√
-bemol|♭
+propto|∝
+psi|ψ
+qed|∴
+rceil|⎤
+rfloor|⎦
+rhd|◁
+rho|ρ
+rightarrow|→
+rightharpoondown|⇁
+rightharpoonup|⇀
+rightleftharpoons|⇋
+sangle|∢
+searrow|↘
+setminus|∖
 sharp|♯
-oe|œ
-OE|Œ
-ae|æ
-AE|Æ
-aa|å
-AA|Å
-oo|ø
-OO|Ø
+sigma|σ
+simeq|≃
+sim|∼
+smallin|∊
+smile|‿
+spadesuit|♠
+sqcap|⊔
+sqcup|⊔
+sqsubseteq|⊑
+sqsubset|⊏
+sqsupseteq|⊒
+sqsupset|⊐
 ss|ß
-??|¿
-lfloor|⎣
-rfloor|⎦
-lceil|⎡
-rceil|⎤
-
+star|∗
+subseteq|⊆
+subset|⊂
+succeq|≽
+succ|≻
+sum|∑
+sun|☼
+supseteq|⊇
+supset|⊃
+surd|√
+swarrow|↙
+tau|τ
+theta|ϴ
+times|✕
+top|⊤
+triangleleft|⊲
+triangleright|⊳
+union|∪
+uparrow|↑
+updownarrow|↕
+upsilon|υ
+varphi|φ
+vee|∨
+wedge|∧
+wr|≀
+xi|ξ
+zeta|ζ
 [java]
 Br|BufferedReader $1 = new BufferedReader(\|);
 D|do\n{\n\t\|\n}\nwhile($1);
@@ -307,3 +306,20 @@ vos|<xsl:value-of select="\|"/>
 wpn|<xsl:with-param name="\|" select=""/>
 xe|<?xml vesion="1.0" encoding="\|"?>
 x|<?xml version="1.0"?>\|
+[latex]
+ty|\\qic{type}{\|}
+qc|\\qic{class}{\|}
+it|\\textit{\|}
+img|\\imageFullWidth{\|}
+ft|\\frametitle{\|}
+ul|\\begin{itemize}\n\|\n\\end{itemize}
+tt|\\texttt{\|}
+qt|\\qic{type}{\|}
+ol|\\begin{enumerate}\n\|\\end{enumerate}
+cpp|\\begin{cpp}\n\|\\end{cpp}\n
+in|\\input{\|}
+fn|\\iClsFn{}{\|}
+b|\\textbf{\|}
+li|\\item 
+cl|\\iCls{\|}
+bs|% ----------------------------------------------------------------------\n\\begin{slide}\n\\frametitle{\|}\n\\end{slide}\n
diff --git a/org/gjt/sp/jedit/gui/AboutDialog.java b/org/gjt/sp/jedit/gui/AboutDialog.java
index 5311565..3ba3d90 100644
--- a/org/gjt/sp/jedit/gui/AboutDialog.java
+++ b/org/gjt/sp/jedit/gui/AboutDialog.java
@@ -158,7 +158,7 @@ public class AboutDialog extends JDialog implements ActionListener
 			w = d.width;
 			h = d.height;
 			iBottomLineXOffset = (w / 2) - (fmBottom.stringWidth(sBottomLine) / 2);
-			iBottomLineYOffset = h-iLineHeight/2;
+			iBottomLineYOffset = h - fmBottom.getHeight() / 2;
 
 			String aboutText = jEdit.getProperty("about.text.prefix") + "\n \n"
 				+ jEdit.getProperty("about.text.contributors") + "\n \n" +
diff --git a/org/gjt/sp/jedit/gui/AddModeDialog.java b/org/gjt/sp/jedit/gui/AddModeDialog.java
new file mode 100644
index 0000000..c3ee3ae
--- /dev/null
+++ b/org/gjt/sp/jedit/gui/AddModeDialog.java
@@ -0,0 +1,193 @@
+/*
+ * jEdit - Programmer's Text Editor
+ * :tabSize=4:indentSize=4:noTabs=false:
+ * :folding=explicit:collapseFolds=1:
+ *
+ * Copyright (C) 2015 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.
+ */
+
+package org.gjt.sp.jedit.gui;
+
+import org.gjt.sp.jedit.AbstractOptionPane;
+import org.gjt.sp.jedit.GUIUtilities;
+import org.gjt.sp.jedit.jEdit;
+import org.gjt.sp.jedit.View;
+import org.gjt.sp.jedit.browser.VFSBrowser;
+
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.*;
+import javax.swing.*;
+import javax.swing.border.EmptyBorder;
+
+/** Add Mode dialog.
+ * @author Dale Anson
+ * 
+ */
+public class AddModeDialog extends EnhancedDialog
+{
+        private JTextField modeName;
+        private JTextField modeFile;
+        private JButton browse;
+        private JTextField filenameGlob;
+        private JTextField firstLineGlob;
+		private final JButton ok;
+		private final JButton cancel;
+		private boolean canceled = false;
+
+		public AddModeDialog(View view)
+		{
+				super(view, jEdit.getProperty("options.editing.addMode.dialog.title"), true);
+				
+				JPanel content = new JPanel(new BorderLayout());
+				content.setBorder(new EmptyBorder(12,12,12,12));
+				setContentPane(content);
+
+				// main content
+				AbstractOptionPane mainContent = new AbstractOptionPane("addmode");
+				
+				modeName = new JTextField();
+				mainContent.addComponent(jEdit.getProperty("options.editing.addMode.dialog.modeName"), modeName);
+				
+				JLabel label = new JLabel(jEdit.getProperty("options.editing.addMode.dialog.modeFile"));
+				mainContent.addComponent(label);
+				modeFile = new JTextField();
+				browse = new JButton(jEdit.getProperty("options.editing.addMode.dialog.browse"));
+				browse.addActionListener(new ActionHandler());
+				mainContent.addComponent(modeFile, browse);
+
+				filenameGlob = new JTextField();
+				mainContent.addComponent(jEdit.getProperty("options.editing.addMode.dialog.filenameGlob"), filenameGlob);
+				firstLineGlob = new JTextField();
+				mainContent.addComponent(jEdit.getProperty("options.editing.addMode.dialog.firstLineGlob"), firstLineGlob);
+				
+				getContentPane().add(mainContent);
+
+				// buttons
+				JPanel buttons = new JPanel();
+				buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
+				buttons.setBorder(new EmptyBorder(12,0,0,0));
+				buttons.add(Box.createGlue());
+
+				ok = new JButton(jEdit.getProperty("common.ok"));
+				ok.addActionListener(new ActionHandler());
+				getRootPane().setDefaultButton(ok);
+				buttons.add(ok);
+
+				buttons.add(Box.createHorizontalStrut(6));
+
+				cancel = new JButton(jEdit.getProperty("common.cancel"));
+				cancel.addActionListener(new ActionHandler());
+				buttons.add(cancel);
+
+				buttons.add(Box.createGlue());
+				content.add(BorderLayout.SOUTH, buttons);
+
+				pack();
+				setLocationRelativeTo(view);
+				setVisible(true);
+		}
+		
+		public String getModeName() 
+		{
+			return modeName.getText();
+		}
+		
+		public String getModeFile()
+		{
+			return modeFile.getText();	
+		}
+		
+		public String getFilenameGlob() 
+		{
+			return filenameGlob.getText();	
+		}
+		
+		public String getFirstLineGlob() 
+		{
+			return firstLineGlob.getText();	
+		}
+		
+		public boolean isCanceled()
+		{
+			return canceled;	
+		}
+		
+
+		@Override
+		public void ok()
+		{
+			// check values
+			if (getModeName() == null) 
+			{
+				JOptionPane.showMessageDialog(jEdit.getActiveView(), "Mode name may not be empty.");
+				return;
+			}
+			if (getModeFile() == null) 
+			{
+				JOptionPane.showMessageDialog(jEdit.getActiveView(), "Mode name may not be empty.");
+				return;
+			}
+			if (getFilenameGlob() == null && getFirstLineGlob() == null) 
+			{
+				JOptionPane.showMessageDialog(jEdit.getActiveView(), "Either file name glob or first line glob or both must be filled in.");
+				return;
+			}
+			canceled = false;
+			dispose();
+		}
+
+		@Override
+		public void cancel()
+		{
+			canceled = true;
+			dispose();
+		}
+		
+	private class ActionHandler implements ActionListener
+	{
+		public void actionPerformed(ActionEvent evt)
+		{
+			Object source = evt.getSource();
+			if(source == browse)
+			{
+				View view = (View)AddModeDialog.this.getParent();
+				String path = jEdit.getSettingsDirectory();
+				int type = VFSBrowser.OPEN_DIALOG;
+				boolean multiSelect = false;
+				String[] filename = GUIUtilities.showVFSFileDialog(view, path, type, multiSelect);
+				if (filename.length > 0)
+				{
+					modeFile.setText(filename[0]);
+				}
+				else
+				{
+					modeFile.setText("");	
+				}
+			}
+			else if (source == ok)
+			{
+				ok();	
+			}
+			else if (source == cancel)
+			{
+				cancel();
+			}
+		}
+	} 
+		
+}
diff --git a/org/gjt/sp/jedit/gui/BufferSwitcher.java b/org/gjt/sp/jedit/gui/BufferSwitcher.java
index 020af61..83457f4 100644
--- a/org/gjt/sp/jedit/gui/BufferSwitcher.java
+++ b/org/gjt/sp/jedit/gui/BufferSwitcher.java
@@ -32,15 +32,20 @@ import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
 import java.awt.datatransfer.UnsupportedFlavorException;
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.Comparator;
 
 import org.gjt.sp.jedit.*;
+import org.gjt.sp.jedit.EditBus.EBHandler;
 import org.gjt.sp.jedit.bufferset.BufferSet;
 import org.gjt.sp.jedit.bufferset.BufferSetManager;
+import org.gjt.sp.jedit.msg.PropertiesChanged;
 import org.gjt.sp.util.ThreadUtilities;
+
 //}}}
 
 /** BufferSwitcher class
-   @version $Id: BufferSwitcher.java 23712 2014-11-01 23:45:33Z ezust $
+   @version $Id: BufferSwitcher.java 23809 2014-12-24 00:44:32Z daleanson $
 */
 public class BufferSwitcher extends JComboBox
 {
@@ -87,6 +92,7 @@ public class BufferSwitcher extends JComboBox
 				setSelectedItem(itemSelectedBefore);
 			}
 		});
+		EditBus.addToBus(this);
 	}
 
 	public void updateBufferList()
@@ -104,7 +110,19 @@ public class BufferSwitcher extends JComboBox
 			{
 				updating = true;
 				setMaximumRowCount(jEdit.getIntegerProperty("bufferSwitcher.maxRowCount",10));
-				setModel(new DefaultComboBoxModel(bufferSet.getAllBuffers()));
+				Buffer[] buffers = bufferSet.getAllBuffers();
+				if (jEdit.getBooleanProperty("bufferswitcher.sortBuffers", true)) {
+					Arrays.sort(buffers, new Comparator<Buffer>(){
+							public int compare(Buffer a, Buffer b) {
+								if (jEdit.getBooleanProperty("bufferswitcher.sortByName", true)) {
+									return a.getName().toLowerCase().compareTo(b.getName().toLowerCase());		
+								} else {
+									return a.getPath().toLowerCase().compareTo(b.getPath().toLowerCase());	
+								}
+							}
+					});
+				}
+				setModel(new DefaultComboBoxModel(buffers));
 				setSelectedItem(editPane.getBuffer());
 				setToolTipText(editPane.getBuffer().getPath(true));
 				addDnD();
@@ -114,6 +132,12 @@ public class BufferSwitcher extends JComboBox
 		ThreadUtilities.runInDispatchThread(runnable);
 	}
 
+	@EBHandler
+	public void handlePropertiesChanged(PropertiesChanged msg)
+	{
+		updateBufferList();
+	} 
+
 	static class BufferCellRenderer extends DefaultListCellRenderer
 	{
 		@Override
diff --git a/org/gjt/sp/jedit/gui/ColorWellButton.java b/org/gjt/sp/jedit/gui/ColorWellButton.java
index ecd8128..c28c7c2 100644
--- a/org/gjt/sp/jedit/gui/ColorWellButton.java
+++ b/org/gjt/sp/jedit/gui/ColorWellButton.java
@@ -26,6 +26,8 @@ package org.gjt.sp.jedit.gui;
 import javax.swing.*;
 import java.awt.event.*;
 import java.awt.*;
+import java.awt.font.FontRenderContext;
+import java.awt.geom.Rectangle2D;
 import org.gjt.sp.jedit.jEdit;
 import org.gjt.sp.jedit.GUIUtilities;
 import org.gjt.sp.jedit.OperatingSystem;
@@ -36,7 +38,7 @@ import org.gjt.sp.jedit.OperatingSystem;
  * You can get and set the currently selected color using
  * {@link #getSelectedColor()} and {@link #setSelectedColor(Color)}.
  * @author Slava Pestov
- * @version $Id: ColorWellButton.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: ColorWellButton.java 24021 2015-08-14 18:36:19Z makarius $
  */
 public class ColorWellButton extends JButton
 {
@@ -76,14 +78,18 @@ public class ColorWellButton extends JButton
 			this.color = color;
 		}
 
+		private Rectangle2D bounds =
+				new JLabel("").getFont().createGlyphVector(
+						new FontRenderContext(null, true, false), "AAAA").getVisualBounds();
+
 		public int getIconWidth()
 		{
-			return 35;
+			return (int)Math.ceil(bounds.getWidth());
 		}
 
 		public int getIconHeight()
 		{
-			return 10;
+			return (int)Math.ceil(bounds.getHeight());
 		}
 
 		public void paintIcon(Component c, Graphics g, int x, int y)
diff --git a/org/gjt/sp/jedit/gui/CompletionPopup.java b/org/gjt/sp/jedit/gui/CompletionPopup.java
index ed57b60..a77c73d 100644
--- a/org/gjt/sp/jedit/gui/CompletionPopup.java
+++ b/org/gjt/sp/jedit/gui/CompletionPopup.java
@@ -113,6 +113,7 @@ public class CompletionPopup extends JWindow
 		list.setCellRenderer(new CellRenderer());
 		list.addKeyListener(keyHandler);
 		list.addMouseListener(new MouseHandler());
+		list.setFocusTraversalKeysEnabled(false);
 
 		JPanel content = new JPanel(new BorderLayout());
 		content.setFocusTraversalKeysEnabled(false);
diff --git a/org/gjt/sp/jedit/gui/DefaultInputHandler.java b/org/gjt/sp/jedit/gui/DefaultInputHandler.java
index 561af0f..96e28f8 100644
--- a/org/gjt/sp/jedit/gui/DefaultInputHandler.java
+++ b/org/gjt/sp/jedit/gui/DefaultInputHandler.java
@@ -32,7 +32,7 @@ import org.gjt.sp.jedit.*;
 /** The default input handler maps sequences of keystrokes into actions and inserts key typed events into the text area.
  *
  * @author Slava Pestov
- * @version $Id: DefaultInputHandler.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: DefaultInputHandler.java 24092 2015-09-24 02:36:15Z ezust $
  */
 public class DefaultInputHandler extends InputHandler
 {
@@ -167,13 +167,6 @@ public class DefaultInputHandler extends InputHandler
 						userInput(input);
 					}
 				}
-				else
-				{
-					// this is retarded. excuse me while I drool
-					// and make stupid noises
-					if(KeyEventWorkaround.isNumericKeypad(keyStroke.key))
-						KeyEventWorkaround.numericKeypadKey();
-				}
 				sendShortcutPrefixOff();
 			}
 		}
diff --git a/org/gjt/sp/jedit/gui/DockableWindowContainer.java b/org/gjt/sp/jedit/gui/DockableWindowContainer.java
index dfad1b0..241b399 100644
--- a/org/gjt/sp/jedit/gui/DockableWindowContainer.java
+++ b/org/gjt/sp/jedit/gui/DockableWindowContainer.java
@@ -23,7 +23,7 @@ package org.gjt.sp.jedit.gui;
  *
  * This class should never be used directly, and is not public.
  * @author Slava Pestov
- * @version $Id: DockableWindowContainer.java 23665 2014-08-22 05:12:35Z ezust $
+ * @version $Id: DockableWindowContainer.java 23664 2014-08-22 05:11:25Z ezust $
  * @since jEdit 2.6pre3
  */
 public interface DockableWindowContainer
diff --git a/org/gjt/sp/jedit/gui/EnhancedDialog.java b/org/gjt/sp/jedit/gui/EnhancedDialog.java
index bf4008f..eaa814d 100644
--- a/org/gjt/sp/jedit/gui/EnhancedDialog.java
+++ b/org/gjt/sp/jedit/gui/EnhancedDialog.java
@@ -22,7 +22,6 @@ package org.gjt.sp.jedit.gui;
 import javax.swing.*;
 
 import org.gjt.sp.jedit.GUIUtilities;
-import org.gjt.sp.jedit.gui.KeyEventTranslator;
 
 import java.awt.event.*;
 import java.awt.*;
@@ -34,17 +33,17 @@ import java.awt.*;
  * Enter is pressed) and cancel() (called when Escape is pressed, or window
  * is closed).
  * @author Slava Pestov
- * @version $Id: EnhancedDialog.java 23832 2015-01-24 03:26:47Z ezust $
+ * @version $Id: EnhancedDialog.java 23917 2015-05-20 09:28:48Z kpouer $
  */
 public abstract class EnhancedDialog extends JDialog
 {
-	public EnhancedDialog(Frame parent, String title, boolean modal)
+	protected EnhancedDialog(Frame parent, String title, boolean modal)
 	{
 		super(parent,title,modal);
 		_init();
 	}
 
-	public EnhancedDialog(Dialog parent, String title, boolean modal)
+    protected EnhancedDialog(Dialog parent, String title, boolean modal)
 	{
 		super(parent,title,modal);
 		_init();
@@ -67,7 +66,7 @@ public abstract class EnhancedDialog extends JDialog
 	private void _init()
 	{
 		((Container)getLayeredPane()).addContainerListener(
-			new ContainerHandler());
+                new ContainerHandler());
 		getContentPane().addContainerListener(new ContainerHandler());
 
 		keyHandler = new KeyHandler();
@@ -87,12 +86,14 @@ public abstract class EnhancedDialog extends JDialog
 	// Recursively adds our key listener to sub-components
 	class ContainerHandler extends ContainerAdapter
 	{
-		public void componentAdded(ContainerEvent evt)
+		@Override
+        public void componentAdded(ContainerEvent evt)
 		{
 			componentAdded(evt.getChild());
 		}
 
-		public void componentRemoved(ContainerEvent evt)
+		@Override
+        public void componentRemoved(ContainerEvent evt)
 		{
 			componentRemoved(evt.getChild());
 		}
@@ -126,7 +127,8 @@ public abstract class EnhancedDialog extends JDialog
 
 	class KeyHandler extends KeyAdapter
 	{
-		public void keyPressed(KeyEvent evt)
+		@Override
+        public void keyPressed(KeyEvent evt)
 		{
 			if(evt.isConsumed()) return;
 			Component comp = getFocusOwner();
@@ -136,7 +138,7 @@ public abstract class EnhancedDialog extends JDialog
 				{
 					if(comp instanceof JComboBox)
 					{
-						JComboBox combo = (JComboBox)comp;
+						JComboBox<?> combo = (JComboBox<?>)comp;
 						if(combo.isEditable())
 						{
 							Object selected = combo.getEditor().getItem();
@@ -157,58 +159,52 @@ public abstract class EnhancedDialog extends JDialog
 				evt.consume();
 				ok();
 			}
-			else if(evt.getKeyCode() == KeyEvent.VK_ESCAPE
-					||
-					isCloseBufferShortcut(evt)
-					)
+			else if (evt.getKeyCode() == KeyEvent.VK_ESCAPE ||
+					isCloseBufferShortcut(evt))
 			{
 				evt.consume();
-				if(comp instanceof JComboBox)
+				if (comp instanceof JComboBox)
 				{
-					JComboBox combo = (JComboBox)comp;
+					JComboBox<?> combo = (JComboBox<?>)comp;
 					if (combo.isPopupVisible())
-					{
 						combo.setPopupVisible(false);
-					}
 					else cancel();
 				}
-				else cancel();
+				else
+					cancel();
 			}
 		}
 
-		private boolean isCloseBufferShortcut(KeyEvent evt) {
-
+		private boolean isCloseBufferShortcut(KeyEvent evt)
+		{
 			String[] s = GUIUtilities.getShortcutLabel("close-buffer", false).split(" or ");
 
-			if(s.length == 1){ // w/o alternative shortcut
-
+			if(s.length == 1)
+			{ // w/o alternative shortcut
 				if(s[0].contains(" "))  //primary shortcut is a multiple-key shortcut
 					return false;
-				else{
+				else
 					return KeyEventTranslator.parseKey(s[0]).equals(KeyEventTranslator.translateKeyEvent(evt));
-				}
-			}
-			else{ // w/ alternative shortcut
-				boolean primarymatch,altmatch;
-				primarymatch=altmatch=false;
+			} // w/ alternative shortcut
+			boolean primarymatch,altmatch;
+			primarymatch=altmatch=false;
 
-				if(!s[0].contains(" "))
-					primarymatch=KeyEventTranslator.parseKey(s[0]).equals(KeyEventTranslator.translateKeyEvent(
-						evt));
+			if(!s[0].contains(" "))
+				primarymatch = KeyEventTranslator.parseKey(s[0]).equals(KeyEventTranslator.translateKeyEvent(evt));
 
-				if(!primarymatch && !s[1].contains(" "))
-					altmatch=KeyEventTranslator.parseKey(s[1]).equals(KeyEventTranslator.translateKeyEvent(evt));
+			if(!primarymatch && !s[1].contains(" "))
+				altmatch = KeyEventTranslator.parseKey(s[1]).equals(KeyEventTranslator.translateKeyEvent(evt));
 
-				if(primarymatch || altmatch)
-					return true;
-			}
+			if (primarymatch || altmatch)
+				return true;
 			return false;
 		}
 	}
 
 	class WindowHandler extends WindowAdapter
 	{
-		public void windowClosing(WindowEvent evt)
+		@Override
+        public void windowClosing(WindowEvent evt)
 		{
 			cancel();
 		}
diff --git a/org/gjt/sp/jedit/gui/FilesChangedDialog.java b/org/gjt/sp/jedit/gui/FilesChangedDialog.java
index bf62693..8230e8d 100644
--- a/org/gjt/sp/jedit/gui/FilesChangedDialog.java
+++ b/org/gjt/sp/jedit/gui/FilesChangedDialog.java
@@ -37,7 +37,7 @@ import org.gjt.sp.util.EnhancedTreeCellRenderer;
  * Files changed on disk dialog.
  *
  * @author Slava Pestov
- * @version $Id: FilesChangedDialog.java 23221 2013-09-29 20:03:32Z shlomy $
+ * @version $Id: FilesChangedDialog.java 23923 2015-05-22 14:10:47Z ezust $
  */
 public class FilesChangedDialog extends EnhancedDialog
 {
@@ -113,6 +113,7 @@ public class FilesChangedDialog extends EnhancedDialog
 
 		bufferTreeModel = new DefaultTreeModel(root);
 		bufferTree = new JTree(bufferTreeModel);
+		bufferTree.setRowHeight(0);
 		bufferTree.setRootVisible(false);
 		bufferTree.setVisibleRowCount(10);
 		bufferTree.setCellRenderer(new Renderer());
diff --git a/org/gjt/sp/jedit/gui/FilteredTableModel.java b/org/gjt/sp/jedit/gui/FilteredTableModel.java
index 14bc14c..e197886 100644
--- a/org/gjt/sp/jedit/gui/FilteredTableModel.java
+++ b/org/gjt/sp/jedit/gui/FilteredTableModel.java
@@ -37,17 +37,16 @@ import java.util.*;
  * visible, and false otherwise.
  * It is also possible to override the method prepareFilter() that allow you to
  * transform the filter String. Usually you can return it as lowercase
- * <p/>
+ * <p>
  * Here is an example of how to use it extracted from the InstallPanel
  * <code>
  * PluginTableModel tableModel = new PluginTableModel();
- * filteredTableModel = new FilteredTableModel<PluginTableModel>(tableModel)
+ * filteredTableModel = new FilteredTableModel<PluginTableModel>(tableModel)
  * {
  * public String prepareFilter(String filter)
  * {
  * return filter.toLowerCase();
  * }
- * <p/>
  * public boolean passFilter(int row, String filter)
  * {
  * String pluginName = (String) delegated.getValueAt(row, 1);
diff --git a/org/gjt/sp/jedit/gui/FloatingWindowContainer.java b/org/gjt/sp/jedit/gui/FloatingWindowContainer.java
index 47bf278..9e15400 100644
--- a/org/gjt/sp/jedit/gui/FloatingWindowContainer.java
+++ b/org/gjt/sp/jedit/gui/FloatingWindowContainer.java
@@ -35,7 +35,7 @@ import java.beans.PropertyChangeListener;
 import javax.swing.Box;
 import javax.swing.BoxLayout;
 import javax.swing.JButton;
-import javax.swing.JFrame;
+import javax.swing.JDialog;
 import javax.swing.JPopupMenu;
 import javax.swing.JSeparator;
 import javax.swing.SwingUtilities;
@@ -47,10 +47,10 @@ import org.gjt.sp.jedit.jEdit;
 /**
  * A container for dockable windows. This class should never be used
  * directly.
- * @version $Id: FloatingWindowContainer.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: FloatingWindowContainer.java 23704 2014-10-27 04:14:16Z ezust $
  * @since jEdit 4.0pre1
  */
-public class FloatingWindowContainer extends JFrame implements DockableWindowContainer,
+public class FloatingWindowContainer extends JDialog implements DockableWindowContainer,
 	PropertyChangeListener
 {
 	String dockableName = null;
@@ -58,6 +58,8 @@ public class FloatingWindowContainer extends JFrame implements DockableWindowCon
 	public FloatingWindowContainer(DockableWindowManagerImpl dockableWindowManager,
 		boolean clone)
 	{
+		super(dockableWindowManager.getView());
+
 		this.dockableWindowManager = dockableWindowManager;
 
 		dockableWindowManager.addPropertyChangeListener(this);
@@ -93,7 +95,6 @@ public class FloatingWindowContainer extends JFrame implements DockableWindowCon
 		pack();
 		Container parent = dockableWindowManager.getView();
 		GUIUtilities.loadGeometry(this, parent, dockableName);
-		GUIUtilities.addSizeSaver(this, parent, dockableName);
 		KeyListener listener = dockableWindowManager.closeListener(dockableName);
 		addKeyListener(listener);
 		getContentPane().addKeyListener(listener);
@@ -160,8 +161,11 @@ public class FloatingWindowContainer extends JFrame implements DockableWindowCon
 	@Override
 	public void dispose()
 	{
-		entry.container = null;
-		entry.win = null;
+		GUIUtilities.saveGeometry(this, dockableWindowManager.getView(), dockableName);
+		if (entry != null) {
+			entry.container = null;
+			entry.win = null;
+		}
 		super.dispose();
 	} //}}}
 
diff --git a/org/gjt/sp/jedit/gui/FontSelectorDialog.java b/org/gjt/sp/jedit/gui/FontSelectorDialog.java
index 458bb45..d600d16 100644
--- a/org/gjt/sp/jedit/gui/FontSelectorDialog.java
+++ b/org/gjt/sp/jedit/gui/FontSelectorDialog.java
@@ -38,7 +38,7 @@ import org.gjt.sp.util.Log;
  * A dialog for choosing fonts.
  *
  * @author Slava Pestov
- * @version $Id: FontSelectorDialog.java 21971 2012-08-02 20:32:37Z jarekczek $
+ * @version $Id: FontSelectorDialog.java 23904 2015-05-16 13:17:14Z ezust $
  * @since jEdit 4.4pre1
  */
 
@@ -168,7 +168,7 @@ public class FontSelectorDialog extends EnhancedDialog
 			familyList = new JList(fonts));
 		listPanel.add(familyPanel);
 
-		String[] sizes = { "9", "10", "12", "14", "16", "18", "24" };
+		String[] sizes = { "9", "10", "12", "14", "16", "18", "24", "30", "36", "42" };
 		JPanel sizePanel = createTextFieldAndListPanel(
 			"font-selector.size",
 			sizeField = new JTextField(),
@@ -227,7 +227,7 @@ public class FontSelectorDialog extends EnhancedDialog
 		updatePreview();
 
 		Dimension prefSize = preview.getPreferredSize();
-		prefSize.height = 50;
+		prefSize.height = 100;
 		preview.setPreferredSize(prefSize);
 
 		content.add(BorderLayout.CENTER,preview);
diff --git a/org/gjt/sp/jedit/gui/KeyEventTranslator.java b/org/gjt/sp/jedit/gui/KeyEventTranslator.java
index 1d25e40..fd619ca 100644
--- a/org/gjt/sp/jedit/gui/KeyEventTranslator.java
+++ b/org/gjt/sp/jedit/gui/KeyEventTranslator.java
@@ -38,7 +38,7 @@ import org.gjt.sp.util.Log;
  * warts in the AWT key event API.
  *
  * @author Slava Pestov
- * @version $Id: KeyEventTranslator.java 23381 2013-12-09 12:43:14Z kpouer $
+ * @version $Id: KeyEventTranslator.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 public class KeyEventTranslator
 {
@@ -289,13 +289,13 @@ public class KeyEventTranslator
 	 *
 	 * You can map more than one Java modifier to a symobolic modifier, for
 	 * example :
-	 * <p><code><pre>
-	 *	setModifierMapping(
-	 *		InputEvent.CTRL_MASK,
-	 *		InputEvent.ALT_MASK | InputEvent.META_MASK,
-	 *		0,
-	 *		InputEvent.SHIFT_MASK);
-	 *<pre></code></p>
+	 * <p><code>
+	 	setModifierMapping(
+	 		InputEvent.CTRL_MASK,
+	 		InputEvent.ALT_MASK | InputEvent.META_MASK,
+	 		0,
+	 		InputEvent.SHIFT_MASK);
+	   </code></p>
 	 *
 	 * You cannot map a Java modifer to more than one symbolic modifier.
 	 *
diff --git a/org/gjt/sp/jedit/gui/KeyEventWorkaround.java b/org/gjt/sp/jedit/gui/KeyEventWorkaround.java
index 3bec234..024a3d5 100644
--- a/org/gjt/sp/jedit/gui/KeyEventWorkaround.java
+++ b/org/gjt/sp/jedit/gui/KeyEventWorkaround.java
@@ -35,7 +35,7 @@ import org.gjt.sp.util.Log;
  * Java's keyboard handling is crap, to put it mildly.
  *
  * @author Slava Pestov
- * @version $Id: KeyEventWorkaround.java 23204 2013-09-23 21:41:51Z ezust $
+ * @version $Id: KeyEventWorkaround.java 24092 2015-09-24 02:36:15Z ezust $
  */
 public class KeyEventWorkaround
 {
@@ -129,7 +129,7 @@ public class KeyEventWorkaround
 		case KeyEvent.VK_OPEN_BRACKET :
 		case KeyEvent.VK_BACK_SLASH   :
 		case KeyEvent.VK_CLOSE_BRACKET:
-	/*	case KeyEvent.VK_NUMPAD0 :
+		case KeyEvent.VK_NUMPAD0 :
 		case KeyEvent.VK_NUMPAD1 :
 		case KeyEvent.VK_NUMPAD2 :
 		case KeyEvent.VK_NUMPAD3 :
@@ -144,7 +144,7 @@ public class KeyEventWorkaround
 		case KeyEvent.VK_SEPARATOR:
 		case KeyEvent.VK_SUBTRACT   :
 		case KeyEvent.VK_DECIMAL    :
-		case KeyEvent.VK_DIVIDE     :*/
+		case KeyEvent.VK_DIVIDE     :
 		case KeyEvent.VK_BACK_QUOTE:
 		case KeyEvent.VK_QUOTE:
 		case KeyEvent.VK_DEAD_GRAVE:
@@ -188,33 +188,6 @@ public class KeyEventWorkaround
 		}
 	} //}}}
 
-	//{{{ isNumericKeypad() method
-	public static boolean isNumericKeypad(int keyCode)
-	{
-		switch(keyCode)
-		{
-		case KeyEvent.VK_NUMPAD0:
-		case KeyEvent.VK_NUMPAD1:
-		case KeyEvent.VK_NUMPAD2:
-		case KeyEvent.VK_NUMPAD3:
-		case KeyEvent.VK_NUMPAD4:
-		case KeyEvent.VK_NUMPAD5:
-		case KeyEvent.VK_NUMPAD6:
-		case KeyEvent.VK_NUMPAD7:
-		case KeyEvent.VK_NUMPAD8:
-		case KeyEvent.VK_NUMPAD9:
-		case KeyEvent.VK_MULTIPLY:
-		case KeyEvent.VK_ADD:
-		/* case KeyEvent.VK_SEPARATOR: */
-		case KeyEvent.VK_SUBTRACT:
-		case KeyEvent.VK_DECIMAL:
-		case KeyEvent.VK_DIVIDE:
-			return true;
-		default:
-			return false;
-		}
-	} //}}}
-
 	//{{{ processKeyEvent() method
 	public static KeyEvent processKeyEvent(KeyEvent evt)
 	{
@@ -258,10 +231,7 @@ public class KeyEventWorkaround
 						return null;
 				}
 
-				if(isNumericKeypad(keyCode))
-					last = LAST_NUMKEYPAD;
-				else
-					last = LAST_NOTHING;
+				last = LAST_NOTHING;
 
 				break;
 			}
@@ -293,20 +263,8 @@ public class KeyEventWorkaround
 				return null;
 			}
 
-			// if the last key was a numeric keypad key
-			// and NumLock is off, filter it out
-			if(last == LAST_NUMKEYPAD)
-			{
-				last = LAST_NOTHING;
-				if((ch >= '0' && ch <= '9') || ch == '.'
-					|| ch == '/' || ch == '*'
-					|| ch == '-' || ch == '+')
-				{
-					return null;
-				}
-			}
 			// Windows JDK workaround
-			else if(last == LAST_ALT)
+			if(last == LAST_ALT)
 			{
 				last = LAST_NOTHING;
 				switch(ch)
@@ -363,20 +321,9 @@ public class KeyEventWorkaround
 		return evt;
 	} //}}}
 
-	//{{{ numericKeypadKey() method
-	/**
-	 * A workaround for non-working NumLock status in some Java versions.
-	 * @since jEdit 4.0pre8
-	 */
-	public static void numericKeypadKey()
-	{
-		last = LAST_NOTHING;
-	} //}}}
-
 	//{{{ Private members
 	private static int last;
 	private static final int LAST_NOTHING = 0;
-	private static final int LAST_NUMKEYPAD = 1;
-	private static final int LAST_ALT = 2;
+	private static final int LAST_ALT = 1;
 	//}}}
 }
diff --git a/org/gjt/sp/jedit/gui/ListModelEditor.java b/org/gjt/sp/jedit/gui/ListModelEditor.java
index 1776a36..ce1fe43 100644
--- a/org/gjt/sp/jedit/gui/ListModelEditor.java
+++ b/org/gjt/sp/jedit/gui/ListModelEditor.java
@@ -10,6 +10,7 @@ import javax.swing.ListSelectionModel;
 import javax.swing.table.DefaultTableModel;
 
 import org.gjt.sp.jedit.jEdit;
+import org.gjt.sp.jedit.GUIUtilities;
 /** A dialog that pops up when you click on "Previously Entered Strings"
   * from a HistoryTextField.
   *
@@ -25,8 +26,9 @@ public class ListModelEditor
 	{
 		final DefaultTableModel tableModel = createTableModel(listModel);
 		final JTable table = new JTable(tableModel);
-		table
-		    .setToolTipText("Move: PgUp/PgDown; Edit: Double-Click or Insert/Delete");
+		table.setToolTipText("Move: PgUp/PgDown; Edit: Double-Click or Insert/Delete");
+		table.setRowHeight(GUIUtilities.defaultRowHeight());
+		table.getColumnModel().getColumn(0).setPreferredWidth(GUIUtilities.defaultColumnWidth());
 
 		table.addKeyListener(new KeyAdapter()
 		{
diff --git a/org/gjt/sp/jedit/gui/OptionsDialog.java b/org/gjt/sp/jedit/gui/OptionsDialog.java
index d19dde3..6a22818 100644
--- a/org/gjt/sp/jedit/gui/OptionsDialog.java
+++ b/org/gjt/sp/jedit/gui/OptionsDialog.java
@@ -41,7 +41,7 @@ import org.gjt.sp.util.Log;
 
 /** An abstract options dialog box.
  * @author Slava Pestov
- * @version $Id: OptionsDialog.java 23516 2014-04-24 03:50:48Z ezust $
+ * @version $Id: OptionsDialog.java 23923 2015-05-22 14:10:47Z ezust $
  * @todo refactor to use OptionGroupPane
  */
 public abstract class OptionsDialog extends EnhancedDialog
@@ -306,6 +306,7 @@ public abstract class OptionsDialog extends EnhancedDialog
 		stage = new JScrollPane();
 
 		paneTree = new JTree(createOptionTreeModel());
+		paneTree.setRowHeight(0);
 		paneTree.setVisibleRowCount(1);
 		paneTree.setCellRenderer(new PaneNameRenderer());
 
diff --git a/org/gjt/sp/jedit/gui/PanelWindowContainer.java b/org/gjt/sp/jedit/gui/PanelWindowContainer.java
index f212c8d..9803268 100644
--- a/org/gjt/sp/jedit/gui/PanelWindowContainer.java
+++ b/org/gjt/sp/jedit/gui/PanelWindowContainer.java
@@ -72,7 +72,7 @@ import org.gjt.sp.util.StandardUtilities;
 /** A container for dockable windows. This class should never be used
  * directly.
  * @author Slava Pestov
- * @version $Id: PanelWindowContainer.java 23221 2013-09-29 20:03:32Z shlomy $
+ * @version $Id: PanelWindowContainer.java 23717 2014-11-02 19:42:53Z ezust $
  * @since jEdit 4.0pre1
  */
 public class PanelWindowContainer implements DockableWindowContainer, DockingArea
@@ -95,6 +95,7 @@ public class PanelWindowContainer implements DockableWindowContainer, DockingAre
 			closeBox.putClientProperty("JButton.buttonType","toolbar");
 
 		closeBox.setMargin(new Insets(0,0,0,0));
+		GUIUtilities.setButtonContentMargin(closeBox, closeBox.getMargin());
 
 		closeBox.addActionListener(new ActionHandler());
 
@@ -105,6 +106,7 @@ public class PanelWindowContainer implements DockableWindowContainer, DockingAre
 			menuBtn.putClientProperty("JButton.buttonType","toolbar");
 
 		menuBtn.setMargin(new Insets(0,0,0,0));
+		GUIUtilities.setButtonContentMargin(menuBtn, menuBtn.getMargin());
 
 		menuBtn.addMouseListener(new MenuMouseHandler());
 
@@ -148,6 +150,7 @@ public class PanelWindowContainer implements DockableWindowContainer, DockingAre
 
 		JToggleButton button = new JToggleButton();
 		button.setMargin(new Insets(1,1,1,1));
+		GUIUtilities.setButtonContentMargin(button, new Insets(6,6,6,6));
 		button.setRequestFocusEnabled(false);
 		button.setIcon(new RotatedTextIcon(rotation,button.getFont(),
 			entry.shortTitle()));
diff --git a/org/gjt/sp/jedit/gui/TaskMonitor.java b/org/gjt/sp/jedit/gui/TaskMonitor.java
index 92c8fa6..8177f0a 100644
--- a/org/gjt/sp/jedit/gui/TaskMonitor.java
+++ b/org/gjt/sp/jedit/gui/TaskMonitor.java
@@ -72,6 +72,7 @@ public class TaskMonitor extends JPanel implements TaskListener
 			}
 		});
 		table = new JTable(model);
+		table.setRowHeight(GUIUtilities.defaultRowHeight());
 		table.setDefaultRenderer(Object.class, new TaskCellRenderer());
 		table.getTableHeader().setVisible(false);
 		table.setDefaultEditor(Object.class, new TaskTableEditor());
diff --git a/org/gjt/sp/jedit/gui/TipOfTheDay.java b/org/gjt/sp/jedit/gui/TipOfTheDay.java
index e2a8fdc..2f53930 100644
--- a/org/gjt/sp/jedit/gui/TipOfTheDay.java
+++ b/org/gjt/sp/jedit/gui/TipOfTheDay.java
@@ -46,18 +46,20 @@ public class TipOfTheDay extends EnhancedDialog
 		setContentPane(content);
 
 		JLabel label = new JLabel(jEdit.getProperty("tip.caption"));
-		label.setFont(new Font("SansSerif",Font.PLAIN,24));
+		label.setFont(label.getFont().deriveFont(label.getFont().getSize2D() * 2.0f));
 		label.setForeground(UIManager.getColor("Button.foreground"));
 		content.add(BorderLayout.NORTH,label);
 
 		tipText = new JEditorPane();
 		tipText.setEditable(false);
 		tipText.setContentType("text/html");
+		tipText.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);
+		tipText.setFont(jEdit.getFontProperty("helpviewer.font"));
 
 		nextTip();
 
 		JScrollPane scroller = new JScrollPane(tipText);
-		scroller.setPreferredSize(new Dimension(150,150));
+		scroller.setPreferredSize(new Dimension(250,250));
 		content.add(BorderLayout.CENTER,scroller);
 
 		ActionHandler actionHandler = new ActionHandler();
diff --git a/org/gjt/sp/jedit/gui/VariableGridLayout.java b/org/gjt/sp/jedit/gui/VariableGridLayout.java
index 21646d9..f0ea25a 100644
--- a/org/gjt/sp/jedit/gui/VariableGridLayout.java
+++ b/org/gjt/sp/jedit/gui/VariableGridLayout.java
@@ -82,13 +82,13 @@ public class VariableGridLayout implements LayoutManager2, java.io.Serializable
 	 * and the specified distance to the borders.
 	 *
 	 * @param mode The mode in which to operate. Either FIXED_NUM_ROWS or FIXED_NUM_COLUMNS
-	 * @param size The amount of rows for mode FIXED_NUM_ROWS or the amount of columns for mode FIXED_NUM_COLUMNS (>0)
-	 * @param hgap The horizontal space between cells (>=0)
-	 * @param vgap The vertical space between cells (>=0)
+	 * @param size The amount of rows for mode FIXED_NUM_ROWS or the amount of columns for mode FIXED_NUM_COLUMNS (>0)
+	 * @param hgap The horizontal space between cells (>=0)
+	 * @param vgap The vertical space between cells (>=0)
 	 * @param takeSizesIntoAccount Whether to take minimum and maximum sizes into account when distributing free space
 	 *        Javier Diaz Soto (jbds) warns in #2997417 that this may cause gui freeze and provides a patch
 	 * @param distanceToBorders The distances to the borders
-	 * @throws IllegalArgumentException if mode is not either FIXED_NUM_ROWS or FIXED_NUM_COLUMNS or size is <= 0 or hgap or vgap is < 0
+	 * @throws IllegalArgumentException if mode is not either FIXED_NUM_ROWS or FIXED_NUM_COLUMNS or size is <= 0 or hgap or vgap is < 0
 	 */
 	public VariableGridLayout(int mode, int size, int hgap, int vgap, boolean takeSizesIntoAccount, Insets distanceToBorders)
 	{
@@ -123,12 +123,12 @@ public class VariableGridLayout implements LayoutManager2, java.io.Serializable
 	 * and zero distance to borders.
 	 *
 	 * @param mode The mode in which to operate. Either FIXED_NUM_ROWS or FIXED_NUM_COLUMNS
-	 * @param size The amount of rows for mode FIXED_NUM_ROWS or the amount of columns for mode FIXED_NUM_COLUMNS (>0)
-	 * @param hgap The horizontal space between cells (>=0)
-	 * @param vgap The vertical space between cells (>=0)
+	 * @param size The amount of rows for mode FIXED_NUM_ROWS or the amount of columns for mode FIXED_NUM_COLUMNS (>0)
+	 * @param hgap The horizontal space between cells (>=0)
+	 * @param vgap The vertical space between cells (>=0)
 	 * @param takeSizesIntoAccount Whether to take minimum and maximum sizes into account when distributing free space
 	 *        Javier Diaz Soto (jbds) warns in #2997417 that this may cause gui freeze and provides a patch
-	 * @throws IllegalArgumentException if mode is not either FIXED_NUM_ROWS or FIXED_NUM_COLUMNS or size is <= 0 or hgap or vgap is < 0
+	 * @throws IllegalArgumentException if mode is not either FIXED_NUM_ROWS or FIXED_NUM_COLUMNS or size is <= 0 or hgap or vgap is < 0
 	 */
 	public VariableGridLayout(int mode, int size, int hgap, int vgap, boolean takeSizesIntoAccount)
 	{
@@ -145,7 +145,7 @@ public class VariableGridLayout implements LayoutManager2, java.io.Serializable
 	 * @param size The amount of rows for mode FIXED_NUM_ROWS or the amount of columns for mode FIXED_NUM_COLUMNS
 	 * @param hgap The horizontal space between cells
 	 * @param vgap The vertical space between cells
-	 * @throws IllegalArgumentException if mode is not either FIXED_NUM_ROWS or FIXED_NUM_COLUMNS or size is <= 0 or hgap or vgap is < 0
+	 * @throws IllegalArgumentException if mode is not either FIXED_NUM_ROWS or FIXED_NUM_COLUMNS or size is<= 0 or hgap or vgap is < 0
 	 */
 	public VariableGridLayout(int mode, int size, int hgap, int vgap)
 	{
@@ -160,7 +160,7 @@ public class VariableGridLayout implements LayoutManager2, java.io.Serializable
 	 *
 	 * @param mode The mode in which to operate. Either FIXED_NUM_ROWS or FIXED_NUM_COLUMNS
 	 * @param size The amount of rows for mode FIXED_NUM_ROWS or the amount of columns for mode FIXED_NUM_COLUMNS
-	 * @throws IllegalArgumentException if mode is not either FIXED_NUM_ROWS or FIXED_NUM_COLUMNS or size is <= 0
+	 * @throws IllegalArgumentException if mode is not either FIXED_NUM_ROWS or FIXED_NUM_COLUMNS or size is <= 0
 	 */
 	public VariableGridLayout(int mode, int size)
 	{
diff --git a/org/gjt/sp/jedit/gui/statusbar/MemoryStatusWidgetFactory.java b/org/gjt/sp/jedit/gui/statusbar/MemoryStatusWidgetFactory.java
index 77e0763..aa8fd1d 100644
--- a/org/gjt/sp/jedit/gui/statusbar/MemoryStatusWidgetFactory.java
+++ b/org/gjt/sp/jedit/gui/statusbar/MemoryStatusWidgetFactory.java
@@ -97,8 +97,7 @@ public class MemoryStatusWidgetFactory implements StatusWidgetFactory
 			//Font font = UIManager.getFont("Label.font");
 			MemoryStatus.this.setFont(font);
 
-			FontRenderContext frc = new FontRenderContext(
-				null,false,false);
+			FontRenderContext frc = new FontRenderContext(null,true,false);
 			Rectangle2D bounds = font.getStringBounds(
 				memoryTestStr,frc);
 			Dimension dim = new Dimension((int)bounds.getWidth(),
@@ -190,7 +189,7 @@ public class MemoryStatusWidgetFactory implements StatusWidgetFactory
 			String str = (used / 1024 / 1024) + "/"
 				+ (total / 1024 / 1024) + "MB";
 
-			FontRenderContext frc = new FontRenderContext(null,false,false);
+			FontRenderContext frc = new FontRenderContext(null,true,false);
 
 			Rectangle2D bounds = g.getFont().getStringBounds(str,frc);
 
diff --git a/org/gjt/sp/jedit/help/HelpIndex.java b/org/gjt/sp/jedit/help/HelpIndex.java
index f26657a..2857d85 100644
--- a/org/gjt/sp/jedit/help/HelpIndex.java
+++ b/org/gjt/sp/jedit/help/HelpIndex.java
@@ -160,14 +160,14 @@ class HelpIndex
 	/**
 	 * Reads the specified HTML file and adds all words defined therein to the
 	 * index.
-	 * @param url The HTML file's URL
+	 * @param path The HTML file's URL or path
 	 */
 	public void indexURL(String path) throws Exception
 	{
-		URL url;		
+		URL url;
 		if (MiscUtilities.isURL(path))
 			url = new URL(path);
-		else 
+		else
 		{
 			File f = new File(path);
 			url = f.toURI().toURL();
diff --git a/org/gjt/sp/jedit/help/HelpTOCPanel.java b/org/gjt/sp/jedit/help/HelpTOCPanel.java
index 327695f..02c9b49 100644
--- a/org/gjt/sp/jedit/help/HelpTOCPanel.java
+++ b/org/gjt/sp/jedit/help/HelpTOCPanel.java
@@ -62,6 +62,7 @@ public class HelpTOCPanel extends JPanel
 		if(!OperatingSystem.isMacOSLF())
 			toc.putClientProperty("JTree.lineStyle", "Angled");
 
+		toc.setRowHeight(0);
 		toc.setCellRenderer(new TOCCellRenderer());
 		toc.setEditable(false);
 		toc.setShowsRootHandles(true);
diff --git a/org/gjt/sp/jedit/help/HelpViewer.java b/org/gjt/sp/jedit/help/HelpViewer.java
index 047106e..af57a3a 100644
--- a/org/gjt/sp/jedit/help/HelpViewer.java
+++ b/org/gjt/sp/jedit/help/HelpViewer.java
@@ -43,11 +43,14 @@ import java.awt.datatransfer.StringSelection;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 
+import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLConnection;
 
 import javax.swing.Box;
 import javax.swing.BoxLayout;
@@ -79,6 +82,8 @@ import org.gjt.sp.jedit.jEdit;
 import org.gjt.sp.jedit.MiscUtilities;
 
 import org.gjt.sp.jedit.EditBus.EBHandler;
+import org.gjt.sp.jedit.io.AutoDetection;
+import org.gjt.sp.jedit.io.RegexEncodingDetector;
 import org.gjt.sp.jedit.msg.PluginUpdate;
 
 import org.gjt.sp.util.Log;
@@ -90,11 +95,12 @@ import static org.gjt.sp.jedit.help.HelpHistoryModel.HistoryEntry;
  * jEdit's searchable help viewer. It uses a Swing JEditorPane to display the HTML,
  * and implements a URL history.
  * @author Slava Pestov
- * @version $Id: HelpViewer.java 23463 2014-04-07 19:33:50Z kerik-sf $
+ * @version $Id: HelpViewer.java 23777 2014-12-16 07:06:27Z kerik-sf $
  */
 public class HelpViewer extends JFrame implements HelpViewerInterface, HelpHistoryModelListener
 {
 	private static final long serialVersionUID = 1L;
+	private static final RegexEncodingDetector ENCODING_DETECTOR = new RegexEncodingDetector(":encoding=([^:]+):", "$1");
 
 	//{{{ HelpViewer constructor
 	/**
@@ -298,6 +304,26 @@ public class HelpViewer extends JFrame implements HelpViewerInterface, HelpHisto
 				{
 					try
 					{
+						// reset encoding
+						viewer.putClientProperty("charset", null);
+						// guess encoding
+						if(_url.getPath().matches(".+\\.([tT][xX][tT])"))
+						{
+							URLConnection connection = _url.openConnection();
+							if(connection.getContentEncoding() == null)
+							{
+								InputStream is = connection.getInputStream();
+								BufferedInputStream in = AutoDetection.getMarkedStream(is);
+								String encoding = ENCODING_DETECTOR.detectEncoding(in);
+								if(encoding != null)
+								{
+									// JEditorPane uses charset to create the reader passed to the
+									// EditorKit in JEditorPane.read().
+									viewer.putClientProperty("charset", encoding);
+								}
+								in.close();
+							}
+						}
 						viewer.setPage(_url);
 						success = true;
 					}
diff --git a/org/gjt/sp/jedit/input/TextAreaInputHandler.java b/org/gjt/sp/jedit/input/TextAreaInputHandler.java
index 828a949..2383318 100644
--- a/org/gjt/sp/jedit/input/TextAreaInputHandler.java
+++ b/org/gjt/sp/jedit/input/TextAreaInputHandler.java
@@ -292,13 +292,6 @@ public abstract class TextAreaInputHandler extends AbstractInputHandler<JEditBea
 						userInput(input);
 					}
 				}
-				else
-				{
-					// this is retarded. excuse me while I drool
-					// and make stupid noises
-					if(KeyEventWorkaround.isNumericKeypad(keyStroke.key))
-						KeyEventWorkaround.numericKeypadKey();
-				}
 				sendShortcutPrefixOff();
 			}
 		}
diff --git a/org/gjt/sp/jedit/io/LocalFileSaveTask.java b/org/gjt/sp/jedit/io/LocalFileSaveTask.java
index c06fcf3..11c566c 100644
--- a/org/gjt/sp/jedit/io/LocalFileSaveTask.java
+++ b/org/gjt/sp/jedit/io/LocalFileSaveTask.java
@@ -27,7 +27,7 @@ import org.gjt.sp.util.Task;
  * @author Vadim Voituk
  * @since jEdit 4.5pre
  *
- * TODO: Add setLabel() && ProgressObserver methods
+ * TODO: Add setLabel() & ProgressObserver methods
  */
 public class LocalFileSaveTask extends Task
 {
diff --git a/org/gjt/sp/jedit/io/VFS.java b/org/gjt/sp/jedit/io/VFS.java
index 5b61cc5..7746f0c 100644
--- a/org/gjt/sp/jedit/io/VFS.java
+++ b/org/gjt/sp/jedit/io/VFS.java
@@ -104,7 +104,7 @@ import org.gjt.sp.util.ThreadUtilities;
  * @see VFSManager#getVFSForProtocol(String)
  *
  * @author Slava Pestov
- * @author $Id: VFS.java 23222 2013-09-29 20:43:34Z shlomy $
+ * @author $Id: VFS.java 23981 2015-08-10 14:56:24Z daleanson $
  */
 public abstract class VFS
 {
@@ -311,7 +311,7 @@ public abstract class VFS
 	 * and the protocol separator character and then delegates
 	 * to eventually present sub-VFS-paths present in the VFS path
 	 * like "jode:archive:/test.zip!/test.txt".
-	 * <p/>
+	 * <p>
 	 * If a VFS implementation can have additional
 	 * information in the VFS path like username / password / host / port
 	 * for FTP VFS or archive filename for archive VFS, this
diff --git a/org/gjt/sp/jedit/io/VFSFile.java b/org/gjt/sp/jedit/io/VFSFile.java
index 8b0924c..9fe4857 100644
--- a/org/gjt/sp/jedit/io/VFSFile.java
+++ b/org/gjt/sp/jedit/io/VFSFile.java
@@ -47,7 +47,8 @@ public class VFSFile implements Serializable
 	//{{{ findCompletion() method
 	/**
 	 * Return the index of a file whose name matches the given string,
-	 * in a case-insensitive manner. Exact matches are preferred.
+	 * in a case-insensitive manner. Exact matches are preferred,
+	 * then same length with different cases, then longest match.
 	 * @param files The list of files
 	 * @param start The start index, inclusive
 	 * @param end The end index, exclusive
@@ -58,22 +59,43 @@ public class VFSFile implements Serializable
 	public static int findCompletion(VFSFile[] files, int start, int end,
 		String str, boolean dirsOnly)
 	{
+		boolean strIsAbsolute = MiscUtilities.isAbsolutePath(str);
+		int strLen = str.length();
+		int potentialMatchLen = 0;
+		int iPotentialMatch = -1;
+		boolean potentialMatchGTStr = false;
+
 		for(int i = start; i < end; i++)
 		{
 			VFSFile file = files[i];
-			String matchAgainst = (MiscUtilities.isAbsolutePath(str)
+			String matchAgainst = (strIsAbsolute
 				? file.getPath() : file.getName());
 
 			if(dirsOnly && file.getType() == FILE)
+			{
 				continue;
+			}
 			/* try exact match first */
 			else if(matchAgainst.equals(str))
+			{
 				return i;
-			else if(matchAgainst.regionMatches(true,0,str,0,str.length()))
-				return i;
+			}
+			else if(matchAgainst.regionMatches(true,0,str,0,strLen))
+			{
+				/* Keep the first match with exact length but different case.
+				 * If the first match is not same length, prefer longest match */
+				if(iPotentialMatch == -1
+						|| (potentialMatchGTStr
+							&& (matchAgainst.length() > potentialMatchLen)))
+				{
+					potentialMatchLen = matchAgainst.length();
+					iPotentialMatch = i;
+					potentialMatchGTStr = potentialMatchLen > strLen;
+				}
+			}
 		}
 
-		return -1;
+		return iPotentialMatch;
 	} //}}}
 
 	//{{{ findCompletion() method
diff --git a/org/gjt/sp/jedit/io/VFSManager.java b/org/gjt/sp/jedit/io/VFSManager.java
index 6512b1a..4ed3223 100644
--- a/org/gjt/sp/jedit/io/VFSManager.java
+++ b/org/gjt/sp/jedit/io/VFSManager.java
@@ -55,7 +55,7 @@ import org.gjt.sp.util.StandardUtilities;
  * {@link #waitForRequests()}.
  *
  * @author Slava Pestov
- * @version $Id: VFSManager.java 23222 2013-09-29 20:43:34Z shlomy $
+ * @version $Id: VFSManager.java 23861 2015-02-12 04:54:35Z vanza $
  */
 public class VFSManager
 {
@@ -260,7 +260,7 @@ public class VFSManager
 	{
 		error(comp,path,messageProp,args,Log.ERROR);
 	}
-	
+
 	/**
 	 * Reports an I/O error.
 	 *
@@ -271,27 +271,39 @@ public class VFSManager
 	 * @param urgency Logging urgency (level)
 	 * @since jEdit 5.0pre1
 	 */
-	public static void error(Component comp,
+	public static void error(final Component comp,
 		final String path,
-		String messageProp,
-		Object[] args,
-		int urgency)
+		final String messageProp,
+		final Object[] args,
+		final int urgency)
 	{
-		final Frame frame = JOptionPane.getFrameForComponent(comp);
-
-		synchronized(errorLock)
+		Runnable r = new Runnable()
 		{
-			error = true;
+			@Override
+			public void run()
+			{
+				final Frame frame =
+					JOptionPane.getFrameForComponent(comp);
 
-			errors.add(new ErrorListDialog.ErrorEntry(
-				path,messageProp,args,urgency));
+				synchronized(errorLock)
+				{
+					error = true;
 
-			if(errors.size() == 1)
-			{
-				if (!errorDisplayerActive)
-					ThreadUtilities.runInBackground(new ErrorDisplayer(frame));
+					errors.add(new ErrorListDialog.ErrorEntry(
+						path,messageProp,args,urgency));
+
+					if(errors.size() == 1)
+					{
+						if (!errorDisplayerActive)
+						{
+							ThreadUtilities.runInBackground(
+								new ErrorDisplayer(frame));
+						}
+					}
+				}
 			}
-		}
+		};
+		ThreadUtilities.runInDispatchThreadAndWait(r);
 	} //}}}
 
 	//{{{ sendVFSUpdate() method
@@ -393,12 +405,12 @@ public class VFSManager
 	private static class ErrorDisplayer implements Runnable
 	{
 		private Frame frame;
-		
+
 		public ErrorDisplayer(Frame frame)
 		{
 			this.frame = frame;
 		}
-		
+
 		private void showDialog(final Frame frame,
 			final Vector<ErrorListDialog.ErrorEntry> errors)
 		{
@@ -430,7 +442,7 @@ public class VFSManager
 				Log.log(Log.ERROR, ErrorDisplayer.class, ite);
 			}
 		}
-		
+
 		public void run()
 		{
 			synchronized(errorLock)
@@ -440,11 +452,11 @@ public class VFSManager
 					return;
 				errorDisplayerActive = true;
 			}
-			
+
 			// The loop breaks only when errors.size() == 0
 			while (true)
 			{
-			
+
 				synchronized(errorLock)
 				{
 					if (errors.size() == 0) {
@@ -476,7 +488,7 @@ public class VFSManager
 					}
 					errCount2 = errors.size();
 				} //}}}
-				
+
 				// For a while new errors didn't appear.
 				// Let's display those which we already have.
 				// While the dialog will be displayed,
@@ -491,10 +503,10 @@ public class VFSManager
 				}
 				showDialog(frame, errorsCopy);
 			}
-			
+
 		}
 	} //}}}
-	
+
 	private VFSManager() {}
 	//}}}
 }
diff --git a/org/gjt/sp/jedit/jEdit.java b/org/gjt/sp/jedit/jEdit.java
index eb76c87..3ab8dcf 100644
--- a/org/gjt/sp/jedit/jEdit.java
+++ b/org/gjt/sp/jedit/jEdit.java
@@ -84,7 +84,7 @@ import org.gjt.sp.util.SyntaxUtilities;
 /**
  * The main class of the jEdit text editor.
  * @author Slava Pestov
- * @version $Id: jEdit.java 23842 2015-02-02 01:11:51Z elberry $
+ * @version $Id: jEdit.java 24112 2015-10-20 17:54:36Z vampire0 $
  */
 public class jEdit
 {
@@ -105,7 +105,7 @@ public class jEdit
 	public static String getBuild()
 	{
 		// (major).(minor).(<99 = preX, 99 = "final").(bug fix)
-		return "05.02.99.00";
+		return "05.03.99.00";
 	} //}}}
 
 	//{{{ main() method
@@ -1423,11 +1423,11 @@ public class jEdit
 
 		//{{{ Load the global catalog first
 		if(jEditHome == null)
-			loadModeCatalog("/modes/catalog",true);
+			loadModeCatalog("/modes/catalog", true, false);
 		else
 		{
 			loadModeCatalog(MiscUtilities.constructPath(jEditHome,
-				"modes","catalog"),false);
+				"modes","catalog"), false, false);
 		} //}}}
 
 		//{{{ Load user catalog second so user modes override global modes.
@@ -1460,7 +1460,7 @@ public class jEdit
 				}
 			}
 
-			loadModeCatalog(userCatalog.getPath(),false);
+			loadModeCatalog(userCatalog.getPath(), false, true);
 		} //}}}
 
 		Buffer buffer = buffersFirst;
@@ -2141,6 +2141,11 @@ public class jEdit
 					buffer.getMode().getName());
 			}
 
+			if(!isExiting)
+			{
+				EditBus.send(new BufferUpdate(buffer,view,BufferUpdate.CLOSING));
+			}
+
 			buffer.close();
 			DisplayManager.bufferClosed(buffer);
 			if(!isExiting)
@@ -2179,30 +2184,47 @@ public class jEdit
 	 */
 	public static void saveAllBuffers(View view, boolean confirm)
 	{
-		if(confirm)
+		List<Buffer> buffers = new ArrayList<Buffer>();
+		List<String> selectedBuffers = new ArrayList<String>();
+
 		{
-			int result = GUIUtilities.confirm(view,"saveall",null,
+			Buffer buffer = buffersFirst;
+			while (buffer != null) {
+				if (buffer.isDirty()) {
+					buffers.add(buffer);
+					selectedBuffers.add(buffer.getPath());
+				}
+				buffer = buffer.next;
+			}
+		}
+
+		if (confirm && !buffers.isEmpty())
+		{
+			DefaultListModel<String> listModel = new DefaultListModel<String>();
+			for (Buffer buffer : buffers) listModel.addElement(buffer.getPath());
+
+			JList<String> bufferList = new JList<String>(listModel);
+			bufferList.setVisibleRowCount(Math.min(listModel.getSize(), 10));
+			bufferList.setSelectionInterval(0, listModel.getSize() - 1);
+
+			int result = JOptionPane.showConfirmDialog(view,
+				new Object[]{ new JLabel(jEdit.getProperty("saveall.message")), new JScrollPane(bufferList) },
+				jEdit.getProperty("saveall.title"),
 				JOptionPane.YES_NO_OPTION,
 				JOptionPane.QUESTION_MESSAGE);
 			if(result != JOptionPane.YES_OPTION)
 				return;
+
+			selectedBuffers = bufferList.getSelectedValuesList();
 		}
 
 		Buffer current = view.getBuffer();
-
-		Buffer buffer = buffersFirst;
-		while(buffer != null)
-		{
-			if(buffer.isDirty())
-			{
-				if(buffer.isNewFile())
-					view.setBuffer(buffer);
-				buffer.save(view,null,true,true);
+		for (Buffer buffer : buffers) {
+			if (selectedBuffers.contains(buffer.getPath())) {
+				if (buffer.isNewFile()) view.setBuffer(buffer);
+				buffer.save(view, null, true, true);
 			}
-
-			buffer = buffer.next;
 		}
-
 		view.setBuffer(current);
 	} //}}}
 
@@ -3781,12 +3803,6 @@ public class jEdit
 		if (lfOld != null)
 			sLfOld = lfOld.getClass().getName();
 
-		// do not change anything if Look and Feel did not change
-		if (isStartupDone() && sLf.equals(sLfOld))
-		{
-			return;
-		}
-
 		Font primaryFont = jEdit.getFontProperty(
 			"metal.primary.font");
 		if(primaryFont != null)
@@ -3931,6 +3947,8 @@ public class jEdit
 
 		defaults.remove("SplitPane.border");
 		defaults.remove("SplitPaneDivider.border");
+		
+		defaults.put("Tree.rowHeight", 0);
 
 		JFrame.setDefaultLookAndFeelDecorated(
 			getBooleanProperty("decorate.frames"));
@@ -4547,7 +4565,7 @@ loop:
 	 * Loads a mode catalog file.
 	 * @since jEdit 3.2pre2
 	 */
-	private static void loadModeCatalog(String path, boolean resource)
+	private static void loadModeCatalog(String path, boolean resource, final boolean userMode)
 	{
 		Log.log(Log.MESSAGE,jEdit.class,"Loading mode catalog file " + path);
 
@@ -4557,7 +4575,9 @@ loop:
 			@Override
 			protected Mode instantiateMode(String modeName)
 			{
-				return new JEditMode(modeName);
+				Mode mode = new JEditMode(modeName);
+				mode.setUserMode(userMode);
+				return mode;
 			}
 		};
 		try
diff --git a/org/gjt/sp/jedit/jedit.props b/org/gjt/sp/jedit/jedit.props
index b084b44..61ed13b 100644
--- a/org/gjt/sp/jedit/jedit.props
+++ b/org/gjt/sp/jedit/jedit.props
@@ -24,6 +24,13 @@ metal.secondary.fontsize=12
 metal.secondary.fontstyle=0
 #}}}
 
+#{{{ HelpViewer and Tip of the Day font
+helpviewer.font=Dialog
+helpviewer.fontsize=12
+helpviewer.fontstyle=0
+#}}}
+
+
 # Decorate frames and dialogs using Swing L&F?
 decorate.frames=false
 decorate.dialogs=false
@@ -246,6 +253,7 @@ view.structureHighlightColor=#000000
 # EOL markers
 view.eolMarkers=false
 view.eolMarkerColor=#ff6633
+view.eolMarkerChar=↩
 
 # Wrap guide
 view.wrapGuide=true
@@ -518,9 +526,5 @@ keymap.current=jEdit
 keymap.default=jEdit
 #}}}
 
-
-available.lang=en de fr ja cs ru zh
 # if lang.usedefaultlocale is true, the lang.current is not used
 lang.usedefaultlocale=true
-lang.current=en
-
diff --git a/org/gjt/sp/jedit/jedit_gui.props b/org/gjt/sp/jedit/jedit_gui.props
index 5c960e1..e73b68f 100644
--- a/org/gjt/sp/jedit/jedit_gui.props
+++ b/org/gjt/sp/jedit/jedit_gui.props
@@ -141,29 +141,29 @@ view.mbar=file edit search markers folds view utils macros plugins help-menu
 
 #{{{ File menu
 file=new-file \
-     new-file-in-mode \
-     open-file \
-     %recent-files \
-     - \
-     reload \
-     reload-all \
-     %reload-encoding \
-     - \
-     close-buffer \
-     closeall-except-active \
-     closeall-bufferset \
-     global-close-buffer \
-     close-all \
-     - \
-     save \
-     save-as \
-     save-a-copy-as \
-     save-all \
-     - \
-     print \
-     page-setup \
-     - \
-     exit
+	 new-file-in-mode \
+	 open-file \
+	 %recent-files \
+	 - \
+	 reload \
+	 reload-all \
+	 %reload-encoding \
+	 - \
+	 close-buffer \
+	 closeall-except-active \
+	 closeall-bufferset \
+	 global-close-buffer \
+	 close-all \
+	 - \
+	 save \
+	 save-as \
+	 save-a-copy-as \
+	 save-all \
+	 - \
+	 print \
+	 page-setup \
+	 - \
+	 exit
 new-file.icon.small=16x16/actions/document-new.png
 new-file-in-mode.icon.small=16x16/actions/document-new.png
 open-file.icon.small=16x16/actions/document-open.png
@@ -193,25 +193,25 @@ reload-encoding.icon.small=16x16/actions/view-refresh.png
 
 #{{{ Edit menu
 edit=undo \
-     redo \
-     - \
-     cut \
-     copy \
-     paste \
-     %clipboard \
-     - \
-     select-all \
-     %selection \
-     - \
-     word-count \
-     complete-word \
-     expand-abbrev \
-     - \
-     goto-line \
-     - \
-     %text \
-     %indent \
-     %source
+	 redo \
+	 - \
+	 cut \
+	 copy \
+	 paste \
+	 %clipboard \
+	 - \
+	 select-all \
+	 %selection \
+	 - \
+	 word-count \
+	 complete-word \
+	 expand-abbrev \
+	 - \
+	 goto-line \
+	 - \
+	 %text \
+	 %indent \
+	 %source
 undo.icon.small=16x16/actions/edit-undo.png
 redo.icon.small=16x16/actions/edit-redo.png
 cut.icon.small=16x16/actions/edit-cut.png
@@ -254,61 +254,61 @@ selection=select-none \
 
 #{{{ Text menu
 text=delete-line \
-     delete-start-line \
-     delete-end-line \
-     join-lines \
-     - \
-     format-paragraph \
-     delete-paragraph \
-     - \
-     to-lower \
-     to-upper
+	 delete-start-line \
+	 delete-end-line \
+	 join-lines \
+	 - \
+	 format-paragraph \
+	 delete-paragraph \
+	 - \
+	 to-lower \
+	 to-upper
 #}}}
 
 #{{{ Indent menu
 indent=indent-lines \
-       shift-left \
-       shift-right \
-       - \
-       remove-trailing-ws \
-       spaces-to-tabs \
-       tabs-to-spaces
+	   shift-left \
+	   shift-right \
+	   - \
+	   remove-trailing-ws \
+	   spaces-to-tabs \
+	   tabs-to-spaces
 #}}}
 
 #{{{ Source menu
 source=range-comment \
-       line-comment \
-       - \
-       select-block \
-       match-bracket \
-       prev-bracket \
-       next-bracket
+	   line-comment \
+	   - \
+	   select-block \
+	   match-bracket \
+	   prev-bracket \
+	   next-bracket
 #}}}
 
 #}}}
 
 #{{{ Search menu
 search=find \
-       find-next \
-       find-prev \
-       - \
-       search-in-open-buffers \
-       search-in-directory \
-       - \
-       replace-in-selection \
-       replace-and-find-next \
-       replace-all \
-       - \
-       quick-search \
-       hypersearch \
-       quick-search-word \
-       hypersearch-word \
-       - \
-       whole-word \
-       ignore-case \
-       regexp \
-       - \
-       hypersearch-results
+	   find-next \
+	   find-prev \
+	   - \
+	   search-in-open-buffers \
+	   search-in-directory \
+	   - \
+	   replace-in-selection \
+	   replace-and-find-next \
+	   replace-all \
+	   - \
+	   quick-search \
+	   hypersearch \
+	   quick-search-word \
+	   hypersearch-word \
+	   - \
+	   whole-word \
+	   ignore-case \
+	   regexp \
+	   - \
+	   hypersearch-results
 find.icon.small=22x22/actions/edit-find.png
 find-next.icon.small=22x22/actions/edit-find-next.png
 search-in-directory.icon.small=22x22/actions/edit-find-in-folder.png
@@ -347,47 +347,47 @@ next-marker.icon.small=22x22/actions/go-next.png
 
 #{{{ Folding menu
 folds=collapse-fold \
-      expand-one-level \
-      expand-fold \
-      - \
-      collapse-all-folds \
-      expand-folds \
-      expand-all-folds \
-      - \
-      select-fold \
-      - \
-      add-explicit-fold \
-      - \
-      narrow-to-fold \
-      narrow-to-selection \
-      - \
-      parent-fold \
-      prev-fold \
-      next-fold
+	  expand-one-level \
+	  expand-fold \
+	  - \
+	  collapse-all-folds \
+	  expand-folds \
+	  expand-all-folds \
+	  - \
+	  select-fold \
+	  - \
+	  add-explicit-fold \
+	  - \
+	  narrow-to-fold \
+	  narrow-to-selection \
+	  - \
+	  parent-fold \
+	  prev-fold \
+	  next-fold
 #}}}
 
 #{{{ View menu
 view=new-view \
-     new-plain-view \
-     close-view \
-     - \
-     prev-buffer \
-     next-buffer \
-     recent-buffer \
-     focus-buffer-switcher \
-     - \
-     toggle-line-numbers \
-     toggle-statusbar \
-     toggle-gutter \
-     toggle-buffer-switcher \
-     - \
-     %scrolling \
-     %splitting \
-     %docking \
-     %buffersets \
-     - \
-     set-view-title \
-     toggle-full-screen
+	 new-plain-view \
+	 close-view \
+	 - \
+	 prev-buffer \
+	 next-buffer \
+	 recent-buffer \
+	 focus-buffer-switcher \
+	 - \
+	 toggle-line-numbers \
+	 toggle-statusbar \
+	 toggle-gutter \
+	 toggle-buffer-switcher \
+	 - \
+	 %scrolling \
+	 %splitting \
+	 %docking \
+	 %buffersets \
+	 - \
+	 set-view-title \
+	 toggle-full-screen
 new-view.icon.small=16x16/actions/window-new.png
 new-plain-view.icon.small=16x16/actions/window-new.png
 close-view.icon.small=16x16/actions/document-close.png
@@ -436,23 +436,23 @@ docking=left-docking-area \
 
 #{{{ Utilities menu
 utils=vfs.browser \
-      %recent-directories \
-      - \
-      %favorites \
-      %current-directory \
-      %jedit-directory \
-      %settings-directory \
-      - \
-      %beanshell \
-      %troubleshooting \
-      - \
-      action-bar \
-      last-action \
-      - \
-      buffer-options \
-      global-options \
-      - \
-      %quick-options
+	  %recent-directories \
+	  - \
+	  %favorites \
+	  %current-directory \
+	  %jedit-directory \
+	  %settings-directory \
+	  - \
+	  %beanshell \
+	  %troubleshooting \
+	  - \
+	  action-bar \
+	  last-action \
+	  - \
+	  buffer-options \
+	  global-options \
+	  - \
+	  %quick-options
 
 buffer-options.icon.small=16x16/actions/document-properties.png
 global-options.icon.small=16x16/categories/preferences-system.png
@@ -483,8 +483,8 @@ settings-directory.code=settings = jEdit.getSettingsDirectory(); \
 
 #{{{ BeanShell menu
 beanshell=eval \
-       eval-for-selected-lines \
-       eval-selection
+	   eval-for-selected-lines \
+	   eval-selection
 #}}}
 
 #{{{ Troubleshooting menu
@@ -505,18 +505,18 @@ quick-options=edit-syntax-style
 
 #{{{ Macros menu
 macros=new-macro \
-       - \
-       record-macro \
-       stop-recording \
-       - \
-       last-macro \
-       - \
-       record-temp-macro \
-       run-temp-macro \
-       - \
-       run-other-macro \
-       rescan-macros \
-       -
+	   - \
+	   record-macro \
+	   stop-recording \
+	   - \
+	   last-macro \
+	   - \
+	   record-temp-macro \
+	   run-temp-macro \
+	   - \
+	   run-other-macro \
+	   rescan-macros \
+	   -
 macros.code=new MacrosProvider();
 new-macro.icon.small=16x16/actions/document-new.png
 record-macro.icon.small=16x16/actions/media-record.png
@@ -530,9 +530,8 @@ plugins.code=new PluginsProvider();
 
 #{{{ Help menu
 help-menu=about \
-     help \
-     tip-of-the-day \
-     userFeedback
+	 help \
+	 tip-of-the-day
 #}}}
 
 #}}}
@@ -613,6 +612,7 @@ about.text.contributors=Slava Pestov\n\
 	Eric Benoit\n\
 	Eric Berry\n\
 	Eric Ladner\n\
+	Eric Le Lay\n\
 	Evan Wright\n\
 	Fan Ho Yin\n\
 	Francesc Roses\n\
@@ -668,6 +668,7 @@ about.text.contributors=Slava Pestov\n\
 	Lionel Fiol\n\
 	Magnus Henriksson\n\
 	Maik Schreiber\n\
+	Makarius Wenzel\n\
 	Marc Rummel\n\
 	Marcelo Vanzin\n\
 	Marcio Marchini\n\
@@ -704,6 +705,7 @@ about.text.contributors=Slava Pestov\n\
 	Peter C. Chapin\n\
 	Peter Cox\n\
 	Peter Graves\n\
+	Peter Lynch\n\
 	Philipp Janda\n\
 	Phillip Mateescu\n\
 	Ralf Engels\n\
@@ -791,7 +793,7 @@ options.last=editing
 #{{{ Options groups
 options.groups=jedit browser
 options.group.jedit=general abbrevs appearance context docking editing \
-	encodings gutter mouse plugin-manager print firewall save-back \
+	encodings gutter large-files mouse plugin-manager print firewall save-back \
 	shortcuts status syntax textarea toolbar view
 options.group.browser=browser.general browser.colors browser.custom.context
 #}}}
@@ -809,12 +811,18 @@ options.abbrevs.remove.icon=22x22/actions/list-remove.png
 
 #{{{ Appearance pane
 options.appearance.code=new AppearanceOptionPane();
+
+# List of available languages:
+available.lang=en de fr ja cs ru zh ko
+
 # It is encouraged to set the following labels in their own language
 # here (not in localized .props) to catch eyes of non-English users more
 # friendly.
 options.appearance.lang.en=English
 options.appearance.lang.fr=Français
 options.appearance.lang.de=Deutsch
+# Korean
+options.appearance.lang.ko=한국의
 #Japanese
 options.appearance.lang.ja=日本語
 options.appearance.lang.cs=Česky
@@ -849,6 +857,10 @@ options.encodings.code=new EncodingsOptionPane();
 options.gutter.code=new GutterOptionPane();
 #}}}
 
+#{{{ Large file pane
+options.large-files.code=new LargeFilesOptionPane();
+#}}}
+
 #{{{ Mouse pane
 options.mouse.code=new MouseOptionPane();
 #}}}
@@ -955,15 +967,15 @@ vfs.browser.previous.icon=22x22/actions/go-previous.png
 
 #{{{ Tool bar
 vfs.browser.toolbar-browser=vfs.browser.previous \
-			    vfs.browser.next \
-			    vfs.browser.up \
-			    vfs.browser.reload \
-			    vfs.browser.home \
-			    vfs.browser.roots \
-			    vfs.browser.synchronize \
-			    vfs.browser.new-file \
-			    vfs.browser.new-directory \
-			    vfs.browser.search-directory
+				vfs.browser.next \
+				vfs.browser.up \
+				vfs.browser.reload \
+				vfs.browser.home \
+				vfs.browser.roots \
+				vfs.browser.synchronize \
+				vfs.browser.new-file \
+				vfs.browser.new-directory \
+				vfs.browser.search-directory
 
 vfs.browser.toolbar-dialog=vfs.browser.previous \
 			   vfs.browser.next \
@@ -977,8 +989,8 @@ vfs.browser.toolbar-dialog=vfs.browser.previous \
 
 #{{{ Commands menu
 vfs.browser.open-in=vfs.browser.open-view \
-		    vfs.browser.open-plain-view \
-		    vfs.browser.open-split
+			vfs.browser.open-plain-view \
+			vfs.browser.open-split
 #}}}
 
 #}}}
diff --git a/org/gjt/sp/jedit/menu/EnhancedCheckBoxMenuItem.java b/org/gjt/sp/jedit/menu/EnhancedCheckBoxMenuItem.java
index 1c28939..78faad3 100644
--- a/org/gjt/sp/jedit/menu/EnhancedCheckBoxMenuItem.java
+++ b/org/gjt/sp/jedit/menu/EnhancedCheckBoxMenuItem.java
@@ -100,8 +100,8 @@ public class EnhancedCheckBoxMenuItem extends JCheckBoxMenuItem
 
 		if(shortcut != null)
 		{
-			d.width += (getFontMetrics(EnhancedMenuItem.acceleratorFont)
-				.stringWidth(shortcut) + 15);
+			FontMetrics fm = getFontMetrics(EnhancedMenuItem.acceleratorFont);
+			d.width += (fm.stringWidth(shortcut) + fm.stringWidth("AAAA"));
 		}
 		return d;
 	} //}}}
@@ -114,7 +114,9 @@ public class EnhancedCheckBoxMenuItem extends JCheckBoxMenuItem
 
 		if(shortcut != null)
 		{
+			Graphics2D g2 = (Graphics2D)g;
 			g.setFont(EnhancedMenuItem.acceleratorFont);
+			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 			g.setColor(getModel().isArmed() ?
 				EnhancedMenuItem.acceleratorSelectionForeground :
 				EnhancedMenuItem.acceleratorForeground);
@@ -122,9 +124,7 @@ public class EnhancedCheckBoxMenuItem extends JCheckBoxMenuItem
 			Insets insets = getInsets();
 			g.drawString(shortcut,getWidth() - (fm.stringWidth(
 				shortcut) + insets.right + insets.left + 5),
-				getFont().getSize() + (insets.top - 
-				(OperatingSystem.isMacOSLF() ? 0 : 1))
-				/* XXX magic number */);
+				fm.getAscent() + insets.top);
 		}
 	} //}}}
 
diff --git a/org/gjt/sp/jedit/menu/EnhancedMenuItem.java b/org/gjt/sp/jedit/menu/EnhancedMenuItem.java
index 61e1685..26886c6 100644
--- a/org/gjt/sp/jedit/menu/EnhancedMenuItem.java
+++ b/org/gjt/sp/jedit/menu/EnhancedMenuItem.java
@@ -94,8 +94,8 @@ public class EnhancedMenuItem extends JMenuItem
 
 		if(shortcut != null)
 		{
-			d.width += (getFontMetrics(acceleratorFont)
-				.stringWidth(shortcut) + 15);
+			FontMetrics fm = getFontMetrics(acceleratorFont);
+			d.width += (fm.stringWidth(shortcut) + fm.stringWidth("AAAA"));
 		}
 		return d;
 	} //}}}
@@ -107,7 +107,9 @@ public class EnhancedMenuItem extends JMenuItem
 
 		if(shortcut != null)
 		{
+			Graphics2D g2 = (Graphics2D)g;
 			g.setFont(acceleratorFont);
+			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 			g.setColor(getModel().isArmed() ?
 				acceleratorSelectionForeground :
 				acceleratorForeground);
@@ -115,9 +117,7 @@ public class EnhancedMenuItem extends JMenuItem
 			Insets insets = getInsets();
 			g.drawString(shortcut,getWidth() - (fm.stringWidth(
 				shortcut) + insets.right + insets.left + 5),
-				getFont().getSize() + (insets.top - 
-				(OperatingSystem.isMacOSLF() ? 0 : 1))
-				/* XXX magic number */);
+				fm.getAscent() + insets.top);
 		}
 	} //}}}
 
@@ -137,21 +137,8 @@ public class EnhancedMenuItem extends JMenuItem
 	//{{{ Class initializer
 	static
 	{
-		String shortcutFont;
-		if (OperatingSystem.isMacOSLF())
-		{
-			shortcutFont = "Lucida Grande";
-		}
-		else
-		{
-			shortcutFont = "Monospaced";
-		}
-		
-		acceleratorFont = UIManager.getFont("MenuItem.acceleratorFont");
-		if(acceleratorFont == null)
-		{
-			acceleratorFont = new Font(shortcutFont,Font.PLAIN,12);
-		}
+		acceleratorFont = GUIUtilities.menuAcceleratorFont();
+
 		acceleratorForeground = UIManager
 			.getColor("MenuItem.acceleratorForeground");
 		if(acceleratorForeground == null)
diff --git a/org/gjt/sp/jedit/menu/MarkersProvider.java b/org/gjt/sp/jedit/menu/MarkersProvider.java
index 05246c5..2a57365 100644
--- a/org/gjt/sp/jedit/menu/MarkersProvider.java
+++ b/org/gjt/sp/jedit/menu/MarkersProvider.java
@@ -113,8 +113,8 @@ public class MarkersProvider implements DynamicMenuProvider
 
 			if(shortcut != null)
 			{
-				d.width += (getFontMetrics(acceleratorFont)
-					.stringWidth(shortcut) + 15);
+				FontMetrics fm = getFontMetrics(acceleratorFont);
+				d.width += (fm.stringWidth(shortcut) + fm.stringWidth("AAAA"));
 			}
 			return d;
 		} //}}}
@@ -128,7 +128,9 @@ public class MarkersProvider implements DynamicMenuProvider
 
 			if(shortcut != null)
 			{
+				Graphics2D g2 = (Graphics2D)g;
 				g.setFont(acceleratorFont);
+				g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 				g.setColor(getModel().isArmed() ?
 					acceleratorSelectionForeground :
 					acceleratorForeground);
@@ -136,8 +138,7 @@ public class MarkersProvider implements DynamicMenuProvider
 				Insets insets = getInsets();
 				g.drawString(shortcut,getWidth() - (fm.stringWidth(
 					shortcut) + insets.right + insets.left + 5),
-					getFont().getSize() + (insets.top - 1)
-					/* XXX magic number */);
+					fm.getAscent() + insets.top);
 			}
 		} //}}}
 
@@ -169,10 +170,7 @@ public class MarkersProvider implements DynamicMenuProvider
 		//{{{ Class initializer
 		static
 		{
-			acceleratorFont = UIManager.getFont("MenuItem.acceleratorFont");
-			acceleratorFont = new Font("Monospaced",
-				acceleratorFont.getStyle(),
-				acceleratorFont.getSize());
+			acceleratorFont = GUIUtilities.menuAcceleratorFont();
 			acceleratorForeground = UIManager
 				.getColor("MenuItem.acceleratorForeground");
 			acceleratorSelectionForeground = UIManager
diff --git a/org/gjt/sp/jedit/menu/RecentFilesProvider.java b/org/gjt/sp/jedit/menu/RecentFilesProvider.java
index 4d51851..4c0fb87 100644
--- a/org/gjt/sp/jedit/menu/RecentFilesProvider.java
+++ b/org/gjt/sp/jedit/menu/RecentFilesProvider.java
@@ -134,6 +134,8 @@ public class RecentFilesProvider implements DynamicMenuProvider
 		while(iter.hasNext())
 		{
 			String path = iter.next().path;
+			if (jEdit.getBooleanProperty("hideOpen") && jEdit.getBuffer(path) != null)
+				continue;
 			JMenuItem menuItem = new JMenuItem(MiscUtilities
 				.getFileName(path));
 			menuItem.setToolTipText(path);
diff --git a/org/gjt/sp/jedit/msg/ViewUpdate.java b/org/gjt/sp/jedit/msg/ViewUpdate.java
index 17aa5ca..31ff111 100644
--- a/org/gjt/sp/jedit/msg/ViewUpdate.java
+++ b/org/gjt/sp/jedit/msg/ViewUpdate.java
@@ -27,7 +27,7 @@ import org.gjt.sp.jedit.*;
 /**
  * Message sent when a view-related change occurs.
  * @author Slava Pestov
- * @version $Id: ViewUpdate.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: ViewUpdate.java 23714 2014-11-02 01:29:37Z daleanson $
  *
  * @since jEdit 2.2pre6
  */
@@ -54,6 +54,13 @@ public class ViewUpdate extends EBMessage
 	 * @since jEdit 4.3pre4
 	 */
 	public static final Object ACTIVATED = "VIEW_ACTIVATED";
+	
+	
+	/**
+	 * Full screen mode has been toggled.
+	 * @since jEdit 5.3pre1
+	 */
+	public static final Object FULL_SCREEN_TOGGLED = "FULL_SCREEN_TOGGLED";
 
 	//{{{ ViewUpdate constructor
 	/**
diff --git a/org/gjt/sp/jedit/options/AbbrevsOptionPane.java b/org/gjt/sp/jedit/options/AbbrevsOptionPane.java
index 319cb36..a9129e5 100644
--- a/org/gjt/sp/jedit/options/AbbrevsOptionPane.java
+++ b/org/gjt/sp/jedit/options/AbbrevsOptionPane.java
@@ -41,7 +41,7 @@ import org.gjt.sp.util.StandardUtilities;
 /**
  * Abbrev editor.
  * @author Slava Pestov
- * @version $Id: AbbrevsOptionPane.java 23221 2013-09-29 20:03:32Z shlomy $
+ * @version $Id: AbbrevsOptionPane.java 23920 2015-05-22 08:03:45Z ezust $
  */
 public class AbbrevsOptionPane extends AbstractOptionPane
 {
@@ -96,6 +96,7 @@ public class AbbrevsOptionPane extends AbstractOptionPane
 
 		globalAbbrevs = new AbbrevsModel(Abbrevs.getGlobalAbbrevs());
 		abbrevsTable = new JTable(globalAbbrevs);
+		abbrevsTable.setRowHeight(GUIUtilities.defaultRowHeight());
 		abbrevsTable.getColumnModel().getColumn(1).setCellRenderer(
 			new Renderer());
 		abbrevsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
diff --git a/org/gjt/sp/jedit/options/BrowserColorsOptionPane.java b/org/gjt/sp/jedit/options/BrowserColorsOptionPane.java
index 8b961bf..750e60c 100644
--- a/org/gjt/sp/jedit/options/BrowserColorsOptionPane.java
+++ b/org/gjt/sp/jedit/options/BrowserColorsOptionPane.java
@@ -40,7 +40,7 @@ import org.gjt.sp.jedit.*;
 /**
  * Browser color editor.
  * @author Slava Pestov
- * @version $Id: BrowserColorsOptionPane.java 22665 2013-01-11 16:25:33Z kpouer $
+ * @version $Id: BrowserColorsOptionPane.java 23920 2015-05-22 08:03:45Z ezust $
  */
 public class BrowserColorsOptionPane extends AbstractOptionPane
 {
@@ -59,6 +59,7 @@ public class BrowserColorsOptionPane extends AbstractOptionPane
 
 		colorsModel = new BrowserColorsModel();
 		colorsTable = new JTable(colorsModel);
+		colorsTable.setRowHeight(GUIUtilities.defaultRowHeight());
 		colorsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
 		colorsTable.getTableHeader().setReorderingAllowed(false);
 		colorsTable.addMouseListener(new MouseHandler());
diff --git a/org/gjt/sp/jedit/options/EditingOptionPane.java b/org/gjt/sp/jedit/options/EditingOptionPane.java
index 51aa372..e0cf264 100644
--- a/org/gjt/sp/jedit/options/EditingOptionPane.java
+++ b/org/gjt/sp/jedit/options/EditingOptionPane.java
@@ -26,17 +26,22 @@ package org.gjt.sp.jedit.options;
 import javax.swing.*;
 
 import java.awt.event.*;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.*;
 import java.util.Arrays;
 import java.util.Objects;
 
 import org.gjt.sp.jedit.*;
 import org.gjt.sp.jedit.buffer.FoldHandler;
+import org.gjt.sp.jedit.gui.AddModeDialog;
+import org.gjt.sp.jedit.syntax.ModeProvider;
 import org.gjt.sp.util.StandardUtilities;
 //}}}
 
 /**
  * @author Slava Pestov
- * @version $Id: EditingOptionPane.java 23381 2013-12-09 12:43:14Z kpouer $
+ * @version $Id: EditingOptionPane.java 24012 2015-08-12 08:48:07Z kpouer $
  */
 public class EditingOptionPane extends AbstractOptionPane
 {
@@ -50,21 +55,7 @@ public class EditingOptionPane extends AbstractOptionPane
 	@Override
 	protected void _init()
 	{
-		Mode[] modes = jEdit.getModes();
-		Arrays.sort(modes,new StandardUtilities.StringCompare<Mode>(true));
-
-		global = new ModeProperties();
-		modeProps = new ModeProperties[modes.length];
-
-		String[] modeNames = new String[modes.length + 1];
-		modeNames[0] = jEdit.getProperty("options.editing.global");
-
-		for(int i = 0; i < modes.length; i++)
-		{
-			modeProps[i] = new ModeProperties(modes[i]);
-			modeNames[i + 1] = modes[i].getName();
-		}
-
+		Mode[] modes = reloadModes();
 		mode = new JComboBox(modeNames);
 		mode.addActionListener(new ActionHandler());
 
@@ -73,6 +64,12 @@ public class EditingOptionPane extends AbstractOptionPane
 
 		addComponent(jEdit.getProperty("options.editing.mode"),mode);
 
+		deleteMode = new JButton(jEdit.getProperty("options.editing.deleteMode"));
+		deleteMode.setEnabled(false);
+		deleteMode.setVisible(false);
+		deleteMode.addActionListener(new ActionHandler());
+		addComponent(deleteMode);
+
 		useDefaults = new JCheckBox(jEdit.getProperty("options.editing.useDefaults"));
 		useDefaults.addActionListener(new ActionHandler());
 		addComponent(useDefaults);
@@ -141,7 +138,7 @@ public class EditingOptionPane extends AbstractOptionPane
 
 		addComponent(jEdit.getProperty("options.editing.firstlineGlob"),
 			firstlineGlob = new JTextField());
-
+		
 		selectMode();
 
 		addSeparator();
@@ -161,39 +158,33 @@ public class EditingOptionPane extends AbstractOptionPane
 		resetUndoOnSave.setSelected(jEdit.getBooleanProperty("resetUndoOnSave"));
 		addComponent(resetUndoOnSave);
 		//}}}
+		
+		addSeparator();
 
-		//{{{ Large file mode
-		addSeparator(jEdit.getProperty("options.editing.largefilemode.title"));
+		addMode = new JButton(jEdit.getProperty("options.editing.addMode"));
+		addMode.addActionListener(new ActionHandler());
+		addComponent(addMode);
 
-		addComponent(new JLabel(jEdit.getProperty("options.editing.largefilemode")));
-		addComponent(askLargeFileMode = new JRadioButton(jEdit.getProperty("options.editing.largefilemode.option.ask")));
-		addComponent(fullSyntaxLargeFileMode = new JRadioButton(jEdit.getProperty("options.editing.largefilemode.option.full")));
-		addComponent(limitedSyntaxLargeFileMode = new JRadioButton(jEdit.getProperty("options.editing.largefilemode.option.limited")));
-		addComponent(noHighlightLargeFileMode = new JRadioButton(jEdit.getProperty("options.editing.largefilemode.option.nohighlight")));
-		String option = jEdit.getProperty("largefilemode", "ask");
-		if ("full".equals(option))
-		{
-			fullSyntaxLargeFileMode.setSelected(true);
-		}
-		else if ("limited".equals(option))
-		{
-			limitedSyntaxLargeFileMode.setSelected(true);
-		}
-		else if ("nohighlight".equals(option))
-		{
-			noHighlightLargeFileMode.setSelected(true);
-		}
-		else
+	} //}}}
+	
+	private Mode[] reloadModes()
+	{
+		Mode[] modes = jEdit.getModes();
+		Arrays.sort(modes,new StandardUtilities.StringCompare<Mode>(true));
+
+		global = new ModeProperties();
+		modeProps = new ModeProperties[modes.length];
+
+		modeNames = new String[modes.length + 1];
+		modeNames[0] = jEdit.getProperty("options.editing.global");
+
+		for(int i = 0; i < modes.length; i++)
 		{
-			askLargeFileMode.setSelected(true);
+			modeProps[i] = new ModeProperties(modes[i]);
+			modeNames[i + 1] = modes[i].getName();
 		}
-		ButtonGroup largeFileModeButtonGroup = new ButtonGroup();
-		largeFileModeButtonGroup.add(askLargeFileMode);
-		largeFileModeButtonGroup.add(fullSyntaxLargeFileMode);
-		largeFileModeButtonGroup.add(limitedSyntaxLargeFileMode);
-		largeFileModeButtonGroup.add(noHighlightLargeFileMode);
-		//}}}
-	} //}}}
+		return modes;
+	}
 
 	//{{{ _save() method
 	@Override
@@ -212,23 +203,6 @@ public class EditingOptionPane extends AbstractOptionPane
 		{
 			modeProp.save();
 		}
-
-		if (fullSyntaxLargeFileMode.isSelected())
-		{
-			jEdit.setProperty("largefilemode", "full");
-		}
-		else if (limitedSyntaxLargeFileMode.isSelected())
-		{
-			jEdit.setProperty("largefilemode", "limited");
-		}
-		else if (noHighlightLargeFileMode.isSelected())
-		{
-			jEdit.setProperty("largefilemode", "nohighlight");
-		}
-		else
-		{
-			jEdit.setProperty("largefilemode", "ask");
-		}
 	} //}}}
 
 	//{{{ Private members
@@ -245,6 +219,8 @@ public class EditingOptionPane extends AbstractOptionPane
 	private JCheckBox useDefaults;
 	private JTextField filenameGlob;
 	private JTextField firstlineGlob;
+	private JButton deleteMode;
+	private JButton addMode;
 	private JTextField noWordSep;
 	private JCheckBox camelCasedWords;
 	private JComboBox folding;
@@ -257,11 +233,7 @@ public class EditingOptionPane extends AbstractOptionPane
 	private JCheckBox elasticTabstops;
 	private JComboBox autoIndent;
 	private JCheckBox deepIndent;
-	private JRadioButton largeFileMode;
-	private JRadioButton askLargeFileMode;
-	private JRadioButton noHighlightLargeFileMode;
-	private JRadioButton limitedSyntaxLargeFileMode;
-	private JRadioButton fullSyntaxLargeFileMode;
+	private String[] modeNames;
 	//}}}
 
 	//{{{ saveMode() method
@@ -287,7 +259,7 @@ public class EditingOptionPane extends AbstractOptionPane
 	//{{{ selectMode() method
 	private void selectMode()
 	{
-		int index = mode.getSelectedIndex();
+		int index = mode.getSelectedIndex() < 0 ? 0 : mode.getSelectedIndex();
 		current = index == 0 ? global : modeProps[index - 1];
 		current.edited = true;
 		current.load();
@@ -312,6 +284,8 @@ public class EditingOptionPane extends AbstractOptionPane
 		elasticTabstops.setSelected(current.elasticTabstops);
 		autoIndent.setSelectedItem(current.autoIndent);
 		deepIndent.setSelected(current.deepIndent);
+		deleteMode.setEnabled(current.isUserMode);
+		deleteMode.setVisible(current.isUserMode);
 
 		updateEnabled();
 		revalidate();
@@ -370,6 +344,64 @@ public class EditingOptionPane extends AbstractOptionPane
 					useDefaults.isSelected();
 				updateEnabled();
 			}
+			else if (source == deleteMode)
+			{
+				int answer = JOptionPane.showConfirmDialog(EditingOptionPane.this, jEdit.getProperty("options.editing.deleteMode.dialog.message"), jEdit.getProperty("options.editing.deleteMode.dialog.title"), JOptionPane.YES_NO_OPTION);
+				if (JOptionPane.YES_OPTION == answer && current.mode != null)
+				{
+					String modeName = current.mode.getName();
+					try
+					{
+						ModeProvider.instance.removeMode(modeName);
+					}
+					catch (IOException e)
+					{
+						Mode mode = ModeProvider.instance.getMode(modeName);
+						JOptionPane.showMessageDialog(jEdit.getActiveView(),
+								jEdit.getProperty("options.editing.deleteMode.dialog.message1") + ' ' + mode.getProperty("file") +
+										'\n' + jEdit.getProperty("options.editing.deleteMode.dialog.message2") + ' ' + EditingOptionPane.this.mode.getName());
+					}
+					mode.removeItem(modeName);
+				}
+			}
+			else if (source == addMode)
+			{
+				AddModeDialog dialog = new AddModeDialog(jEdit.getActiveView());
+				if (dialog.isCanceled())
+					return;
+				String modeName = dialog.getModeName();
+				boolean exists = jEdit.getMode(modeName) != null;
+				if (exists)
+				{
+					int answer = JOptionPane.showConfirmDialog(EditingOptionPane.this, jEdit.getProperty("options.editing.addMode.dialog.warning.message"), jEdit.getProperty("options.editing.addMode.dialog.warning.title") + " " + modeName, JOptionPane.YES_NO_OPTION);
+					if (JOptionPane.YES_OPTION != answer)
+						return;
+				}
+				
+				// create mode and set properties from dialog values
+				Mode newMode = new Mode(modeName);
+				String modeFile = dialog.getModeFile();
+				newMode.setProperty("file", modeFile);
+				newMode.setProperty("filenameGlob", dialog.getFilenameGlob());
+				newMode.setProperty("firstlineGlob", dialog.getFirstLineGlob());
+
+				File file = new File(modeFile);
+				Path target = FileSystems.getDefault().getPath(jEdit.getSettingsDirectory(), "modes", file.getName());
+				try
+				{
+					ModeProvider.instance.addUserMode(newMode, target);
+				}
+				catch (IOException e)
+				{
+					JOptionPane.showMessageDialog(jEdit.getActiveView(), jEdit.getProperty("options.editing.addMode.dialog.warning.message1") + " " + modeFile + "\n--> " + target);
+				}
+
+				// refresh the mode dropdown so the new mode is in the list
+				jEdit.reloadModes();
+				reloadModes();
+				mode.setModel(new DefaultComboBoxModel(modeNames));
+				mode.setSelectedItem(modeName);
+			}
 		}
 	} //}}}
 
@@ -396,6 +428,7 @@ public class EditingOptionPane extends AbstractOptionPane
 		boolean elasticTabstops;
 		String autoIndent;
 		boolean deepIndent;
+		boolean isUserMode;
 		//}}}
 
 		//{{{ ModeProperties constructor
@@ -437,6 +470,7 @@ public class EditingOptionPane extends AbstractOptionPane
 				elasticTabstops = mode.getBooleanProperty("elasticTabstops");
 				autoIndent = mode.getProperty("autoIndent").toString();
 				deepIndent = mode.getBooleanProperty("deepIndent");
+				isUserMode = mode.isUserMode();
 			}
 			else
 			{
diff --git a/org/gjt/sp/jedit/options/GeneralOptionPane.java b/org/gjt/sp/jedit/options/GeneralOptionPane.java
index 4209dd8..e1819de 100644
--- a/org/gjt/sp/jedit/options/GeneralOptionPane.java
+++ b/org/gjt/sp/jedit/options/GeneralOptionPane.java
@@ -62,6 +62,7 @@ public class GeneralOptionPane extends AbstractOptionPane
 	private JSpinner hypersearchResultsWarning;
 	private JCheckBox saveCaret;
 	private JCheckBox sortRecent;
+	private JCheckBox hideOpen;
 	private JCheckBox persistentMarkers;
 	private JCheckBox restore;
 	private JCheckBox restoreRemote;
@@ -138,6 +139,12 @@ public class GeneralOptionPane extends AbstractOptionPane
 		sortRecent.setSelected(jEdit.getBooleanProperty("sortRecent"));
 		addComponent(sortRecent);
 
+		/* Hide open buffers recent file list */
+		hideOpen = new JCheckBox(jEdit.getProperty(
+				"options.general.hideOpen"));
+		hideOpen.setSelected(jEdit.getBooleanProperty("hideOpen", true));
+		addComponent(hideOpen);
+
 		/* Save caret positions */
 		saveCaret = new JCheckBox(jEdit.getProperty(
 				"options.general.saveCaret"));
@@ -246,6 +253,7 @@ public class GeneralOptionPane extends AbstractOptionPane
 		jEdit.setIntegerProperty("checkFileStatus", checkModStatusUpon.getSelectedIndex());
 		jEdit.setIntegerProperty("recentFiles", (Integer) recentFiles.getModel().getValue());
 		jEdit.setBooleanProperty("sortRecent",sortRecent.isSelected());
+		jEdit.setBooleanProperty("hideOpen", hideOpen.isSelected());
 		jEdit.setBooleanProperty("saveCaret",saveCaret.isSelected());
 		jEdit.setBooleanProperty("persistentMarkers",
 				persistentMarkers.isSelected());
diff --git a/org/gjt/sp/jedit/options/LargeFilesOptionPane.java b/org/gjt/sp/jedit/options/LargeFilesOptionPane.java
new file mode 100644
index 0000000..f8b770d
--- /dev/null
+++ b/org/gjt/sp/jedit/options/LargeFilesOptionPane.java
@@ -0,0 +1,117 @@
+/*
+ * EditingOptionPane.java - Mode-specific options panel
+ * :tabSize=4:indentSize=4:noTabs=false:
+ * :folding=explicit:collapseFolds=1:
+ *
+ * Copyright (C) 1998, 2002 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 org.gjt.sp.jedit.options;
+
+//{{{ Imports
+import javax.swing.*;
+
+import java.awt.event.*;
+
+import org.gjt.sp.jedit.*;
+//}}}
+
+/**
+ * The EditingOptionPane has been split up so the large files option pane is 
+ * now a separate pane.
+ * @author Slava Pestov
+ * @version $Id: EditingOptionPane.java 23381 2013-12-09 12:43:14Z kpouer $
+ */
+public class LargeFilesOptionPane extends AbstractOptionPane
+{
+	//{{{ EditingOptionPane constructor
+	public LargeFilesOptionPane()
+	{
+		super("large-files");
+	} //}}}
+
+	//{{{ _init() method
+	@Override
+	protected void _init()
+	{
+		//{{{ Large file mode
+		addSeparator(jEdit.getProperty("options.editing.largefilemode.title"));
+
+		addComponent(new JLabel(jEdit.getProperty("options.editing.largefilemode")));
+		addComponent(askLargeFileMode = new JRadioButton(jEdit.getProperty("options.editing.largefilemode.option.ask")));
+		addComponent(fullSyntaxLargeFileMode = new JRadioButton(jEdit.getProperty("options.editing.largefilemode.option.full")));
+		addComponent(limitedSyntaxLargeFileMode = new JRadioButton(jEdit.getProperty("options.editing.largefilemode.option.limited")));
+		addComponent(noHighlightLargeFileMode = new JRadioButton(jEdit.getProperty("options.editing.largefilemode.option.nohighlight")));
+		String option = jEdit.getProperty("largefilemode", "ask");
+		if ("full".equals(option))
+		{
+			fullSyntaxLargeFileMode.setSelected(true);
+		}
+		else if ("limited".equals(option))
+		{
+			limitedSyntaxLargeFileMode.setSelected(true);
+		}
+		else if ("nohighlight".equals(option))
+		{
+			noHighlightLargeFileMode.setSelected(true);
+		}
+		else
+		{
+			askLargeFileMode.setSelected(true);
+		}
+		ButtonGroup largeFileModeButtonGroup = new ButtonGroup();
+		largeFileModeButtonGroup.add(askLargeFileMode);
+		largeFileModeButtonGroup.add(fullSyntaxLargeFileMode);
+		largeFileModeButtonGroup.add(limitedSyntaxLargeFileMode);
+		largeFileModeButtonGroup.add(noHighlightLargeFileMode);
+		//}}}
+	} //}}}
+
+	//{{{ _save() method
+	@Override
+	protected void _save()
+	{
+		if (fullSyntaxLargeFileMode.isSelected())
+		{
+			jEdit.setProperty("largefilemode", "full");
+		}
+		else if (limitedSyntaxLargeFileMode.isSelected())
+		{
+			jEdit.setProperty("largefilemode", "limited");
+		}
+		else if (noHighlightLargeFileMode.isSelected())
+		{
+			jEdit.setProperty("largefilemode", "nohighlight");
+		}
+		else
+		{
+			jEdit.setProperty("largefilemode", "ask");
+		}
+	} //}}}
+
+	//{{{ Private members
+
+	//{{{ Instance variables
+	private JRadioButton askLargeFileMode;
+	private JRadioButton noHighlightLargeFileMode;
+	private JRadioButton limitedSyntaxLargeFileMode;
+	private JRadioButton fullSyntaxLargeFileMode;
+	//}}}
+
+	//}}}
+
+}
diff --git a/org/gjt/sp/jedit/options/ShortcutsOptionPane.java b/org/gjt/sp/jedit/options/ShortcutsOptionPane.java
index 53bc7f7..3eb6efe 100644
--- a/org/gjt/sp/jedit/options/ShortcutsOptionPane.java
+++ b/org/gjt/sp/jedit/options/ShortcutsOptionPane.java
@@ -49,7 +49,7 @@ import java.util.List;
 /**
  * Key binding editor.
  * @author Slava Pestov
- * @version $Id: ShortcutsOptionPane.java 23224 2013-09-30 20:51:42Z shlomy $
+ * @version $Id: ShortcutsOptionPane.java 23920 2015-05-22 08:03:45Z ezust $
  */
 @SuppressWarnings("serial")
 public class ShortcutsOptionPane extends AbstractOptionPane
@@ -153,6 +153,7 @@ public class ShortcutsOptionPane extends AbstractOptionPane
 
 		keyTable = new JTable(filteredModel);
 		filteredModel.setTable(keyTable);
+		keyTable.setRowHeight(GUIUtilities.defaultRowHeight());
 		keyTable.getTableHeader().setReorderingAllowed(false);
 		keyTable.getTableHeader().addMouseListener(new HeaderMouseHandler());
 		keyTable.addMouseListener(new TableMouseHandler());
diff --git a/org/gjt/sp/jedit/options/SyntaxHiliteOptionPane.java b/org/gjt/sp/jedit/options/SyntaxHiliteOptionPane.java
index 77b8136..f032632 100644
--- a/org/gjt/sp/jedit/options/SyntaxHiliteOptionPane.java
+++ b/org/gjt/sp/jedit/options/SyntaxHiliteOptionPane.java
@@ -42,7 +42,7 @@ import org.gjt.sp.util.StandardUtilities;
 /**
  * Style option pane.
  * @author Slava Pestov
- * @version $Id: SyntaxHiliteOptionPane.java 23222 2013-09-29 20:43:34Z shlomy $
+ * @version $Id: SyntaxHiliteOptionPane.java 23921 2015-05-22 08:07:41Z ezust $
  */
 public class SyntaxHiliteOptionPane extends AbstractOptionPane
 {
@@ -84,6 +84,7 @@ public class SyntaxHiliteOptionPane extends AbstractOptionPane
 	{
 		styleModel = createStyleTableModel();
 		styleTable = new JTable(styleModel);
+		styleTable.setRowHeight(GUIUtilities.defaultRowHeight());
 		styleTable.setRowSelectionAllowed(false);
 		styleTable.setColumnSelectionAllowed(false);
 		styleTable.setCellSelectionEnabled(false);
@@ -227,10 +228,11 @@ public class SyntaxHiliteOptionPane extends AbstractOptionPane
 		//{{{ addStyleChoice() method
 		private void addStyleChoice(String label, String property)
 		{
+			Font font = new JLabel().getFont();
 			styleChoices.add(new StyleChoice(label,
 			                                 property,
 			                                 GUIUtilities.parseStyle(jEdit.getProperty(property),
-			                                                         "Dialog",12)));
+			                                                         font.getFamily(), font.getSize())));
 		} //}}}
 
 		//{{{ StyleChoice class
diff --git a/org/gjt/sp/jedit/options/ViewOptionPane.java b/org/gjt/sp/jedit/options/ViewOptionPane.java
index fb43b29..3999606 100644
--- a/org/gjt/sp/jedit/options/ViewOptionPane.java
+++ b/org/gjt/sp/jedit/options/ViewOptionPane.java
@@ -124,6 +124,7 @@ public class ViewOptionPane extends AbstractOptionPane
 		addComponent(beepOnSearchAutoWrap);
 
 		/* Show buffer switcher */
+		addSeparator();
 		showBufferSwitcher = new JCheckBox(jEdit.getProperty(
 			"options.view.showBufferSwitcher"));
 
@@ -132,6 +133,26 @@ public class ViewOptionPane extends AbstractOptionPane
 		addComponent(showBufferSwitcher);
 		showBufferSwitcher.addActionListener(actionHandler);
 
+		/* Sort buffer switcher */
+		sortBufferSwitcher = new JCheckBox(jEdit.getProperty(
+			"options.view.bufferswitcher.sortBuffers"));
+		sortBufferSwitcher.setSelected(jEdit.getBooleanProperty("bufferswitcher.sortBuffers", true));
+		sortBufferSwitcher.addActionListener(new ActionListener()
+		{
+			public void actionPerformed(ActionEvent evt)
+			{
+				sortBufferSwitcherByName.setEnabled(sortBufferSwitcher.isSelected());
+			}
+		});
+
+		addComponent(sortBufferSwitcher);
+
+		/* Sort buffer switcher by names */
+		sortBufferSwitcherByName = new JCheckBox(jEdit.getProperty(
+			"options.view.bufferswitcher.sortByName"));
+		sortBufferSwitcherByName.setSelected(jEdit.getBooleanProperty("bufferswitcher.sortByName", true));
+		sortBufferSwitcherByName.setEnabled(sortBufferSwitcher.isSelected());
+		addComponent(sortBufferSwitcherByName);
 
 		/* Buffer switcher max row count */
 		bufferSwitcherMaxRowCount = new JTextField(jEdit.getProperty("bufferSwitcher.maxRowCount"));
@@ -139,6 +160,8 @@ public class ViewOptionPane extends AbstractOptionPane
 			bufferSwitcherMaxRowCount);
 		bufferSwitcherMaxRowCount.setEditable(showBufferSwitcher.isSelected());
 
+		// Buffer set settings
+		addSeparator();
 		buffersetScope = new JComboBox();
 		buffersetScope.addItem(BufferSet.Scope.global);
 		buffersetScope.addItem(BufferSet.Scope.view);
@@ -164,7 +187,19 @@ public class ViewOptionPane extends AbstractOptionPane
 		{
 			public void actionPerformed(ActionEvent evt)
 			{
-				sortByName.setEnabled(sortBuffers.isSelected());
+				if (sortBuffers.isSelected())
+				{
+					sortByName.setEnabled(true);
+					sortBufferSwitcher.setEnabled(false);
+					sortBufferSwitcher.setSelected(true);
+					sortBufferSwitcherByName.setEnabled(false);
+				}
+				else
+				{
+					sortByName.setEnabled(false);
+					sortBufferSwitcher.setEnabled(true);
+					sortBufferSwitcherByName.setEnabled(true);
+				}
 			}
 		});
 
@@ -177,6 +212,7 @@ public class ViewOptionPane extends AbstractOptionPane
 		sortByName.setEnabled(sortBuffers.isSelected());
 		addComponent(sortByName);
 
+		addSeparator();
 		fullScreenIncludesMenu = new JCheckBox(jEdit.getProperty(
 			"options.view.fullScreenIncludesMenu"));
 		fullScreenIncludesMenu.setSelected(
@@ -217,6 +253,8 @@ public class ViewOptionPane extends AbstractOptionPane
 			.isSelected());
 		jEdit.setBooleanProperty("view.showBufferSwitcher",
 			showBufferSwitcher.isSelected());
+		jEdit.setBooleanProperty("bufferswitcher.sortBuffers", sortBufferSwitcher.isSelected());
+		jEdit.setBooleanProperty("bufferswitcher.sortByName", sortBufferSwitcherByName.isSelected());
 		jEdit.setProperty("bufferSwitcher.maxRowCount",
 			bufferSwitcherMaxRowCount.getText());
 		jEdit.setProperty("bufferset.scope", buffersetScope.getSelectedItem().toString());
@@ -245,6 +283,8 @@ public class ViewOptionPane extends AbstractOptionPane
 	private JCheckBox fullScreenIncludesMenu;
 	private JCheckBox fullScreenIncludesToolbar;
 	private JCheckBox fullScreenIncludesStatus;
+	private JCheckBox sortBufferSwitcher;
+	private JCheckBox sortBufferSwitcherByName;
 
 	//}}}
 
diff --git a/org/gjt/sp/jedit/package.html b/org/gjt/sp/jedit/package.html
index 240b3e9..d22949f 100644
--- a/org/gjt/sp/jedit/package.html
+++ b/org/gjt/sp/jedit/package.html
@@ -1,4 +1,6 @@
-<html><body>This package contains jEdit's core classes.<p>
+<html><body>This package contains jEdit 4's core classes.<p>
+<p> jEdit 5 and newer classes belong in the <tt>org.jedit</tt> package. </p>
+
 
 For plugin development, start by looking at
 <a href="PluginJAR.html">PluginJAR</a> and
diff --git a/org/gjt/sp/jedit/pluginmgr/InstallPanel.java b/org/gjt/sp/jedit/pluginmgr/InstallPanel.java
index 5586016..6ff8742 100644
--- a/org/gjt/sp/jedit/pluginmgr/InstallPanel.java
+++ b/org/gjt/sp/jedit/pluginmgr/InstallPanel.java
@@ -32,7 +32,6 @@ import org.gjt.sp.jedit.io.VFSManager;
 import org.gjt.sp.util.Log;
 import org.gjt.sp.util.StandardUtilities;
 import org.gjt.sp.util.StringList;
-import org.gjt.sp.util.ThreadUtilities;
 import org.gjt.sp.util.XMLUtilities;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -63,7 +62,7 @@ import java.util.List;
 //}}}
 
 /**
- * @version $Id: InstallPanel.java 23324 2013-11-08 19:10:58Z kerik-sf $
+ * @version $Id: InstallPanel.java 24084 2015-09-17 18:44:47Z kerik-sf $
  */
 class InstallPanel extends JPanel implements EBComponent
 {
@@ -77,6 +76,9 @@ class InstallPanel extends JPanel implements EBComponent
 	private final ChoosePluginSet chooseButton;
 	private final boolean updates;
 	private final CardLayout layout;
+	private final JTextField searchField;
+	private boolean hideInstalled;
+	private boolean isLoading;
 
 	private final Collection<String> pluginSet = new HashSet<String>();
 	//}}}
@@ -98,7 +100,7 @@ class InstallPanel extends JPanel implements EBComponent
 		table = new JTable(pluginModel = new PluginTableModel());
 		table.setShowGrid(false);
 		table.setIntercellSpacing(new Dimension(0,0));
-		table.setRowHeight(table.getRowHeight() + 2);
+		table.setRowHeight(GUIUtilities.defaultRowHeight() + 2);
 		table.setPreferredScrollableViewportSize(new Dimension(500,200));
 		table.setDefaultRenderer(Object.class, new TextRenderer(
 			(DefaultTableCellRenderer)table.getDefaultRenderer(Object.class)));
@@ -155,7 +157,7 @@ class InstallPanel extends JPanel implements EBComponent
 			}
 		});
 
-		final JTextField searchField = new JTextField();
+		searchField = new JTextField();
 		searchField.addKeyListener(new KeyAdapter()
 		{
 			@Override
@@ -199,17 +201,48 @@ class InstallPanel extends JPanel implements EBComponent
 			public void keyPressed(KeyEvent e)
 			{
 				int i = table.getSelectedRow(), n = table.getModel().getRowCount();
-				if (e.getKeyCode() == KeyEvent.VK_DOWN && i == (n - 1) ||
+				if (e.getKeyChar() == '/' ||
+					e.getKeyCode() == KeyEvent.VK_DOWN && i == (n - 1) ||
 					e.getKeyCode() == KeyEvent.VK_UP && i == 0) 
 				{
 					searchField.requestFocus();
 					searchField.selectAll();
 				}
 			}
+			@Override
+			public void keyTyped(KeyEvent e)
+			{
+				char c = e.getKeyChar();
+				if(c != KeyEvent.CHAR_UNDEFINED && Character.isAlphabetic(c))
+				{
+					searchField.dispatchEvent(e);
+					searchField.requestFocus();
+				}
+			}
 		});
+		hideInstalled = !updates;
+		final JCheckBox hideInstalledCB = new JCheckBox("Hide installed plugins", hideInstalled);
+		hideInstalledCB.addActionListener(new ActionListener()
+		{
+
+			@Override
+			public void actionPerformed(ActionEvent e)
+			{
+				InstallPanel.this.hideInstalled = hideInstalledCB.isSelected();
+				updateModel();
+			}
+		});
+		hideInstalledCB.setAlignmentX(0);
+
 		Box filterBox = Box.createHorizontalBox();
 		filterBox.add(new JLabel("Filter : "));
 		filterBox.add(searchField);
+		filterBox.setAlignmentX(0);
+		Box topBox = new Box(BoxLayout.PAGE_AXIS);
+		topBox.add(filterBox);
+		if(!updates){
+			topBox.add(hideInstalledCB);
+		}
 
 		/* Create buttons */
 		Box buttons = new Box(BoxLayout.X_AXIS);
@@ -223,7 +256,7 @@ class InstallPanel extends JPanel implements EBComponent
 		buttons.add(new SizeLabel());
 
 		JPanel _installPanel = new JPanel(new BorderLayout(12, 12));
-		_installPanel.add(BorderLayout.NORTH,filterBox);
+		_installPanel.add(BorderLayout.NORTH,topBox);
 		_installPanel.add(BorderLayout.CENTER,split);
 		_installPanel.add(BorderLayout.SOUTH, buttons);
 
@@ -263,7 +296,7 @@ class InstallPanel extends JPanel implements EBComponent
 	boolean loadPluginSet(String path)
 	{
 		pluginSet.clear();
-		pluginModel.restoreSelection(new HashSet<String>(), new HashSet<String>());
+		pluginModel.clearSelection();
 
 		VFS vfs = VFSManager.getVFSForPath(path);
 		Object session = vfs.createVFSSession(path, InstallPanel.this);
@@ -282,33 +315,32 @@ class InstallPanel extends JPanel implements EBComponent
 	} //}}}
 
 	//{{{ updateModel() method
+	/**
+	 * Must be called from the EDT.
+	 **/
 	public void updateModel()
 	{
-		final Set<String> savedChecked = new HashSet<String>();
-		final Set<String> savedSelection = new HashSet<String>();
-		pluginModel.saveSelection(savedChecked, savedSelection);
-		pluginModel.clear();
-		infoBox.setText(jEdit.getProperty("plugin-manager.list-download"));
-
-		ThreadUtilities.runInDispatchThread(new Runnable()
+		infoBox.setText(null);
+		pluginModel.update();
+		if (pluginModel.getRowCount() == 0)
 		{
-			@Override
-			public void run()
+			if (updates)
+				layout.show(InstallPanel.this, "PLUGIN_ARE_UP_TO_DATE");
+			else
+				layout.show(InstallPanel.this, "NO_PLUGIN_AVAILABLE");
+		}
+		else
+		{
+			layout.show(InstallPanel.this, "INSTALL");
+			EventQueue.invokeLater(new Runnable()
 			{
-				infoBox.setText(null);
-				pluginModel.update();
-				pluginModel.restoreSelection(savedChecked, savedSelection);
-				if (pluginModel.getRowCount() == 0)
+				public void run()
 				{
-					if (updates)
-						layout.show(InstallPanel.this, "PLUGIN_ARE_UP_TO_DATE");
-					else
-						layout.show(InstallPanel.this, "NO_PLUGIN_AVAILABLE");
+					searchField.requestFocusInWindow();
 				}
-				else
-					layout.show(InstallPanel.this, "INSTALL");
-			}
-		});
+			});
+		}
+		isLoading = false;
 	} //}}}
 
 	//{{{ handleMessage() method
@@ -321,7 +353,7 @@ class InstallPanel extends JPanel implements EBComponent
 			 if (chooseButton.path.length() > 0)
 			 {
 				 loadPluginSet(chooseButton.path);
-				 pluginModel.restoreSelection(new HashSet<String>(), new HashSet<String>());
+				 pluginModel.clearSelection();
 				 chooseButton.updateUI();
 			 }
 		}
@@ -331,10 +363,18 @@ class InstallPanel extends JPanel implements EBComponent
 	void loading()
 	{
 		layout.show(this, "LOADING");
+		isLoading = true;
 	} //}}}
 
 	//{{{ Private members
 
+	//{{{ isDownloadingList() method
+	private boolean isDownloadingList()
+	{
+		return isLoading;
+	} //}}}
+
+
 	//{{{ formatSize() method
 	private static String formatSize(int size)
 	{
@@ -356,9 +396,8 @@ class InstallPanel extends JPanel implements EBComponent
 	//{{{ PluginTableModel class
 	private class PluginTableModel extends AbstractTableModel
 	{
-		/** This List can contain String or Entry. */
-		private final List entries = new ArrayList();
-		private final List filteredEntries = new ArrayList();
+		private final List<Entry> entries = new ArrayList<Entry>();
+		private final List<Entry> filteredEntries = new ArrayList<Entry>();
 		private int sortType = EntryCompare.COLUMN_NAME;
 		private String filterString;
 		int sortDirection = 1;
@@ -375,22 +414,37 @@ class InstallPanel extends JPanel implements EBComponent
 		{
 			filteredEntries.clear();
 			if (filterString == null)
-				filteredEntries.addAll(entries);
+			{
+				if(!hideInstalled)
+				{
+					filteredEntries.addAll(entries);
+				}
+				else
+				{
+					for(Entry e: entries)
+					{
+						if(e.install || e.installedVersion == null || updates)
+						{
+							filteredEntries.add(e);
+						}
+					}
+				}
+			}
 			else
 			{
 				String[] words = filterString.toLowerCase().split("\\s+");
-				for (Object o : entries)
+				for (Entry e : entries)
 				{
-					if (!(o instanceof Entry))
-						continue;
-					Entry e = (Entry)o;
-
 					if (e.install)
 					{
 						filteredEntries.add(e);
 						continue;
 					}
 
+					if(hideInstalled && e.installedVersion != null)
+					{
+						continue;
+					}
 					
 					String s = (e.name + ' ' + e.set + ' ' + e.description).toLowerCase();
 					boolean hasAll = true;
@@ -490,7 +544,7 @@ class InstallPanel extends JPanel implements EBComponent
 					case 2:
 						return entry.set;
 					case 3:
-						if (updates)
+						if (entry.installedVersion != null)
 							return entry.installedVersion + "->" + entry.version;
 						return entry.version;
 					case 4:
@@ -580,11 +634,8 @@ class InstallPanel extends JPanel implements EBComponent
 		{
 			if (column != 0) return;
 
-			Object obj = filteredEntries.get(row);
-			if(obj instanceof String)
-				return;
+			Entry entry = filteredEntries.get(row);
 
-			Entry entry = (Entry)obj;
 			boolean before = entry.install;
 			entry.install = Boolean.TRUE.equals(aValue);
 			if (before == entry.install) return;
@@ -608,13 +659,9 @@ class InstallPanel extends JPanel implements EBComponent
 			 * Removes dependencies no longer required and such */
 
 			List<Entry> selected = new ArrayList<Entry>(entries.size());
-			for(Object en: entries)
+			for(Entry temp: entries)
 			{
-				if(en instanceof Entry)
-				{
-					Entry temp = (Entry)en;
-					if(temp.install)selected.add(temp);
-				}
+				if(temp.install)selected.add(temp);
 			}
 
 			List<Entry> toRemove = new ArrayList<Entry>(selected.size());
@@ -661,9 +708,8 @@ class InstallPanel extends JPanel implements EBComponent
 			{
 				if ("plugin".equals(dep.what))
 				{
-					for (Object en: entries)
+					for (Entry temp: entries)
 					{
-						Entry temp = (Entry)en;
 						if (temp.plugin == dep.plugin)
 						{
 							if (entry.install)
@@ -671,7 +717,14 @@ class InstallPanel extends JPanel implements EBComponent
 								temp.dependents.add(entry);
 								if(!temp.install)
 								{
-									temp.install = true;
+									if(temp.installedVersion == null)
+									{
+										temp.install = true;
+									}
+									else if(!temp.plugin.loaded)
+									{
+										temp.install = true;
+									}
 									updateDeps(temp);
 								}
 							}
@@ -699,9 +752,6 @@ class InstallPanel extends JPanel implements EBComponent
 			}
 			sortType = type;
 
-			if(isDownloadingList())
-				return;
-
 			Collections.sort(entries,new EntryCompare(type, sortDirection));
 			updateFilteredEntries();
 			restoreSelection(savedChecked,savedSelection);
@@ -709,19 +759,6 @@ class InstallPanel extends JPanel implements EBComponent
 		}
 		//}}}
 
-		//{{{ isDownloadingList() method
-		private boolean isDownloadingList()
-		{
-			return entries.size() == 1 && entries.get(0) instanceof String;
-		} //}}}
-
-		//{{{ clear() method
-		public void clear()
-		{
-			entries.clear();
-			updateFilteredEntries();
-		} //}}}
-
 		//{{{ update() method
 		public void update()
 		{
@@ -756,14 +793,13 @@ class InstallPanel extends JPanel implements EBComponent
 					}
 					else
 					{
-						if(installedVersion == null && plugin.canBeInstalled())
+						if(plugin.canBeInstalled())
 							entries.add(new Entry(plugin,set.name));
 					}
 				}
 			}
 
 			sort(sortType);
-			updateFilteredEntries();
 			restoreSelection(savedChecked, savedSelection);
 		} //}}}
 
@@ -786,6 +822,12 @@ class InstallPanel extends JPanel implements EBComponent
 			}
 		} //}}}
 
+		//{{{ clearSelection() method
+		public void clearSelection()
+		{
+			restoreSelection(Collections.<String>emptySet(), Collections.<String>emptySet());
+		} //}}}
+
 		//{{{ restoreSelection() method
 		public void restoreSelection(Set<String> savedChecked, Set<String> savedSelection)
 		{
@@ -908,7 +950,7 @@ class InstallPanel extends JPanel implements EBComponent
 
 	//{{{ PluginInfoBox class
 	/**
-	 * @TODO refactor to use the PluginDetailPanel?
+	 * TODO: refactor to use the PluginDetailPanel?
 	 */
 	private class PluginInfoBox extends JEditorPane implements ListSelectionListener
 	{
@@ -949,7 +991,7 @@ class InstallPanel extends JPanel implements EBComponent
 					params.add(sl.join(", "));
 					// params.add(entry.dependencies.replaceAll("\n", ", "));
 				}
-				text = MessageFormat.format(pattern, params.toArray(new String[0]));
+				text = MessageFormat.format(pattern, params.toArray());
 			}
 			setText(text);
 			setCaretPosition(0);
@@ -973,7 +1015,7 @@ class InstallPanel extends JPanel implements EBComponent
 		{
 			if (e.getType() == TableModelEvent.UPDATE)
 			{
-				if(pluginModel.isDownloadingList())
+				if(isDownloadingList())
 					return;
 
 				size = 0;
@@ -1020,7 +1062,7 @@ class InstallPanel extends JPanel implements EBComponent
 		@Override
 		public void tableChanged(TableModelEvent e)
 		{
-			if(pluginModel.isDownloadingList())
+			if(isDownloadingList())
 				return;
 
 			setEnabled(pluginModel.getRowCount() != 0);
@@ -1118,7 +1160,7 @@ class InstallPanel extends JPanel implements EBComponent
 		public void actionPerformed(ActionEvent e)
 		{
 			pluginSet.clear();
-			pluginModel.restoreSelection(new HashSet<String>(), new HashSet<String>());
+			pluginModel.clearSelection();
 			jEdit.unsetProperty(PluginManager.PROPERTY_PLUGINSET);
 			chooseButton.updateUI();
 		} //}}}
@@ -1138,7 +1180,7 @@ class InstallPanel extends JPanel implements EBComponent
 		@Override
 		public void actionPerformed(ActionEvent evt)
 		{
-			if(pluginModel.isDownloadingList())
+			if(isDownloadingList())
 				return;
 
 			boolean downloadSource = jEdit.getBooleanProperty(
@@ -1165,7 +1207,7 @@ class InstallPanel extends JPanel implements EBComponent
 				Entry entry = (Entry)pluginModel.entries.get(i);
 				if (entry.install)
 				{
-					entry.plugin.install(roster,installDirectory,downloadSource);
+					entry.plugin.install(roster,installDirectory,downloadSource, !entry.checked);
 					if (updates)
 						entry.plugin.getCompatibleBranch().satisfyDependencies(
 						roster,installDirectory,downloadSource);
@@ -1197,7 +1239,7 @@ class InstallPanel extends JPanel implements EBComponent
 		@Override
 		public void tableChanged(TableModelEvent e)
 		{
-			if(pluginModel.isDownloadingList())
+			if(isDownloadingList())
 				return;
 
 			if (e.getType() == TableModelEvent.UPDATE)
@@ -1256,26 +1298,7 @@ class InstallPanel extends JPanel implements EBComponent
 					}
 					break;
 				case COLUMN_VERSION:
-					// lets avoid NPE. Maybe we should move
-					// this code to StandardUtilities.compareStrings
-					if (e1.version == e2.version)
-					{
-						result = 0;
-					}
-					else if (e1.version == null)
-					{
-						result = -1;
-					}
-					else if(e2.version == null)
-					{
-						result = 1;
-					}
-					else
-					{
-						result = StandardUtilities.compareStrings(e1.version,
-											  e2.version,
-											  true);
-					}
+					result = StandardUtilities.compareStrings(e1.version, e2.version, true);
 					break;
 				case COLUMN_SIZE:
 					result = (e1.size < e2.size)
@@ -1414,7 +1437,6 @@ class InstallPanel extends JPanel implements EBComponent
 				? (model.sortDirection == 1) ? ASC_ICON : DESC_ICON
 				: null;
 			l.setIcon(icon);
-			// l.setHorizontalTextPosition(l.LEADING);
 			return l;
 		}
 	} //}}}
diff --git a/org/gjt/sp/jedit/pluginmgr/ManagePanel.java b/org/gjt/sp/jedit/pluginmgr/ManagePanel.java
index e85e450..40792da 100644
--- a/org/gjt/sp/jedit/pluginmgr/ManagePanel.java
+++ b/org/gjt/sp/jedit/pluginmgr/ManagePanel.java
@@ -109,7 +109,7 @@ public class ManagePanel extends JPanel
 		table = new JTable(pluginModel = new PluginTableModel());
 		table.setShowGrid(false);
 		table.setIntercellSpacing(new Dimension(0,0));
-		table.setRowHeight(table.getRowHeight() + 2);
+		table.setRowHeight(GUIUtilities.defaultRowHeight() + 2);
 		table.setPreferredScrollableViewportSize(new Dimension(500,300));
 		table.setDefaultRenderer(Object.class, new TextRenderer(
 			(DefaultTableCellRenderer)table.getDefaultRenderer(Object.class)));
@@ -142,6 +142,8 @@ public class ManagePanel extends JPanel
 
 		JTableHeader header = table.getTableHeader();
 		header.setReorderingAllowed(false);
+		header.setDefaultRenderer(new HeaderRenderer(
+				(DefaultTableCellRenderer)header.getDefaultRenderer()));
 		HeaderMouseHandler mouseHandler = new HeaderMouseHandler();
 		header.addMouseListener(mouseHandler);
 		table.addMouseListener(mouseHandler);
@@ -253,37 +255,17 @@ public class ManagePanel extends JPanel
 	 * If the plugin is loaded use {@link org.gjt.sp.jedit.PluginJAR#getRequiredJars()}
 	 * instead
 	 *
-	 * @param jarName the jar name of the plugin
+	 * @param jarPath the path to the jar of the plugin
 	 * @return a collection containing jars path
 	 * @throws IOException if jEdit cannot generate cache
 	 * @since jEdit 4.3pre12
 	 */
-	private static Collection<String> getDeclaredJars(String jarName) throws IOException
+	private static Collection<String> getDeclaredJars(String jarPath) throws IOException
 	{
 		Collection<String> jarList = new ArrayList<String>();
-		PluginJAR pluginJAR = new PluginJAR(new File(jarName));
-		PluginJAR.PluginCacheEntry pluginCacheEntry = PluginJAR.getPluginCache(pluginJAR);
-		if (pluginCacheEntry == null)
-		{
-			try
-			{
-				pluginCacheEntry = pluginJAR.generateCache();
-			}
-			finally
-			{
-				IOUtilities.closeQuietly(pluginJAR.getZipFile());
-			}
-		}
-		if(pluginCacheEntry == null)
-		{
-			// this happens when, for some reason, two versions
-			// of a plugin are installed, e.g when XSLT.jar and
-			// xslt.jar are both in $JEDIT_HOME/jars on Linux.
-			Log.log(Log.WARNING, ManagePanel.class,
-					"couldn't load plugin "+pluginJAR.getPath()
-					+" (most likely other version exists)");
-		}
-		else
+		PluginJAR pluginJAR = new PluginJAR(new File(jarPath));
+		PluginJAR.PluginCacheEntry pluginCacheEntry = PluginJAR.getPluginCacheEntry(jarPath);
+		if(pluginCacheEntry != null)
 		{
 			Properties cachedProperties = pluginCacheEntry.cachedProperties;
 
@@ -291,17 +273,15 @@ public class ManagePanel extends JPanel
 
 			if (jars != null)
 			{
-				String dir = MiscUtilities.getParentOfPath(pluginJAR.getPath());
-				StringTokenizer st = new StringTokenizer(jars);
-				while (st.hasMoreTokens())
+				Collection<String> jarsPaths = PluginJAR.parseJarsFilesString(pluginJAR.getPath(), jars);
+				for(String _jarPath: jarsPaths)
 				{
-					String _jarPath = MiscUtilities.constructPath(dir, st.nextToken());
 					if (new File(_jarPath).exists())
 						jarList.add(_jarPath);
 				}
 			}
 		}
-		jarList.add(jarName);
+		jarList.add(jarPath);
 		return jarList;
 	}//}}}
 
@@ -351,6 +331,26 @@ public class ManagePanel extends JPanel
 			if (jEdit.getBooleanProperty("plugin." + MiscUtilities.getFileName(jar) + ".disabled"))
 				status = DISABLED;
 			else status = NOT_LOADED;
+
+			PluginJAR.PluginCacheEntry cacheEntry;
+			try
+			{
+				cacheEntry = PluginJAR.getPluginCacheEntry(jar);
+				if(cacheEntry != null)
+				{
+					clazz = cacheEntry.pluginClass;
+					Properties props = cacheEntry.cachedProperties;
+					name = props.getProperty("plugin."+clazz+".name");
+					version = props.getProperty("plugin."+clazz+".version");
+					author = props.getProperty("plugin."+clazz+".author");
+					docs = props.getProperty("plugin."+clazz+".docs");
+					description = props.getProperty("plugin."+clazz+".description");
+				}
+			}
+			catch (IOException e)
+			{
+				Log.log(Log.WARNING, "Unable to load cache for "+jar, e);
+			}
 		}
 
 		/**
@@ -375,32 +375,8 @@ public class ManagePanel extends JPanel
 				author = jEdit.getProperty("plugin."+clazz+".author");
 				docs = jEdit.getProperty("plugin."+clazz+".docs");
 				description = jEdit.getProperty("plugin."+clazz+".description");
-				String jarsProp = jEdit.getProperty("plugin."+clazz+".jars");
-				if(jarsProp != null)
-				{
-					String directory = MiscUtilities.getParentOfPath(this.jar);
-
-					StringTokenizer st = new StringTokenizer(jarsProp);
-					while(st.hasMoreElements())
-					{
-						jars.add(MiscUtilities.constructPath(
-							directory,st.nextToken()));
-					}
-				}
-
-				String filesProp = jEdit.getProperty("plugin."+clazz+".files");
-
-				if(filesProp != null)
-				{
-					String directory = MiscUtilities.getParentOfPath(this.jar);
-
-					StringTokenizer st = new StringTokenizer(filesProp);
-					while(st.hasMoreElements())
-					{
-						jars.add(MiscUtilities.constructPath(
-							directory,st.nextToken()));
-					}
-				}
+				jars.addAll(jar.getJars());
+				jars.addAll(jar.getFiles());
 			}
 			else
 			{
@@ -440,6 +416,7 @@ public class ManagePanel extends JPanel
 		private int sortType = EntryCompare.NAME;
 		private ConcurrentHashMap<String, Object> unloaded;
 		// private HashSet<String> unloaded;
+		private int sortDirection = 1;
 
 		//{{{ Constructor
 		PluginTableModel()
@@ -575,41 +552,41 @@ public class ManagePanel extends JPanel
 
 		//{{{ setValueAt() method
 		@Override
-		public void setValueAt(Object value, int rowIndex,
-			int columnIndex)
+		public void setValueAt(final Object value, int rowIndex,
+			final int columnIndex)
 		{
-			Entry entry = entries.get(rowIndex);
-			if(columnIndex == 0)
+			final Entry entry = entries.get(rowIndex);
+			SwingUtilities.invokeLater(new Runnable()
 			{
-				PluginJAR jar = jEdit.getPluginJAR(entry.jar);
-				if(jar == null)
+				@Override
+				public void run()
 				{
-					if(value.equals(Boolean.FALSE))
-						return;
-
-					PluginJAR load = PluginJAR.load(entry.jar, true);
-					if (load == null)
+					if(columnIndex == 0)
 					{
-						GUIUtilities.error(ManagePanel.this, "plugin-load-error", null);
-					}
-				}
-				else
-				{
-					if(value.equals(Boolean.TRUE)) 
-						return;
+						PluginJAR jar = jEdit.getPluginJAR(entry.jar);
+						if(jar == null)
+						{
+							if(value.equals(Boolean.FALSE))
+								return;
 
-					unloadPluginJARWithDialog(jar);
-				}
-			}
+							PluginJAR load = PluginJAR.load(entry.jar, true);
+							if (load == null)
+							{
+								GUIUtilities.error(ManagePanel.this, "plugin-load-error", null);
+							}
+						}
+						else
+						{
+							if(value.equals(Boolean.TRUE))
+								return;
 
-			update();
-		} //}}}
+							unloadPluginJARWithDialog(jar);
+						}
+					}
 
-		//{{{ setSortType() method
-		public void setSortType(int type)
-		{
-			sortType = type;
-			sort(type);
+					update();
+				}
+			});
 		} //}}}
 
 		//{{{ sort() method
@@ -617,9 +594,17 @@ public class ManagePanel extends JPanel
 		{
 			List<String> savedSelection = new ArrayList<String>();
 			saveSelection(savedSelection);
-			Collections.sort(entries,new EntryCompare(type));
+
+			if (sortType != type)
+			{
+				sortDirection = 1;
+			}
+			sortType = type;
+
+			Collections.sort(entries, new EntryCompare(type, sortDirection));
 			fireTableChanged(new TableModelEvent(this));
 			restoreSelection(savedSelection);
+			table.getTableHeader().repaint();
 		}
 		//}}}
 
@@ -1004,13 +989,19 @@ public class ManagePanel extends JPanel
 
 			for (String jar : jarsToRemove)
 			{
-				listModel.add(jar);
-				roster.addRemove(jar);
+				if(new File(jar).exists())
+				{
+					listModel.add(jar);
+					roster.addRemove(jar);
+				}
 			}
 
+			Object[] sortedConfirm = listModel.toArray();
+			Arrays.sort(sortedConfirm);
+
 			int button = GUIUtilities.listConfirm(window,
 				"plugin-manager.remove-confirm",
-				null,listModel.toArray());
+				null, sortedConfirm);
 			if(button == JOptionPane.YES_OPTION)
 			{
 
@@ -1125,11 +1116,7 @@ public class ManagePanel extends JPanel
 
 					if (jars != null)
 					{
-						StringTokenizer st = new StringTokenizer(jars);
-						while (st.hasMoreTokens())
-						{
-							neededJars.add(st.nextToken());
-						}
+						neededJars.addAll(PluginJAR.parseJarsFilesStringNames(jars));
 					}
 				}
 				catch (IOException e1)
@@ -1240,27 +1227,41 @@ public class ManagePanel extends JPanel
 	private static class EntryCompare implements Comparator<Entry>
 	{
 		public static final int NAME = 1;
-		public static final int STATUS = 2;
+		public static final int VERSION = 2;
+		public static final int STATUS = 3;
+		public static final int DATA = 4;
 
 		private final int type;
+		private final int direction;
 
-		EntryCompare(int type)
+		EntryCompare(int type, int direction)
 		{
 			this.type = type;
+			this.direction = direction;
 		}
 
 		@Override
 		public int compare(Entry e1, Entry e2)
 		{
-			if (type == NAME)
-				return compareNames(e1,e2);
-			else
+			int result;
+			switch(type)
 			{
-				int result;
-				if ((result = e1.status.compareToIgnoreCase(e2.status)) == 0)
-					return compareNames(e1,e2);
-				return result;
+			case NAME:
+				result = compareNames(e1,e2);
+				break;
+			case VERSION:
+				result = StandardUtilities.compareStrings(e1.version, e2.version, true);
+				break;
+			case STATUS:
+				result = e1.status.compareToIgnoreCase(e2.status);
+				break;
+			case DATA:
+				result = StandardUtilities.compareStrings(e1.dataSize,e2.dataSize, false);
+				break;
+			default:
+				throw new IllegalStateException("Invalid sort type "+type);
 			}
+			return result * direction;
 		}
 
 		private static int compareNames(Entry e1, Entry e2)
@@ -1278,6 +1279,7 @@ public class ManagePanel extends JPanel
 
 			return s1.compareToIgnoreCase(s2);
 		}
+
 	} //}}}
 
 	//{{{ HeaderMouseHandler class
@@ -1288,17 +1290,9 @@ public class ManagePanel extends JPanel
 		{
 			if (evt.getSource() == table.getTableHeader())
 			{
-				switch(table.getTableHeader().columnAtPoint(evt.getPoint()))
-				{
-					case 1:
-						pluginModel.setSortType(EntryCompare.NAME);
-						break;
-					case 3:
-						pluginModel.setSortType(EntryCompare.STATUS);
-						break;
-					default:
-						break;
-				}
+				int column = table.getTableHeader().columnAtPoint(evt.getPoint());
+				pluginModel.sortDirection *= -1;
+				pluginModel.sort(column);
 			}
 			else
 			{
@@ -1421,6 +1415,31 @@ public class ManagePanel extends JPanel
 		}
 	} //}}}
 
+	//{{{ HeaderRenderer
+	private static class HeaderRenderer extends DefaultTableCellRenderer
+	{
+		private final DefaultTableCellRenderer tcr;
+
+		HeaderRenderer(DefaultTableCellRenderer tcr)
+		{
+			this.tcr = tcr;
+		}
+
+		@Override
+		public Component getTableCellRendererComponent(JTable table, Object value,
+							       boolean isSelected, boolean hasFocus,
+							       int row, int column)
+		{
+			JLabel l = (JLabel)tcr.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
+			PluginTableModel model = (PluginTableModel) table.getModel();
+			Icon icon = (column == model.sortType)
+				? (model.sortDirection == 1) ? InstallPanel.ASC_ICON : InstallPanel.DESC_ICON
+				: null;
+			l.setIcon(icon);
+			return l;
+		}
+	} //}}}
+
 	//{{{ TableSelectionListener class
 	private class TableSelectionListener implements ListSelectionListener
 	{
diff --git a/org/gjt/sp/jedit/pluginmgr/PluginList.java b/org/gjt/sp/jedit/pluginmgr/PluginList.java
index 5ac404f..a777660 100644
--- a/org/gjt/sp/jedit/pluginmgr/PluginList.java
+++ b/org/gjt/sp/jedit/pluginmgr/PluginList.java
@@ -40,7 +40,7 @@ import org.gjt.sp.jedit.*;
 /**
  * Plugin list downloaded from server.
  * @since jEdit 3.2pre2
- * @version $Id: PluginList.java 23224 2013-09-30 20:51:42Z shlomy $
+ * @version $Id: PluginList.java 24084 2015-09-17 18:44:47Z kerik-sf $
  */
 class PluginList
 {
@@ -49,11 +49,11 @@ class PluginList
 	 */
 	public static final int GZIP_MAGIC_1 = 0x1f;
 	public static final int GZIP_MAGIC_2 = 0x8b;
-	public static final long MILLISECONDS_PER_MINUTE = 60L * 1000;
+	public static final long MILLISECONDS_PER_MINUTE = 60L * 1000L;
 
-	final List<Plugin> plugins = new ArrayList<Plugin>();
-	final Map<String, Plugin> pluginHash = new HashMap<String, Plugin>();
-	final List<PluginSet> pluginSets = new ArrayList<PluginSet>();
+	final List<Plugin> plugins = new ArrayList<>();
+	final Map<String, Plugin> pluginHash = new HashMap<>();
+	final List<PluginSet> pluginSets = new ArrayList<>();
 
 	/**
 	 * The mirror id.
@@ -233,7 +233,6 @@ class PluginList
 	//{{{ addPlugin() method
 	void addPlugin(Plugin plugin)
 	{
-		plugin.checkIfInstalled();
 		plugins.add(plugin);
 		pluginHash.put(plugin.name,plugin);
 	} //}}}
@@ -289,7 +288,7 @@ class PluginList
 	static class PluginSet
 	{
 		String name;
-		final List<String> plugins = new ArrayList<String>();
+		final List<String> plugins = new ArrayList<>();
 
 		public String toString()
 		{
@@ -304,67 +303,54 @@ class PluginList
 		String name;
 		String description;
 		String author;
-		final List<Branch> branches = new ArrayList<Branch>();
-		//String installed;
-		//String installedVersion;
+		final List<Branch> branches = new ArrayList<>();
+		String installedVersion = null;
+		String installedPath = null;
+		boolean loaded = false;
 
-		void checkIfInstalled()
+		String getInstalledVersion()
 		{
-			/* // check if the plugin is already installed.
-			// this is a bit of hack
+			this.loaded = false;
 			PluginJAR[] jars = jEdit.getPluginJARs();
 			for(int i = 0; i < jars.length; i++)
 			{
 				String path = jars[i].getPath();
-				if(!new File(path).exists())
-					continue;
 
 				if(MiscUtilities.getFileName(path).equals(jar))
 				{
-					installed = path;
-
 					EditPlugin plugin = jars[i].getPlugin();
 					if(plugin != null)
 					{
 						installedVersion = jEdit.getProperty(
 							"plugin." + plugin.getClassName()
 							+ ".version");
+						this.loaded = true;
+						return installedVersion;
 					}
-					break;
+					else
+						return null;
 				}
 			}
-
-			String[] notLoaded = jEdit.getNotLoadedPluginJARs();
-			for(int i = 0; i < notLoaded.length; i++)
-			{
-				String path = notLoaded[i];
-
-				if(MiscUtilities.getFileName(path).equals(jar))
-				{
-					installed = path;
-					break;
-				}
-			} */
-		}
-
-		String getInstalledVersion()
-		{
-			PluginJAR[] jars = jEdit.getPluginJARs();
-			for(int i = 0; i < jars.length; i++)
-			{
-				String path = jars[i].getPath();
-
+			String[] notLoadedJars = jEdit.getNotLoadedPluginJARs();
+			for(String path: notLoadedJars){
 				if(MiscUtilities.getFileName(path).equals(jar))
 				{
-					EditPlugin plugin = jars[i].getPlugin();
-					if(plugin != null)
+					try
 					{
-						return jEdit.getProperty(
-							"plugin." + plugin.getClassName()
-							+ ".version");
+						PluginJAR.PluginCacheEntry cacheEntry = PluginJAR.getPluginCacheEntry(path);
+						if(cacheEntry != null)
+						{
+							String versionKey = "plugin." + cacheEntry.pluginClass + ".version";
+							installedVersion = cacheEntry.cachedProperties.getProperty(versionKey);
+							Log.log(Log.DEBUG, PluginList.class, "found installed but not loaded "+ jar + " version=" + installedVersion);
+							installedPath = path; 
+							return installedVersion;
+						}
+					}
+					catch (IOException e)
+					{
+						Log.log(Log.WARNING, "Unable to access cache for "+jar, e);
 					}
-					else
-						return null;
 				}
 			}
 
@@ -373,6 +359,14 @@ class PluginList
 
 		String getInstalledPath()
 		{
+			if(installedPath != null){
+				if(new File(installedPath).exists()){
+					return installedPath;
+				}else{
+					installedPath = null;
+				}
+			}
+
 			PluginJAR[] jars = jEdit.getPluginJARs();
 			for(int i = 0; i < jars.length; i++)
 			{
@@ -406,7 +400,7 @@ class PluginList
 				&& branch.canSatisfyDependencies();
 		}
 
-		void install(Roster roster, String installDirectory, boolean downloadSource)
+		void install(Roster roster, String installDirectory, boolean downloadSource, boolean asDependency)
 		{
 			String installed = getInstalledPath();
 
@@ -421,6 +415,12 @@ class PluginList
 			//branch.satisfyDependencies(roster,installDirectory,
 			//	downloadSource);
 
+			if(installedVersion != null && installedPath!= null && !loaded && asDependency)
+			{
+				roster.addLoad(installedPath);
+				return;
+			}
+
 			if(installed != null)
 			{
 				installDirectory = MiscUtilities.getParentOfPath(
@@ -451,7 +451,7 @@ class PluginList
 		int downloadSourceSize;
 		String downloadSource;
 		boolean obsolete;
-		final List<Dependency> deps = new ArrayList<Dependency>();
+		final List<Dependency> deps = new ArrayList<>();
 
 		boolean canSatisfyDependencies()
 		{
@@ -593,7 +593,7 @@ class PluginList
 						      branch.version,to,false) <= 0))
 					{
 						plugin.install(roster,installDirectory,
-							downloadSource);
+							downloadSource, false);
 						return;
 					}
 				}
diff --git a/org/gjt/sp/jedit/pluginmgr/PluginManager.java b/org/gjt/sp/jedit/pluginmgr/PluginManager.java
index 7d9f383..04c557c 100644
--- a/org/gjt/sp/jedit/pluginmgr/PluginManager.java
+++ b/org/gjt/sp/jedit/pluginmgr/PluginManager.java
@@ -43,7 +43,7 @@ import org.gjt.sp.util.ThreadUtilities;
 //}}}
 
 /**
- * @version $Id: PluginManager.java 23099 2013-07-29 18:08:50Z ezust $
+ * @version $Id: PluginManager.java 24071 2015-09-16 19:51:55Z kerik-sf $
  */
 public class PluginManager extends JFrame
 {
@@ -222,7 +222,7 @@ public class PluginManager extends JFrame
 	/**
 	* Check if the plugin list should be updated.
 	* It will return <code>true</code> if the pluginList is <code>null</code>
-	* or if the mirror id of the current plugin list is not the current preffered mirror id
+	* or if the mirror id of the current plugin list is not the current preferred mirror id
 	* and will return always false if the plugin list is currently downloading
 	*
 	* @return true if the plugin list should be updated
@@ -248,13 +248,14 @@ public class PluginManager extends JFrame
 			return;
 		}
 
+		installer.loading();
+		updater.loading();
+
 		ThreadUtilities.runInBackground(new Task()
 		{
 			@Override
 			public void _run()
 			{
-				installer.loading();
-				updater.loading();
 				try
 				{
 					downloadingPluginList = true;
diff --git a/org/gjt/sp/jedit/pluginmgr/Roster.java b/org/gjt/sp/jedit/pluginmgr/Roster.java
index 4155666..b2c53f1 100644
--- a/org/gjt/sp/jedit/pluginmgr/Roster.java
+++ b/org/gjt/sp/jedit/pluginmgr/Roster.java
@@ -38,7 +38,7 @@ import static org.gjt.sp.jedit.io.FileVFS.recursiveDelete;
 //}}}
 
 /**
- * @author $Id: Roster.java 23222 2013-09-29 20:43:34Z shlomy $
+ * @author $Id: Roster.java 24071 2015-09-16 19:51:55Z kerik-sf $
  */
 class Roster
 {
@@ -66,6 +66,12 @@ class Roster
 		addOperation(new Install(installed,url,installDirectory,size));
 	} //}}}
 
+	//{{{ addLoad() method
+	void addLoad(String path)
+	{
+		toLoad.add(path);
+	} //}}}
+
 	//{{{ getOperation() method
 	public Operation getOperation(int i)
 	{
@@ -203,27 +209,29 @@ class Roster
 
 			toLoad.remove(this.jar);
 
-			// move JAR first
 			File jarFile = new File(this.jar);
 			File srcFile = new File(this.jar.substring(0, this.jar.length() - 4));
 
-			Log.log(Log.NOTICE,this,"Deleting " + jarFile);
-
-			boolean ok = jarFile.delete();
-			if (ok) 
+			if(jarFile.exists())
 			{
-				EditBus.send(new PluginUpdate(jarFile, PluginUpdate.REMOVED, false));	
-			}
+				Log.log(Log.NOTICE,this,"Deleting " + jarFile);
 
-			if(srcFile.exists())
-			{
-				ok &= recursiveDelete(srcFile);
-			}
+				boolean ok = jarFile.delete();
+				if (ok)
+				{
+					EditBus.send(new PluginUpdate(jarFile, PluginUpdate.REMOVED, false));
+				}
 
-			if(!ok)
-			{
-				String[] args = {this.jar};
-				GUIUtilities.error(comp,"plugin-manager.remove-failed",args);
+				if(srcFile.exists())
+				{
+					ok &= recursiveDelete(srcFile);
+				}
+
+				if(!ok)
+				{
+					String[] args = {this.jar};
+					GUIUtilities.error(comp,"plugin-manager.remove-failed",args);
+				}
 			}
 		} //}}}
 
@@ -299,9 +307,29 @@ class Roster
 			if(path == null)
 				return;
 
-			// if download OK, remove existing version
+			/* if download OK, remove existing version
+			 * and bundled jars and files */
 			if(installed != null)
-				new Remove(installed).runInAWTThread(comp);
+			{
+				PluginJAR pluginJar = jEdit.getPluginJAR(installed);
+				Collection<String> libs = new LinkedList<>();
+				libs.add(installed);
+				if(pluginJar == null)
+				{
+					Log.log(Log.ERROR, Roster.Remove.class,
+						 "unable to get PluginJAR for "+installed);
+				}
+				else
+				{
+					 libs.addAll(pluginJar.getJars());
+					 libs.addAll(pluginJar.getFiles());
+				}
+
+				for(String lib: libs)
+				{
+					new Remove(lib).runInAWTThread(comp);
+				}
+			}
 
 			ZipFile zipFile = null;
 
diff --git a/org/gjt/sp/jedit/proto/jeditresource/PluginResURLConnection.java b/org/gjt/sp/jedit/proto/jeditresource/PluginResURLConnection.java
index 646b2e1..24a3065 100644
--- a/org/gjt/sp/jedit/proto/jeditresource/PluginResURLConnection.java
+++ b/org/gjt/sp/jedit/proto/jeditresource/PluginResURLConnection.java
@@ -3,7 +3,7 @@
  * :tabSize=4:indentSize=4:noTabs=false:
  * :folding=explicit:collapseFolds=1:
  *
- * Copyright (C) 1999, 2000, 2001 Slava Pestov
+ * Copyright © 1999 - 2014 Slava Pestov, Eric Le Lay, Alan Ezust
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -40,6 +40,10 @@ import org.gjt.sp.util.Log;
 //}}}
 
 //{{{ class PluginResURLConnection
+/** An implementation of jeditresource:/ url protocol.
+
+	Can be used for accessing jEdit core resources as well.
+*/
 public class PluginResURLConnection extends URLConnection
 {
 	//{{{ constructor
@@ -75,7 +79,7 @@ public class PluginResURLConnection extends URLConnection
 	//{{{ connect()
 	/**
 	 * @throws	IOException	on error
-	 * @throws	FileNotFoundException if resource is not found 
+	 * @throws	FileNotFoundException if resource is not found
 	 */
 	public void connect() throws IOException, FileNotFoundException
 	{
@@ -108,9 +112,9 @@ public class PluginResURLConnection extends URLConnection
 
 			if((in == null) && (plugin == null))
 			{
-				// can't find it in jEdit.jar, look for file in jEditHome(). 
+				// can't find it in jEdit.jar, look in getJEditHome().
 				File f = new File(jEdit.getJEditHome(), resource);
-				if (f.exists()) 
+				if (f.exists())
 					in = new FileInputStream(f);
 			}
 			connected = true;
@@ -132,7 +136,7 @@ public class PluginResURLConnection extends URLConnection
 	/**
 	 * @return	input stream to read the resource's contents. never null
 	 * @throws	IOException	on error
-	 * @throws	FileNotFoundException if resource is not found 
+	 * @throws	FileNotFoundException if resource is not found
 	 */
 	@Nonnull
 	public InputStream getInputStream()
diff --git a/org/gjt/sp/jedit/search/HyperSearchResults.java b/org/gjt/sp/jedit/search/HyperSearchResults.java
index f619f9c..087b709 100644
--- a/org/gjt/sp/jedit/search/HyperSearchResults.java
+++ b/org/gjt/sp/jedit/search/HyperSearchResults.java
@@ -50,7 +50,7 @@ import org.gjt.sp.util.TaskManager;
 /**
  * HyperSearch results window.
  * @author Slava Pestov
- * @version $Id: HyperSearchResults.java 22942 2013-04-22 11:27:52Z thomasmey $
+ * @version $Id: HyperSearchResults.java 23925 2015-05-24 05:13:52Z ezust $
  */
 public class HyperSearchResults extends JPanel implements DefaultFocusComponent
 {
@@ -104,6 +104,7 @@ public class HyperSearchResults extends JPanel implements DefaultFocusComponent
 		resultTreeRoot = new DefaultMutableTreeNode();
 		resultTreeModel = new DefaultTreeModel(resultTreeRoot);
 		resultTree = new HighlightingTree(resultTreeModel);
+		resultTree.setRowHeight(0);
 		resultTree.setToolTipText(null);
 		resultTree.setCellRenderer(new ResultCellRenderer());
 		resultTree.setVisibleRowCount(16);
diff --git a/org/gjt/sp/jedit/search/PatternSearchMatcher.java b/org/gjt/sp/jedit/search/PatternSearchMatcher.java
index b0ae506..263dee8 100644
--- a/org/gjt/sp/jedit/search/PatternSearchMatcher.java
+++ b/org/gjt/sp/jedit/search/PatternSearchMatcher.java
@@ -31,7 +31,7 @@ import org.gjt.sp.util.ReverseCharSequence;
  * @see java.util.regex.Pattern
  *
  * @author Marcelo Vanzin
- * @version $Id: PatternSearchMatcher.java 19386 2011-02-24 11:06:57Z kpouer $
+ * @version $Id: PatternSearchMatcher.java 24042 2015-09-01 17:46:14Z daleanson $
  * @since jEdit 4.3pre5
  */
 public class PatternSearchMatcher extends SearchMatcher
@@ -122,8 +122,17 @@ public class PatternSearchMatcher extends SearchMatcher
 		}
 
 		Matcher match = re.matcher(text);
-		if (!match.find(matchStart))
-			return null;
+		if (!match.find(matchStart)) {
+			// Check for special constructs, groups starting with (? are either pure, 
+			// non-capturing groups that do not capture text and do not count towards 
+			// the group total, or named-capturing group. Either way, need to remove
+			// them and try again since they won't match because the selection doesn't
+			// necessarily include the non-capturing part.
+			Pattern p = removeNonCapturingGroups(re, flags);
+			match = p.matcher(text);
+			if (!match.matches())
+				return null;
+		}
 
 		// Special care for zero width matches. Without this care,
 		// the caller will fall into an infinite loop, for non-reverse
@@ -221,10 +230,28 @@ public class PatternSearchMatcher extends SearchMatcher
 			returnValue.start = text.length() - returnValue.end;
 			returnValue.end = returnValue.start + len;
 		}
-
 		return returnValue;
+
 	} //}}}
 
+	//{{{ removeNonCapturingGroups() method
+    public static Pattern removeNonCapturingGroups( Pattern re, int flags ) 
+    {
+        String p = re.pattern();
+        String ncgroups = "[(][?].+?[)]";
+        Pattern nc_pattern = Pattern.compile( ncgroups, flags );
+        Matcher nc_matcher = nc_pattern.matcher( p );
+        if ( nc_matcher.find() ) 
+        {
+            String newRegex = nc_matcher.replaceAll( "" );
+            return Pattern.compile(newRegex, flags);
+        } 
+        else 
+        {
+            return re;
+        }
+    } //}}}
+    
 	//{{{ toString() method
 	@Override
 	public String toString()
diff --git a/org/gjt/sp/jedit/syntax/DisplayTokenHandler.java b/org/gjt/sp/jedit/syntax/DisplayTokenHandler.java
index 8d40a6a..b7dd4a5 100644
--- a/org/gjt/sp/jedit/syntax/DisplayTokenHandler.java
+++ b/org/gjt/sp/jedit/syntax/DisplayTokenHandler.java
@@ -32,7 +32,7 @@ import java.text.CharacterIterator;
 
 /**
  * Creates {@link Chunk} objects that can be painted on screen.
- * @version $Id: DisplayTokenHandler.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: DisplayTokenHandler.java 23912 2015-05-17 19:44:33Z ezust $
  */
 public class DisplayTokenHandler extends DefaultTokenHandler
 {
@@ -60,13 +60,7 @@ public class DisplayTokenHandler extends DefaultTokenHandler
 		this.fontRenderContext = fontRenderContext;
 		this.expander = expander;
 		this.out = out;
-
-		// SILLY: allow for anti-aliased characters' "fuzz"
-		if(wrapMargin != 0.0f)
-			this.wrapMargin = wrapMargin + 2.0f;
-		else
-			this.wrapMargin = 0.0f;
-
+		this.wrapMargin = wrapMargin;
 		this.physicalLineOffset = physicalLineOffset;
 	} //}}}
 
diff --git a/org/gjt/sp/jedit/syntax/ModeProvider.java b/org/gjt/sp/jedit/syntax/ModeProvider.java
index 2811d0a..8d01299 100644
--- a/org/gjt/sp/jedit/syntax/ModeProvider.java
+++ b/org/gjt/sp/jedit/syntax/ModeProvider.java
@@ -30,14 +30,17 @@ import org.xml.sax.SAXException;
 import org.xml.sax.XMLReader;
 import org.xml.sax.helpers.XMLReaderFactory;
 
-import java.io.BufferedInputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.LinkedHashMap;
+import java.util.regex.*;
+import javax.swing.JOptionPane;
 //}}}
 
 /**
@@ -59,6 +62,62 @@ public class ModeProvider
 		modes.clear();
 	} //}}}
 
+	//{{{ removeMode() method
+	/**
+ 	 * Will only remove user modes.	
+ 	 */
+	public void removeMode(String name) throws IOException
+	{
+		Mode mode = modes.get(name);
+		if (mode.isUserMode())
+		{
+			modes.remove(name);
+			// delete mode file from disk and remove the entry from the catalog file.
+			// Actually, just rename the mode file by adding "_unused" to the end of the file name
+			// and comment out the line in the catalog file. This way it is possible to undo
+			// these changes manually without too much work.
+			String modeFilename = (String)mode.getProperty("file");
+			File modeFile = new File(modeFilename);
+			if (modeFile.exists()) 
+			{
+				Path path = FileSystems.getDefault().getPath(modeFilename);
+				Files.move(path, path.resolveSibling(modeFilename + "_unused"), StandardCopyOption.REPLACE_EXISTING);
+
+				// delete entry from mode catalog, catalog is in the same directory as the mode file
+				File catalogFile = new File(modeFile.getParent(),"catalog");
+				if (catalogFile.exists())
+				{
+					try 
+					{
+						// read in the catalog file
+						BufferedReader br = new BufferedReader(new FileReader(catalogFile));
+						String line = null;
+						StringBuilder contents = new StringBuilder();
+						while((line = br.readLine()) != null) {
+							contents.append(line).append('\n');
+						}
+						br.close();
+						
+						// remove the catalog entry for this mode
+						Pattern p = Pattern.compile("(?m)(^\\s*[<]MODE.*?NAME=\"" + name + "\".*?[>])");
+						Matcher m = p.matcher(contents);
+						String newContents = m.replaceFirst("<!--$1-->");
+						
+						// rewrite the catalog file
+						BufferedWriter bw = new BufferedWriter(new FileWriter(catalogFile));
+						bw.write(newContents, 0, newContents.length());
+						bw.flush();
+						bw.close();
+					}
+					catch(Exception e) 
+					{
+						// ignored 
+					}
+				}
+			}
+		}
+	} //}}}
+
 	//{{{ getMode() method
 	/**
 	 * Returns the edit mode with the specified name.
@@ -138,12 +197,33 @@ public class ModeProvider
 					return mode;
 				}
 			}
-			// next best is filepath match
+			// next best is filepath match, there could be multiple matches,
+			// need to choose the best one
+			List<Mode> filepathMatch = new ArrayList<Mode>();
 			for (Mode mode : acceptable)
 			{
-				if (mode.acceptFile(filepath, filename)) {
-					return mode;
+				if (mode.acceptFile(filepath, filename)) 
+				{
+					filepathMatch.add(mode);
+				}
+			}
+			if (filepathMatch.size() == 1) 
+			{
+				return filepathMatch.get(0); 	
+			}
+			else if (filepathMatch.size() > 1)
+			{
+				// return the one with the longest glob pattern since that one
+				// is most likely to be more specific and hence the best choice
+				Mode longest = filepathMatch.get(0);
+				for (Mode mode : filepathMatch) 
+				{
+					if (((String)mode.getProperty("filenameGlob")).length() > ((String)longest.getProperty("filenameGlob")).length())
+					{
+						longest = mode;	
+					}
 				}
+				return longest;
 			}
 			// all acceptable choices are by first line glob, and
 			// they all match, so just return the first one.
@@ -182,6 +262,74 @@ public class ModeProvider
 		modes.put(name, mode);
 	} //}}}
 
+	//{{{ addUserMode() method
+	/**
+	 * Do not call this method. It is only public so that classes
+	 * in the org.gjt.sp.jedit.syntax package can access it.
+	 * @since jEdit 4.3pre10
+	 * @see org.gjt.sp.jedit.jEdit#reloadModes reloadModes
+	 * @param mode The edit mode
+	 */
+	public void addUserMode(Mode mode, Path target) throws IOException
+	{
+		mode.setUserMode(true);
+		String name = mode.getName();
+		String modeFile = (String)mode.getProperty("file");
+		String filenameGlob = (String)mode.getProperty("filenameGlob");
+		String firstLineGlob = (String)mode.getProperty("firstlineGlob");
+		
+		// copy mode file to user mode directory
+		Path source = FileSystems.getDefault().getPath(modeFile);
+		Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
+
+		// add entry to mode catalog, catalog is in the same directory as the mode file
+		File catalogFile = new File(target.toFile().getParent(),"catalog");
+		if (catalogFile.exists())
+		{
+			try 
+			{
+				// read in the catalog file
+				BufferedReader br = new BufferedReader(new FileReader(catalogFile));
+				String line = null;
+				StringBuilder contents = new StringBuilder();
+				while((line = br.readLine()) != null)
+				{
+					contents.append(line).append('\n');
+				}
+				br.close();
+				
+				// remove any existing catalog entry for this mode
+				Pattern p = Pattern.compile("(?m)(^\\s*[<]MODE.*?NAME=\"" + name + "\".*?[>])");
+				Matcher m = p.matcher(contents);
+				String newContents = m.replaceFirst("<!--$1-->");
+				
+				// insert the catalog entry for this mode
+				p = Pattern.compile("(?m)(</MODES>)");
+				m = p.matcher(contents);
+				StringBuilder modeLine = new StringBuilder("\t<MODE NAME=\"");
+				modeLine.append(name).append("\" FILE=\"").append(target.toFile().getName()).append("\"");
+				modeLine.append(filenameGlob == null || filenameGlob.isEmpty() ? "" : " FILE_NAME_GLOB=\"" + filenameGlob + "\"");
+				modeLine.append(firstLineGlob == null || firstLineGlob.isEmpty() ? "" : " FIRST_LINE_GLOB=\"" + firstLineGlob + "\"");
+				modeLine.append("/>");
+				newContents = m.replaceFirst(modeLine + "\n$1" );
+				
+				// rewrite the catalog file
+				BufferedWriter bw = new BufferedWriter(new FileWriter(catalogFile));
+				bw.write(newContents, 0, newContents.length());
+				bw.flush();
+				bw.close();
+			}
+			catch(Exception e) 
+			{
+				// ignored 
+			}
+		}
+		
+		
+		addMode(mode);
+		loadMode(mode);
+	} //}}}
+
 	//{{{ loadMode() method
 	public void loadMode(Mode mode, XModeHandler xmh)
 	{
diff --git a/org/gjt/sp/jedit/textarea/ChunkCache.java b/org/gjt/sp/jedit/textarea/ChunkCache.java
index 343e53d..c9dff4f 100644
--- a/org/gjt/sp/jedit/textarea/ChunkCache.java
+++ b/org/gjt/sp/jedit/textarea/ChunkCache.java
@@ -42,7 +42,7 @@ import org.gjt.sp.util.Log;
  * The array is resized when the TextArea geometry changes  
  *
  * @author Slava Pestov
- * @version $Id: ChunkCache.java 22670 2013-01-12 12:29:48Z thomasmey $
+ * @version $Id: ChunkCache.java 24095 2015-09-25 21:31:41Z daleanson $
  */
 class ChunkCache
 {
@@ -255,12 +255,15 @@ class ChunkCache
 
 	//{{{ getLineInfo() method
 	/**
-	 * Returns the line informations for a given screen line
+	 * Returns the line informations for a given screen line or a non-null
+	 * new LineInfo if the requested <code>screenLine</code> is out of range.
 	 * @param screenLine the screen line
 	 * @return the LineInfo for the screenLine
 	 */
 	LineInfo getLineInfo(int screenLine)
 	{
+		if (screenLine >= lineInfo.length)
+			return new LineInfo();
 		updateChunksUpTo(screenLine);
 		return lineInfo[screenLine];
 	} //}}}
@@ -839,15 +842,15 @@ class ChunkCache
 		/**
 		 * The physical line.
 		 */
-		int physicalLine;
+		int physicalLine = -1;
 		/**
 		 * The offset where begins the line.
 		 */
-		int offset;
+		int offset = 0;;
 		/**
 		 * The line length.
 		 */
-		int length;
+		int length = 0;
 		/**
 		 * true if it is the first subregion of a line.
 		 */
@@ -856,10 +859,10 @@ class ChunkCache
 		 * True if it is the last subregion of a line.
 		 */
 		boolean lastSubregion;
-		Chunk chunks;
+		Chunk chunks = null;
 		/** The line width. */
-		int width;
-		TokenMarker.LineContext lineContext;
+		int width = 0;
+		TokenMarker.LineContext lineContext = null;
 
 		@Override
 		public String toString()
diff --git a/org/gjt/sp/jedit/textarea/Gutter.java b/org/gjt/sp/jedit/textarea/Gutter.java
index 749de09..d695f61 100644
--- a/org/gjt/sp/jedit/textarea/Gutter.java
+++ b/org/gjt/sp/jedit/textarea/Gutter.java
@@ -50,7 +50,7 @@ import org.gjt.sp.util.Log;
  * @see TextArea
  *
  * @author Mike Dillon and Slava Pestov
- * @version $Id: Gutter.java 23461 2014-04-06 18:00:29Z ezust $
+ * @version $Id: Gutter.java 23977 2015-08-08 22:01:12Z daleanson $
  */
 public class Gutter extends JComponent implements SwingConstants
 {
@@ -185,6 +185,8 @@ public class Gutter extends JComponent implements SwingConstants
 		}
 	
 		int y = clip.y - clip.y % lineHeight;
+		if (y == 0)
+			y = textArea.getPainter().getLineExtraSpacing();
 
 		extensionMgr.paintScreenLineRange(textArea,gfx,
 			firstLine,lastLine,y,lineHeight);
diff --git a/org/gjt/sp/jedit/textarea/StandaloneTextArea.java b/org/gjt/sp/jedit/textarea/StandaloneTextArea.java
index 0a224a5..6db842f 100644
--- a/org/gjt/sp/jedit/textarea/StandaloneTextArea.java
+++ b/org/gjt/sp/jedit/textarea/StandaloneTextArea.java
@@ -97,7 +97,7 @@ import org.gjt.sp.util.SyntaxUtilities;
  * @author Slava Pestov
  * @author John Gellene (API documentation)
    @author Matthieu Casanova
- * @version $Id: StandaloneTextArea.java 23297 2013-10-29 12:32:55Z kpouer $
+ * @version $Id: StandaloneTextArea.java 23821 2015-01-04 14:31:09Z ezust $
  */
 public class StandaloneTextArea extends TextArea
 {
@@ -269,6 +269,8 @@ public class StandaloneTextArea extends TextArea
 			getColorProperty("view.structureHighlightColor"));
 		painter.setEOLMarkersPainted(getBooleanProperty(
 			"view.eolMarkers"));
+		String emc = getProperty("view.eolMarkerChar");
+		if (emc.length() > 0) painter.setEOLMarkerChar(emc);
 		painter.setEOLMarkerColor(
 			getColorProperty("view.eolMarkerColor"));
 		painter.setWrapGuidePainted(getBooleanProperty(
@@ -620,11 +622,11 @@ public class StandaloneTextArea extends TextArea
 
 		@Override
 		protected JEditBeanShellAction createBeanShellAction(String actionName,
-								     String code,
-								     String selected,
-								     boolean noRepeat,
-								     boolean noRecord,
-								     boolean noRememberLast)
+									 String code,
+									 String selected,
+									 boolean noRepeat,
+									 boolean noRecord,
+									 boolean noRememberLast)
 		{
 			return new JEditBeanShellAction(actionName,code,selected,noRepeat,noRecord,noRememberLast);
 		}
diff --git a/org/gjt/sp/jedit/textarea/StructureMatcher.java b/org/gjt/sp/jedit/textarea/StructureMatcher.java
index a618ae9..7ccf1cc 100644
--- a/org/gjt/sp/jedit/textarea/StructureMatcher.java
+++ b/org/gjt/sp/jedit/textarea/StructureMatcher.java
@@ -33,7 +33,7 @@ import org.gjt.sp.jedit.TextUtilities;
  * for matching XML tags.
  *
  * @author Slava Pestov
- * @version $Id: StructureMatcher.java 21831 2012-06-18 22:54:17Z ezust $
+ * @version $Id: StructureMatcher.java 23710 2014-11-01 23:35:36Z ezust $
  * @since jEdit 4.2pre3
  */
 public interface StructureMatcher
@@ -201,8 +201,9 @@ public interface StructureMatcher
 			int matchEndLine = textArea.getScreenLineOfOffset(
 				match.end);
 
-			int fontHeight = textArea.getPainter().getFontHeight();
-			y += textArea.getPainter().getLineExtraSpacing();
+			int height = Math.min(
+				textArea.getPainter().getLineHeight(), textArea.getPainter().getFontHeight());
+			y += Math.max(textArea.getPainter().getLineExtraSpacing(), 0);
 
 			int[] offsets = getOffsets(screenLine,match);
 			int x1 = offsets[0];
@@ -210,8 +211,8 @@ public interface StructureMatcher
 
 			gfx.setColor(textArea.getPainter().getStructureHighlightColor());
 
-			gfx.drawLine(x1,y,x1,y + fontHeight - 1);
-			gfx.drawLine(x2,y,x2,y + fontHeight - 1);
+			gfx.drawLine(x1,y,x1,y + height - 1);
+			gfx.drawLine(x2,y,x2,y + height - 1);
 
 			if(matchStartLine == screenLine || screenLine == 0)
 				gfx.drawLine(x1,y,x2,y);
@@ -229,8 +230,8 @@ public interface StructureMatcher
 
 			if(matchEndLine == screenLine)
 			{
-				gfx.drawLine(x1,y + fontHeight - 1,
-					     x2,y + fontHeight - 1);
+				gfx.drawLine(x1,y + height - 1,
+					     x2,y + height - 1);
 			}
 		}
 
diff --git a/org/gjt/sp/jedit/textarea/TextArea.java b/org/gjt/sp/jedit/textarea/TextArea.java
index f129067..4587d00 100644
--- a/org/gjt/sp/jedit/textarea/TextArea.java
+++ b/org/gjt/sp/jedit/textarea/TextArea.java
@@ -71,7 +71,7 @@ import org.gjt.sp.util.ThreadUtilities;
  *
  * @author Slava Pestov
  * @author kpouer (rafactoring into standalone text area)
- * @version $Id: TextArea.java 23661 2014-08-17 01:12:29Z ezust $
+ * @version $Id: TextArea.java 24095 2015-09-25 21:31:41Z daleanson $
  */
 public abstract class TextArea extends JPanel
 {
@@ -1095,8 +1095,7 @@ public abstract class TextArea extends JPanel
 
 		ChunkCache.LineInfo info = chunkCache.getLineInfo(screenLine);
 
-		retVal.x = (int)(horizontalOffset + Chunk.offsetToX(
-			info.chunks,offset));
+		retVal.x = (int)(horizontalOffset + Chunk.offsetToX(info.chunks, offset));
 
 		return retVal;
 	} //}}}
@@ -1355,6 +1354,8 @@ public abstract class TextArea extends JPanel
 	{
 		int offset = -getHorizontalOffset();
 		ChunkCache.LineInfo lineInfo = chunkCache.getLineInfo(screenLine);
+		if (lineInfo.physicalLine == -1)
+			return "";
 		int lineStartOffset = getLineStartOffset(lineInfo.physicalLine);
 		Point point = offsetToXY(lineStartOffset + lineInfo.offset);
 		int begin = xyToOffset(offset + point.x, point.y);
@@ -1372,6 +1373,8 @@ public abstract class TextArea extends JPanel
 	{
 		int offset = -getHorizontalOffset();
 		ChunkCache.LineInfo lineInfo = chunkCache.getLineInfo(screenLine);
+		if (lineInfo.physicalLine == -1)
+			return;
 		int lineStartOffset = getLineStartOffset(lineInfo.physicalLine);
 		Point point = offsetToXY(lineStartOffset + lineInfo.offset);
 		int begin = xyToOffset(offset + point.x, point.y);
@@ -1392,6 +1395,8 @@ public abstract class TextArea extends JPanel
 	{
 		int offset = -getHorizontalOffset();
 		ChunkCache.LineInfo lineInfo = chunkCache.getLineInfo(screenLine);
+		if (lineInfo.physicalLine == -1)
+			return "";
 		int lineStartOffset = getLineStartOffset(lineInfo.physicalLine);
 		Point point = offsetToXY(lineStartOffset + lineInfo.offset);
 		int begin = xyToOffset(offset + point.x, point.y);
@@ -4872,10 +4877,12 @@ loop:		for(int i = lineNo - 1; i >= 0; i--)
 
 		// Calculate an average to use a reasonable value for
 		// propotional fonts.
-		String charWidthSample = " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
-		charWidth = (int)Math.round(
+		String charWidthSample = "mix";
+		charWidthDouble =
 			painter.getFont().getStringBounds(charWidthSample,
-				painter.getFontRenderContext()).getWidth() / charWidthSample.length());
+				painter.getFontRenderContext()).getWidth() / charWidthSample.length();
+	    charWidth = (int)Math.round(charWidthDouble);
+
 
 		String oldWrap = wrap;
 		wrap = buffer.getStringProperty("wrap");
@@ -4959,6 +4966,7 @@ loop:		for(int i = lineNo - 1; i >= 0; i--)
 	int wrapMargin;
 	float tabSize;
 	int charWidth;
+	double charWidthDouble;
 
 	boolean scrollBarsInitialized;
 
@@ -5760,14 +5768,14 @@ loop:		for(int i = lineNo - 1; i >= 0; i--)
 		for(int i = visibleLines - 1; i >= 0; i--)
 		{
 			ChunkCache.LineInfo info = chunkCache.getLineInfo(i);
-			if(info.physicalLine != -1)
+			if(info.physicalLine > -1)
 			{
 				physLastLine = info.physicalLine;
 				screenLastLine = i;
 				break;
 			}
 		}
-		invalidateScreenLineRange(oldScreenLastLine,screenLastLine);
+		invalidateScreenLineRange(oldScreenLastLine, screenLastLine);
 	} //}}}
 
 	//{{{ getRectParams() method
@@ -6007,7 +6015,7 @@ loop:		for(int i = lineNo - 1; i >= 0; i--)
 		}
 		else
 		{
-			int estimate = charWidth * maxLineLen;
+			int estimate = (int)Math.ceil(charWidthDouble * maxLineLen);
 			if (softWrap && painter.getWidth() < estimate)
 			{
 				wrapToWidth = true;
diff --git a/org/gjt/sp/jedit/textarea/TextAreaMouseHandler.java b/org/gjt/sp/jedit/textarea/TextAreaMouseHandler.java
index 68ed567..211f9f2 100644
--- a/org/gjt/sp/jedit/textarea/TextAreaMouseHandler.java
+++ b/org/gjt/sp/jedit/textarea/TextAreaMouseHandler.java
@@ -33,7 +33,7 @@ import java.awt.*;
 /** Standalone TextArea MouseHandler.
  *
  * @author Matthieu Casanova
- * @version $Id: TextAreaMouseHandler.java 22883 2013-03-23 17:58:56Z thomasmey $
+ * @version $Id: TextAreaMouseHandler.java 24095 2015-09-25 21:31:41Z daleanson $
  */
 public class TextAreaMouseHandler extends MouseInputAdapter
 {
@@ -131,8 +131,7 @@ public class TextAreaMouseHandler extends MouseInputAdapter
 		int x = evt.getX();
 
 		int extraEndVirt = 0;
-		if(textArea.chunkCache.getLineInfo(
-			textArea.getLastScreenLine()).lastSubregion)
+		if(textArea.chunkCache.getLineInfo(textArea.getLastScreenLine()).lastSubregion)
 		{
 			int dragStart = textArea.xyToOffset(x,evt.getY(),
 				!textArea.getPainter().isBlockCaretEnabled()
@@ -346,9 +345,7 @@ public class TextAreaMouseHandler extends MouseInputAdapter
 		int dotLine = textArea.getLineOfOffset(dot);
 		int extraEndVirt = 0;
 
-		if(textArea.chunkCache.getLineInfo(
-			textArea.getLastScreenLine())
-			.lastSubregion)
+		if(textArea.chunkCache.getLineInfo(	textArea.getLastScreenLine()).lastSubregion)
 		{
 			int screenLine = textArea.getScreenLineOfOffset(dot);
 			ChunkCache.LineInfo lineInfo = textArea.chunkCache.getLineInfo(screenLine);
diff --git a/org/gjt/sp/jedit/textarea/TextAreaPainter.java b/org/gjt/sp/jedit/textarea/TextAreaPainter.java
index 3fca5ce..54641db 100644
--- a/org/gjt/sp/jedit/textarea/TextAreaPainter.java
+++ b/org/gjt/sp/jedit/textarea/TextAreaPainter.java
@@ -1,10 +1,10 @@
 /*
  * TextAreaPainter.java - Paints the text area
- * :tabSize=4:indentSize=4:noTabs=false:
+ * :tabSize=4:indentSize=4:noTabs=false:encoding=UTF-8:
  * :folding=explicit:collapseFolds=1:
  *
  * Copyright (C) 1999-2013 Slava Pestov, Shlomy Reinstein
- * Matthieu Casanova, Kazutoshi Satoda, Alan Ezust, Dale Anson  
+ * Matthieu Casanova, Kazutoshi Satoda, Alan Ezust, Dale Anson
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -55,7 +55,7 @@ import org.gjt.sp.util.Log;
  * @see TextArea
  *
  * @author Slava Pestov
- * @version $Id: TextAreaPainter.java 23832 2015-01-24 03:26:47Z ezust $
+ * @version $Id: TextAreaPainter.java 24095 2015-09-25 21:31:41Z daleanson $
  */
 public class TextAreaPainter extends JComponent implements TabExpander
 {
@@ -155,12 +155,14 @@ public class TextAreaPainter extends JComponent implements TabExpander
 	@Override
 	public void setBounds(int x, int y, int width, int height)
 	{
+		// for some reason, the height is always off by one when the bounds have
+		// not changed at all, hence the +1 on the height check. Without the +1, 
+		// everything gets reset every time, which leads to other problems.
 		if(x == getX() && y == getY() && width == getWidth()
-			&& height == getHeight())
+			&& (height == getHeight() || height == getHeight() + 1))
 		{
 			return;
 		}
-
 		super.setBounds(x,y,width,height);
 
 		textArea.recalculateVisibleLines();
@@ -215,7 +217,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 	{
 		if (defaultCursor)
 		{
-		       setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
+			   setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
 		}
 	} //}}}
 
@@ -521,6 +523,13 @@ public class TextAreaPainter extends JComponent implements TabExpander
 			textArea.invalidateLine(textArea.getCaretLine());
 	} //}}}
 
+	public String getEOLMarkerChar() {
+		return eolMarkerChar;
+	}
+	public void setEOLMarkerChar(String emc) {
+		eolMarkerChar = emc;
+	}
+
 	//{{{ getEOLMarkerColor() method
 	/**
 	 * Returns the EOL marker color.
@@ -757,17 +766,17 @@ public class TextAreaPainter extends JComponent implements TabExpander
 	{
 		return fm;
 	} //}}}
-	
+
 	//{{{ getLineHeight() method
 	/**
-	 * Returns the line height as given by the font metrics plus the 
+	 * Returns the line height as given by the font metrics plus the
 	 * added line spacing.
 	 */
 	public int getLineHeight()
 	{
 		return fm.getHeight() + extraLineSpacing;
 	} //}}}
-	
+
 	//{{{ getFontHeight() method
 	/**
 	 * Returns the font height as given by the font metrics.
@@ -776,7 +785,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 	{
 		return fm.getHeight();
 	} //}}}
-	
+
 	//{{{ getLineExtraSpacing() method
 	/**
 	 * Returns the number of pixels from the start of the line to the start
@@ -795,7 +804,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 	{
 		extraLineSpacing = spacing;
 	} //}}}
-	
+
 	//{{{ setFont() method
 	/**
 	 * Sets the font for this component. This is overridden to update the
@@ -835,14 +844,14 @@ public class TextAreaPainter extends JComponent implements TabExpander
 	//{{{ getRenderingHints() method
 	/**
 	 * Returns the rendering hints used by the Graphics2D class; in this
-         * case, for anti-aliasing of text.
+		 * case, for anti-aliasing of text.
 	 *
 	 * @since jEdit 4.5pre1
 	 */
-        public RenderingHints getRenderingHints()
+		public RenderingHints getRenderingHints()
 	{
-            return renderingHints;
-        } //}}}
+			return renderingHints;
+		} //}}}
 
 	//{{{ update() method
 	/**
@@ -903,7 +912,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 
 		textArea.updateMaxHorizontalScrollWidth();
 	} //}}}
-	
+
 	//{{{ nextTabStop() method
 	/**
 	 * Implementation of TabExpander interface. Returns next tab stop after
@@ -959,6 +968,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 	Color lineHighlightColor;
 	Color structureHighlightColor;
 	Color eolMarkerColor;
+	String eolMarkerChar;
 	Color wrapGuideColor;
 
 	SyntaxStyle[] foldLineStyle;
@@ -993,7 +1003,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 		this.textArea = textArea;
 		antiAlias = new AntiAlias(0);
 		extensionMgr = new ExtensionManager();
-
+		eolMarkerChar = "·";
 		setAutoscrolls(true);
 		setOpaque(true);
 		setRequestFocusEnabled(false);
@@ -1011,7 +1021,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 		addExtension(TEXT_LAYER,new PaintText());
 		addExtension(TEXT_LAYER,new PaintSelectionText());
 		caretExtension = new PaintCaret();
-		
+
 		extraLineSpacing = 0;
 	} //}}}
 
@@ -1026,7 +1036,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 	private Cursor hiddenCursor;
 	private boolean defaultCursor = true;
 	//}}}
-	
+
 	//{{{ updateRenderingHints() method
 	private void updateRenderingHints()
 	{
@@ -1037,7 +1047,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 				: RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
 
 		hints.put(RenderingHints.KEY_TEXT_ANTIALIASING, antiAlias.renderHint());
-		
+
 
 		if (antiAlias.val() == 0)
 		{
@@ -1045,13 +1055,13 @@ public class TextAreaPainter extends JComponent implements TabExpander
 			fontRenderContext = new FontRenderContext(null, antiAlias.val() > 0, fracFontMetrics);
 		}
 		/* Subpixel antialiasing mode */
-		else if (antiAlias.val() > 1) 
+		else if (antiAlias.val() > 1)
 		{
 			Object fontRenderHint = fracFontMetrics ?
 				RenderingHints.VALUE_FRACTIONALMETRICS_ON :
 				RenderingHints.VALUE_FRACTIONALMETRICS_OFF;
-			fontRenderContext = new FontRenderContext(null, antiAlias.renderHint(), 
-				fontRenderHint);			
+			fontRenderContext = new FontRenderContext(null, antiAlias.renderHint(),
+				fontRenderHint);
 		}
 		else /** Standard Antialias Version */
 		{
@@ -1142,14 +1152,14 @@ public class TextAreaPainter extends JComponent implements TabExpander
 			} //}}}
 
 			//{{{ Paint token backgrounds
-			ChunkCache.LineInfo lineInfo = textArea.chunkCache
-				.getLineInfo(screenLine);
+			ChunkCache.LineInfo lineInfo = textArea.chunkCache.getLineInfo(screenLine);
 
 			if(lineInfo.chunks != null)
 			{
-				float baseLine = y + getLineHeight() - (fm.getLeading()+1) - fm.getDescent();
+				float baseLine = y + getLineHeight() - (fm.getLeading() + 1) - fm.getDescent();
 				Chunk.paintChunkBackgrounds(
-					lineInfo.chunks,gfx,
+					lineInfo.chunks, 
+					gfx,
 					textArea.getHorizontalOffset(),
 					baseLine, getLineHeight());
 			} //}}}
@@ -1211,7 +1221,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 		{
 			if(textArea.getSelectionCount() == 0)
 				return;
-			if ((! isSelectionFgColorEnabled()) || (getSelectionFgColor() == null)) 
+			if ((! isSelectionFgColorEnabled()) || (getSelectionFgColor() == null))
 				return;
 
 			Iterator<Selection> iter = textArea.getSelectionIterator();
@@ -1280,7 +1290,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 							x = nextX(x, style, sub, tokenStart, startOffset);
 						}
 						else
-							strStart = tokenStart; 
+							strStart = tokenStart;
 						int strEnd = (endOffset > next) ? next : endOffset;
 						sub = textArea.getText(strStart, strEnd - strStart);
 						gfx.drawString(sub, x, baseLine);
@@ -1368,8 +1378,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 		public void paintValidLine(Graphics2D gfx, int screenLine,
 			int physicalLine, int start, int end, int y)
 		{
-			ChunkCache.LineInfo lineInfo = textArea.chunkCache
-				.getLineInfo(screenLine);
+			ChunkCache.LineInfo lineInfo = textArea.chunkCache.getLineInfo(screenLine);
 			Font defaultFont = getFont();
 			Color defaultColor = getForeground();
 
@@ -1383,9 +1392,12 @@ public class TextAreaPainter extends JComponent implements TabExpander
 
 			if(lineInfo.chunks != null)
 			{
-				x += Chunk.paintChunkList(lineInfo.chunks,
-					gfx,textArea.getHorizontalOffset(),
-					baseLine,!Debug.DISABLE_GLYPH_VECTOR);
+				x += Chunk.paintChunkList(
+					lineInfo.chunks,
+					gfx,
+					textArea.getHorizontalOffset(),
+					baseLine,
+					!Debug.DISABLE_GLYPH_VECTOR);
 			}
 
 			JEditBuffer buffer = textArea.getBuffer();
@@ -1444,7 +1456,7 @@ public class TextAreaPainter extends JComponent implements TabExpander
 			{
 				gfx.setFont(defaultFont);
 				gfx.setColor(eolMarkerColor);
-				gfx.drawString(".",x,baseLine);
+				gfx.drawString(eolMarkerChar,x,baseLine);
 				x += textArea.charWidth;
 			}
 
@@ -1468,32 +1480,32 @@ public class TextAreaPainter extends JComponent implements TabExpander
 
 			int offset = caret - textArea.getLineStartOffset(physicalLine);
 			textArea.offsetToXY(physicalLine,
-					    offset, textArea.offsetXY);
+						offset, textArea.offsetXY);
 			int caretX = textArea.offsetXY.x;
 			int lineHeight = getLineHeight();
-			int charHeight = getFontHeight();
-			int charOffset = lineHeight - charHeight;
+			int charHeight = Math.min(lineHeight, getFontHeight());
+			int charOffset = Math.max(lineHeight - charHeight, 0);
 
 			gfx.setColor(caretColor);
 
 			if(textArea.isOverwriteEnabled())
 			{
-				if (thickCaret) 
+				if (thickCaret)
 					gfx.fillRect(caretX, y + lineHeight - 4, textArea.charWidth, 3);
-				
-				else  gfx.drawLine(caretX, y + lineHeight - 1, 
+
+				else  gfx.drawLine(caretX, y + lineHeight - 1,
 					caretX + textArea.charWidth, y + lineHeight - 1);
 			}
 			else if(blockCaret)
-				gfx.drawRect(caretX, y + charOffset, 
+				gfx.drawRect(caretX, y + charOffset,
 					textArea.charWidth - 1, charHeight - 1);
 			else
 			{
-				if (thickCaret) 
+				if (thickCaret)
 					gfx.fillRect(caretX, y + charOffset, 3, charHeight - 1);
 				else
-					gfx.drawLine(caretX, y + charOffset, caretX, 
-						     y + charOffset + charHeight - 1);
+					gfx.drawLine(caretX, y + charOffset, caretX,
+							 y + charOffset + charHeight - 1);
 			}
 		}
 	} //}}}
diff --git a/org/gjt/sp/util/EnhancedTreeCellRenderer.java b/org/gjt/sp/util/EnhancedTreeCellRenderer.java
index c905bd9..4777b26 100644
--- a/org/gjt/sp/util/EnhancedTreeCellRenderer.java
+++ b/org/gjt/sp/util/EnhancedTreeCellRenderer.java
@@ -37,7 +37,7 @@ import java.util.WeakHashMap;
  * tree cell renderers. Using {@code DefaultTreeCellRenderer} as superclass for a custom tree
  * cell renderer without further measures is not stable in regards to on-the-fly Look and Feel
  * changes, at least not with Java 6. For Java 7 it should be tested again.
- * <p/>
+ * <p>
  * With Java 6 the {@code DefaultTreeCellRenderer} initializes some values according to the
  * Look and Feel in its constructor. If the {@code DefaultTreeCellRenderer} is created by the
  * {@link JTree} code, it is recreated on a Look and Feel change. This way all works fine. But
@@ -55,7 +55,7 @@ import java.util.WeakHashMap;
  *         The Look and Feel change is first applied to the {@code JTree}, then the sizes of
  *         the tree cells which are saved in a cache are recalculated. Only <b>after</b> that,
  *         the children of the {@code JTree} get the new Look and Feel applied, amongst them
- *         also the tree cell renderer.<br/>
+ *         also the tree cell renderer.<br>
  *         So even if a custom tree cell renderer is aware of on-the-fly Look and Feel changes
  *         by reinitializing values from the Look and Feel if it changes, those cached sizes
  *         are still calculated for the old Look and Feel. The only way to work around this is
@@ -63,7 +63,7 @@ import java.util.WeakHashMap;
  *         significant property of the {@code JTree} which influences size calculations.
  *     </li>
  * </ol>
- * <p/>
+ * <p>
  * To work around the described problems this enhanced tree cell renderer listens for Look
  * and Feel changes on the {@code JTree} where this renderer is used, requests a subclass
  * to create a new instance of the renderer and sets it on the {@code JTree}. By doing so
@@ -113,11 +113,11 @@ public abstract class EnhancedTreeCellRenderer extends DefaultTreeCellRenderer
 	 * Creates a new instance of the tree cell renderer. Each invocation has to
 	 * return a different object. Saving a reference and returning the same
 	 * instance from different calls of this method is <b>not</b> appropriate.
-	 * <p/>
+	 * <p>
 	 * Any one-time initializations that are necessary and are not made in the
 	 * constructor should be made in this method. The simplest implementation
 	 * of this method will just call the constructor and return the result.
-	 * <p/>
+	 * <p>
 	 * This is an instance method so that the new instance can be set up with
 	 * information from the current instance.
 	 *
diff --git a/org/gjt/sp/util/StandardUtilities.java b/org/gjt/sp/util/StandardUtilities.java
index e99dadc..7994feb 100644
--- a/org/gjt/sp/util/StandardUtilities.java
+++ b/org/gjt/sp/util/StandardUtilities.java
@@ -40,7 +40,7 @@ import java.util.Stack;
  * Several tools that depends on JDK only.
  *
  * @author Matthieu Casanova
- * @version $Id: StandardUtilities.java 23381 2013-12-09 12:43:14Z kpouer $
+ * @version $Id: StandardUtilities.java 24072 2015-09-16 19:52:05Z kerik-sf $
  * @since 4.3pre5
  */
 public class StandardUtilities
@@ -378,19 +378,32 @@ loop:		for(int i = 0; i < str.length(); i++)
 	/**
 	 * Compares two strings.<p>
 	 *
-	 * Unlike <function>String.compareTo()</function>,
+	 * Unlike <code>String.compareTo()</code>,
 	 * this method correctly recognizes and handles embedded numbers.
 	 * For example, it places "My file 2" before "My file 10".<p>
 	 *
-	 * @param str1 The first string
-	 * @param str2 The second string
+	 * @param str1 The first string (maybe null)
+	 * @param str2 The second string (maybe null)
 	 * @param ignoreCase If true, case will be ignored
 	 * @return negative If str1 < str2, 0 if both are the same,
-	 * positive if str1 > str2
+	 * positive if str1 > str2 (null < any non-null string, null = null)
 	 * @since jEdit 4.3pre5
 	 */
 	public static int compareStrings(String str1, String str2, boolean ignoreCase)
 	{
+		if (str1  == str2)
+		{
+			return 0;
+		}
+		else if (str1 == null)
+		{
+			return -1;
+		}
+		else if(str2 == null)
+		{
+			return 1;
+		}
+
 		char[] char1 = str1.toCharArray();
 		char[] char2 = str2.toCharArray();
 
diff --git a/org/gjt/sp/util/Task.java b/org/gjt/sp/util/Task.java
index 37ac167..15376b1 100644
--- a/org/gjt/sp/util/Task.java
+++ b/org/gjt/sp/util/Task.java
@@ -24,7 +24,8 @@ package org.gjt.sp.util;
 import javax.swing.*;
 
 /**
- * A Task is basically a Runnable but with some information about it's progression.
+ * A Task is a Runnable with progress.
+ *
  * @since jEdit 4.4pre1
  * @author Matthieu Casanova
  */
diff --git a/org/jedit/core/MigrationService.java b/org/jedit/core/MigrationService.java
index d7b7211..989ee1f 100644
--- a/org/jedit/core/MigrationService.java
+++ b/org/jedit/core/MigrationService.java
@@ -21,15 +21,15 @@
 package org.jedit.core;
 
 /** A Migration service.
- * <br />
+ * <br>
  * The goal of migration is usually to replace old properties or data files
  * with a new set, located elsewhere. The fact is that depending on where
  * the data needs to be updated, the migration may need to be done at
-*  different places during jEdit's startup. <br />
+*  different places during jEdit's startup. <br>
  * There is no specific time that all migration services are called currently.
  * The service and interface exists primarily so you don't need to add a compilation
- * dependency of the org.gjt.sp.jEdit class to your MigrationService class. <br />
- * <br />
+ * dependency of the org.gjt.sp.jEdit class to your MigrationService class. <br>
+ * <br>
  * Concrete instances need to guarantee that the migration itself is only done
  * once.
  * @see org.jedit.migration.OneTimeMigrationService
diff --git a/org/jedit/keymap/KeymapImpl.java b/org/jedit/keymap/KeymapImpl.java
index 11eca34..9264847 100644
--- a/org/jedit/keymap/KeymapImpl.java
+++ b/org/jedit/keymap/KeymapImpl.java
@@ -32,6 +32,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
 
+import org.gjt.sp.jedit.MiscUtilities;
 import org.gjt.sp.util.IOUtilities;
 import org.gjt.sp.util.Log;
 //}}}
@@ -150,7 +151,7 @@ class KeymapImpl implements Keymap
 			try
 			{
 				out = new BufferedOutputStream(new FileOutputStream(userKeymapFile));
-				props.store(out, "jEdit's keymap " + name);
+				MiscUtilities.storeProperties(props, out, "jEdit's keymap " + name);
 			}
 			catch (IOException e)
 			{
diff --git a/org/jedit/localization/jedit_en.props b/org/jedit/localization/jedit_en.props
index f185435..3bc391f 100644
--- a/org/jedit/localization/jedit_en.props
+++ b/org/jedit/localization/jedit_en.props
@@ -1247,6 +1247,7 @@ options.general.checkModStatusUpon.none=none
 options.general.recentFiles=Recent files to remember:
 options.general.hypersearch.maxWarningResults=Max Hypersearch Results:
 options.general.sortRecent=Sort recent file list
+options.general.hideOpen=Hide open files from recent file list
 options.general.saveCaret=Save caret positions in recent file list
 options.general.persistentMarkers=Save marker positions
 options.general.resetUndo=Reset undo history on save
@@ -1358,18 +1359,22 @@ options.editing.elasticTabstops=Indent using elastic tabstops
 options.editing.elasticTabstops.tooltip=Columns in lines above and below a "cell" are kept aligned on tab stops that can grow or shrink depending on the width of the cell.
 options.editing.deepIndent=Deep indent
 options.editing.autoIndent=Automatic indentation:
-options.editing.largefilemode.title=Large file mode
-options.editing.largefilemode=What should I do about very big files:
-options.editing.largefilemode.option.ask=<html><b>Ask</b> what to do when opening a large file</html>
-options.editing.largefilemode.option.full=<html><b>Keep Full syntax</b> : jEdit's syntax highlight will work as usual, jEdit \
-                                               	may become<br/><b>very slow, this is not recommended</b></html>
-options.editing.largefilemode.option.limited=<html><b>Context insensitive syntax highlight</b>: In this case jEdit will \
-		do fast highlighting, but the<br/>result may not be perfect. The \
-		buffer is highlighted line by line without taking care of the<br/>context \
-		of the previous line. It is possible that the syntax is not accurate \
-		if you have<br/>tokens on multiple lines (multiline comments, xml tags ...) \
-		Soft wrap is also deactivated<br/><b>(best choice)</b></html>
-options.editing.largefilemode.option.nohighlight=No syntax highlight, no soft wrap
+options.editing.deleteMode=Delete this mode
+options.editing.addMode=Add Mode
+options.editing.addMode.dialog.title=Add Mode
+options.editing.addMode.dialog.browse=Browse
+options.editing.addMode.dialog.modeName=Mode Name:
+options.editing.addMode.dialog.modeFile=Select Mode File:
+options.editing.addMode.dialog.filenameGlob=File Name Glob:
+options.editing.addMode.dialog.firstLineGlob=First Line Glob:
+options.editing.addMode.dialog.warning.title=Confirm Mode Replace:
+options.editing.addMode.dialog.warning.message=This mode already exists. Do you want to replace it?
+options.editing.addMode.dialog.warning.message1=Unable to copy mode file
+options.editing.deleteMode.dialog.title=Confirm Mode Delete
+options.editing.deleteMode.dialog.message=Are you sure you want to delete this mode? It cannot be undone.
+options.editing.deleteMode.dialog.message1=Unable to delete mode file
+options.editing.deleteMode.dialog.message2=for mode
+
 #}}}
 
 #{{{ Encodings pane
@@ -1409,6 +1414,23 @@ options.gutter.foldStyleNames.Square=Square
 options.gutter.foldStyleNames.Circle=Circle
 #}}}
 
+#{{{ Large files pane
+options.large-files.label=Large files
+options.editing.largefilemode.title=Large file mode
+options.editing.largefilemode=What should I do about very big files:
+options.editing.largefilemode.option.ask=<html><b>Ask</b> what to do when opening a large file</html>
+options.editing.largefilemode.option.full=<html><b>Keep Full syntax</b> : jEdit's syntax highlight will work as usual, jEdit \
+                                               	may become<br/><b>very slow, this is not recommended</b></html>
+options.editing.largefilemode.option.limited=<html><b>Context insensitive syntax highlight</b>: In this case jEdit will \
+		do fast highlighting, but the<br/>result may not be perfect. The \
+		buffer is highlighted line by line without taking care of the<br/>context \
+		of the previous line. It is possible that the syntax is not accurate \
+		if you have<br/>tokens on multiple lines (multiline comments, xml tags ...) \
+		Soft wrap is also deactivated<br/><b>(best choice)</b></html>
+options.editing.largefilemode.option.nohighlight=No syntax highlight, no soft wrap
+#}}}
+
+
 #{{{ Mouse pane
 options.mouse.label=Mouse
 options.mouse.dragAndDrop=Drag and drop in text area
@@ -1646,6 +1668,8 @@ options.view.showFullPath=Show full path of buffer in title bar
 options.view.showSearchbar=Always show search bar
 options.view.beepOnSearchAutoWrap=Beep when searching automatically wraps
 options.view.showBufferSwitcher=Show buffer switcher
+options.view.bufferswitcher.sortBuffers=Sort Buffer Switcher
+options.view.bufferswitcher.sortByName=Sort Buffer Switcher by file name instead of path name
 options.view.bufferSwitcherMaxRowsCount=Visible rows in buffer switcher:
 options.view.sortBuffers=Sort buffer sets
 options.view.sortByName=Sort buffer sets by file name, instead of path name
diff --git a/org/jedit/localization/jedit_fr.props b/org/jedit/localization/jedit_fr.props
index 4fbc7a6..6ca3089 100644
--- a/org/jedit/localization/jedit_fr.props
+++ b/org/jedit/localization/jedit_fr.props
@@ -629,7 +629,7 @@ largeBufferDialog.defaultMode=Mode d'édition brut
 #{{{ I/O error dialog box
 ioerror.title=Erreur I/O
 ioerror.caption=Les {0} opérations I/O suivantes ont été interrompues :
-ioerror.caption-1=Cette opération I/O a été inerrompue :
+ioerror.caption-1=Cette opération I/O a été interrompue :
 
 ioerror={0}
 ioerror.directory-error=Impossible de lister les fichiers du dossier : {0}
diff --git a/org/jedit/localization/jedit_ko.props b/org/jedit/localization/jedit_ko.props
new file mode 100644
index 0000000..5f05011
--- /dev/null
+++ b/org/jedit/localization/jedit_ko.props
@@ -0,0 +1,2519 @@
+###
+### jEdit user interface definitions,
+### :tabSize=8:indentSize=8:noTabs=false:
+### :folding=explicit:collapseFolds=1:
+### :encoding=UTF-8:
+###
+### Copyright (C) 1998, 2005 Slava Pestov
+###
+
+#{{{ jEdit core (jedit_gui.props)
+
+#{{{ Default user catalog file
+defaultCatalog=<?xml version="1.0"?>\n\
+	<!DOCTYPE MODES SYSTEM "catalog.dtd">\n\
+	\n\
+	<MODES>\n\
+	\n\
+	<!-- Add lines like the following, one for each edit mode you add: -->\n\
+	<!-- <MODE NAME="foo" FILE="foo.xml" FILE_NAME_GLOB="*.foo" /> -->\n\
+	\n\
+	</MODES>
+#}}}
+
+#{{{ Common strings
+common.ok=확인
+common.cancel=취소
+common.close=닫기
+common.error=오류
+common.apply=적용
+common.more=더보기
+common.insert=삽입
+common.add=추가
+common.remove=삭제
+common.removeCurrent=현재의 것을 삭제
+common.moveUp=위로
+common.moveDown=아래로
+common.clearAll=전체 삭제
+common.selectAll=전체 선택
+common.selectNone=선택 해제
+common.loading=로딩...
+
+lineSep.unix=Unix (\\n)
+lineSep.windows=DOS/Windows (\\r\\n)
+lineSep.mac=MacOS (\\r)
+#}}}
+
+#{{{ Miscellaneous
+history.caption=입력 내역:
+
+action-set.jEdit=내장 명령
+action-set.browser=파일 시스템 브라우저
+action-set.macros=매크로
+action-set.plugin=플러그인: {0}
+
+macro-handler.beanshell.label=BeanShell 스크립트
+macro-handler.beanshell.glob=*.bsh
+
+save-layout-failed.message=도킹 레이아웃 저장 실패.
+load-layout.title=도킹 레이아웃 로드
+load-layout.message=로드할 도킹 레이아웃:
+save-layout.title=도킹 레이아웃 저장
+save-layout.message=저장할 도킹 레이아웃:
+#}}}
+
+#{{{ Tool bar
+view.search.find=검색 :
+view.search.close-tooltip=검색 바 숨기기 (ESC)
+
+view.action.prompt=액션 :
+view.action.no-completions=해당 액션이 없습니다.
+view.action.close-tooltip=액션 스크립트 창 닫기(ESC)
+#}}}
+
+#{{{ Context menu
+view.context.customize=이 메뉴를 설정하기...
+#}}}
+
+#{{{ System tray menu
+tray.newView.label=새 편집창
+tray.newPlainView.label=새 단순창
+tray.exit.label=종료
+#}}}
+
+#{{{ Menu bar
+
+#{{{ File menu
+file.label=파일($F)
+new-file.label=새 파일($N)
+new-file-in-mode.label=모드 지정 새 파일($M)
+new-file-in-mode.dialog.title=새 파일
+new-file-in-mode.dialog.message=편집 모드:
+open-file.label=열기($O)...
+reload.label=새로 고침($R)
+reload-all.label=전체 새로 고침($d)
+close-buffer.label=닫기($C)
+close-buffer.tooltip=현재 편집창 닫기
+global-close-buffer.label=닫기(global)
+global-close-buffer.tooltip=모든 창 및 편집창에서 버퍼를 닫습니다.
+closeall-except-active.tooltip=현재 편집창을 제외한 다른 창 닫기
+closeall-except-active.label=다른 창 닫기($t)
+closeall-bufferset.label=모두 닫기($e)
+closeall-bufferset.tooltip=모든 버퍼를 닫습니다.
+bufferset-toggle-exclusive.label=단독 버퍼 전환($x)
+bufferset-toggle-exclusive.tooltip=한 편집창을 선택하면, 버퍼 범위에 따라 해당 버퍼를 사용하는 다른 창을 닫습니다.
+close-all.label=모두 닫기(global)
+close-all.tooltip=모든 jEdit 뷰의 모든 버퍼를 닫습니다.
+save.label=저장($S)
+save-as.label=다른 이름으로 저장($a)...
+save-a-copy-as.label=사본 저장($y)...
+save-a-copy-as.tooltip=현재 편집 상태를 유지한 상태로 사본 저장
+save-all.label=전체 저장($l)...
+print.label=인쇄($P)...
+page-setup.label=인쇄 설정($g)...
+# Print selection not yet implemented
+#print-selection.label=Prin$t Selection...
+exit.label=종료($x)
+
+#{{{ Recent Files menu
+recent-files.label=최근 파일($F)
+recent-files.textfield.tooltip=필터나 와일드 카드를 입력해서 빠르게 찾을 수 있습니다.
+no-recent-files.label=최근 파일이 없습니다.
+clear-recent-files.label=최근 파일 지우기
+#}}}
+
+reload-encoding.label=인코딩 지정해서 다시 열기($E)
+reload-encoding.error=인코딩이 올바르지 않습니다. {0}
+
+#}}}
+
+#{{{ Edit menu
+
+edit.label=편집($E)
+undo.label=취소($U)
+redo.label=다시실행($R)
+cut.label=잘라내기($C)
+copy.label=복사($o)
+paste.label=붙여넣기($P)
+select-all.label=모두선택($A)
+word-count.label=단어수통계($W)...
+complete-word.label=단어자동완성($m)
+expand-abbrev.label=약어적용($x)
+goto-line.label=지정라인이동($G)...
+
+#{{{ More Clipboard menu
+clipboard.label=클립보드($b)
+cut-append.label=잘라서 덧붙이기($C)
+copy-append.label=복사 덧붙이기($o)
+vertical-paste.label=사각 붙여넣기($V)
+paste-previous.label=최근 붙여넣기($)...
+paste-deleted.label=삭제 항목 붙여넣기($D)...
+paste-special.label=형식을 선택해서 붙여넣기...
+cut-string-register.label=레지스터에 잘라내기($t)
+copy-string-register.label=레지스터에 복사($p)
+paste-string-register.label=레지스터 붙여넣기($R)
+clear-string-register.label=레지스터 지우기
+cut-append-string-register.label=레지스터에 잘라서 덧붙이기($n)
+copy-append-string-register.label=레지스터에 복사 덧붙이기($A)
+vertical-paste-string-register.label=레지스터 사각붙여넣기($e)
+view-registers.label=레지스터 보기($w)
+#}}}
+
+#{{{ More Selection menu
+selection.label=선택($S)
+select-none.label=선택 해제($N)
+select-word.label=단어 선택($W)
+select-line.label=행 선택($L)
+select-paragraph.label=단락 선택($P)
+invert-selection.label=반전 선택($I)
+toggle-multi-select.label=다중선택 모드($M)
+toggle-rect-select.label=사각선택 모드($R)
+select-line-range.label=행범위 선택($c)...
+#}}}
+
+#{{{ Text menu
+text.label=텍스트($T)
+delete-line.label=행단위 삭제($D)
+delete-start-line.label=행의 시작까지 삭제($S)
+delete-end-line.label=행의 끝까지 삭제($E)
+join-lines.label=한 행으로 만들기($J)
+delete-paragraph.label=단락 삭제($P)
+format-paragraph.label=단락 형식 정비($F)
+to-lower.label=소문자로($L)
+to-upper.label=대문자로($U)
+#}}}
+
+#{{{ Indent menu
+indent.label=들여쓰기($I)
+indent-lines.label=들여쓰기 취소($I)
+shift-left.label=좌측 들여쓰기($L)
+shift-right.label=우측 들여쓰기($R)
+remove-trailing-ws.label=후행 공백 제거($W)
+spaces-to-tabs.label=공백을 탭으로($S)
+tabs-to-spaces.label=탭을 공백으로($T)
+#}}}
+
+#{{{ Source menu
+source.label=소스 코드($e)
+range-comment.label=블럭 주석($R)
+line-comment.label=행 주석($L)
+select-block.label=코드블럭 선택($S)
+match-bracket.label=짝 괄호로 이동($M)
+prev-bracket.label=이전 괄호로($P)
+next-bracket.label=다음 괄호로($N)
+#}}}
+
+#}}}
+
+#{{{ Search menu
+search.label=검색($S)
+find.label=찾기/바꾸기($F)...
+find-next.label=다음 찾기($n)
+find-prev.label=이전 찾기($v)
+search-in-open-buffers.label=모든 버퍼에서 검색($B)...
+search-in-directory.label=디렉토리에서 검색($D)...
+replace-in-selection.label=선택 범위에서 바꾸기($R)
+replace-and-find-next.label=바꾸기 및 다음 찾기($p)
+replace-all.label=모두 바꾸기($A)
+quick-search.label=빠른 검색($I)
+hypersearch.label=빠른 하이퍼 검색($H)
+quick-search-word.label=선택 단어 빠른 검색($n)
+hypersearch-word.label=선택 단어 빠른 하이퍼 검색($y)
+whole-word.label=단어 일치 옵션($W)
+ignore-case.label=대소문자 가리지 않음($C)
+regexp.label=정규식($x)
+hypersearch-results.label=하이퍼 검색 결과
+#}}}
+
+#{{{ Markers menu
+markers.label= 마커($M)
+add-marker.label=마커 추가/삭제($A)
+add-marker-shortcut.label=단축키로 마커 추가($W)
+remove-all-markers.label=모든 마커 지우기($m)
+goto-marker.label=마커로 이동($G)
+select-marker.label=마커까지 선택($S)
+swap-marker.label=마커 교환 및 이동($p)
+prev-marker.label=이전 마커로 이동($P)
+next-marker.label=다음 마커로 이동($N)
+no-markers.label=마커가 없습니다
+markers.blank-line=[빈라인]
+#}}}
+
+#{{{ Folding menu
+folds.label=접기($o)
+collapse-fold.label=접기($C)
+expand-one-level.label=한 단계 펴기($E)
+expand-fold.label=모든 단계 펴기($F)
+collapse-all-folds.label=모든 묶음 접기($A)
+expand-folds.label=단계를 지정해서 펴기($l)
+expand-all-folds.label=모든 묶음 펴기($x)
+select-fold.label=묶음 선택($S)
+add-explicit-fold.label=명시적 묶음 추가($d)
+narrow-to-fold.label=묶음만 보기($r)
+narrow-to-selection.label=선택만 보기($w)
+parent-fold.label=상위 묶음으로 이동($G)
+prev-fold.label=이전 묶음으로($P)
+next-fold.label=다음 묶음으로($N)
+#}}}
+
+#{{{ View menu
+view.label=보기($V)
+new-view.label=jEdit 뷰 추가 열기($V)
+new-view.tooltip=별도의 새 jEdit 뷰를 엽니다.
+new-plain-view.label=jEdit 단순뷰 추가 열기($w)
+new-plain-view.tooltip=툴바와 도구창이 없는 jEdit 뷰를 새로 엽니다.
+close-view.label=jEdit 닫기($C)
+close-view.tooltip=jEdit를 닫습니다, 다른 jEdit 창이 없으면 jEdit를 종료합니다.
+prev-buffer.label=이전 버퍼로 이동($P)
+next-buffer.label=다음 버퍼로 이동($N)
+recent-buffer.label=최근 버퍼로 이동($R)
+toggle-buffer-switcher.label=버퍼 전환창 보기($B)
+focus-buffer-switcher.label=버퍼 전환창 바로가기($w)
+toggle-line-numbers.label=행번호 보기($L)
+toggle-statusbar.label=상태창 보기($t)
+toggle-gutter.label=행 정보영역 보기($G)
+show-context-menu.label=Show Context Menu
+set-view-title.label=jEdit 창 이름 설정...
+set-view-title.tooltip=jEdit 창 사이에 분별하기 쉽도록 이름을 붙입니다.
+toggle-full-screen.label=창 최대화 보기($f)
+
+#{{{ Scrolling menu
+scrolling.label=스크롤($g)
+scroll-to-current-line.label=현재 라인까지 스크롤($t)
+scroll-and-center.label=스크롤하고 화면 가운데 커서 위치($S)
+center-caret.label=화면 가운데 커서 위치($C)
+scroll-up-line.label=위로 행 스크롤($U)
+scroll-down-line.label=아래로 행 스크롤($D)
+scroll-up-page.label=위로 페이지 스크롤($p)
+scroll-down-page.label=아래로 페이지 스크롤($o)
+#}}}
+
+#{{{ Splitting menu
+splitting.label=창 나누기($S)
+split-horizontal.label=상하로 나누기($H)
+split-vertical.label=좌우로 나누기($V)
+unsplit-current.label=현재창 합치기($U)
+unsplit.label=모든창 합치기($A)
+resplit.label=복원($R)
+prev-textarea.label=이전 창으로 이동($P)
+next-textarea.label=다음 창으로 이동($N)
+buffersets.label=버퍼($B)
+global-bufferset.label=전역 버퍼($G)
+global-bufferset.tooltip=모든 편집창은 동일한 버퍼를 다룹니다.
+view-bufferset.label=jEdit 뷰 단위 버퍼($V)
+view-bufferset.tooltip=jEdit 뷰 단위 내에서만 동일한 버퍼를 다룹니다.
+editpane-bufferset.label=편집창 단위 버퍼($E)
+editpane-bufferset.tooltip=각 편집창은 독립된 버퍼를 다룹니다.
+#}}}
+
+#{{{ Docking menu
+docking.label=도킹($D)
+docking.menu.label=도킹 가능 메뉴
+toggle-dock-areas.label=도킹 영역($A)
+left-docking-area.label=좌측 도킹 영역으로($L)
+top-docking-area.label=상단 도킹 영역으로($T)
+right-docking-area.label=우측 도킹 영역으로($R)
+bottom-docking-area.label=하단 도킹 영역으로($B)
+focus-textarea.label=편집창 영역으로
+close-docking-area.label=현재 도킹 영역 닫기($C)
+layout-load.label=도킹 레이아웃 들여오기($L)...
+layout-save.label=도킹 레이아웃 저장($S)...
+layout-load-current-mode.label=현재 모드 도킹 레이아웃 들여오기
+layout-save-current-mode.label=현재 모드 도킹 레이아웃 저장
+#}}}
+
+#}}}
+
+#{{{ Utilities menu
+
+utils.label=도구($U)
+vfs.browser.label=파일 시스템 브라우저($F)
+action-bar.label=액션 스크립트 창($A)
+last-action.label=마지막 액션 다시수행($p)
+buffer-options.label=버퍼 옵션($B)...
+global-options.label=전역 옵션($G)...
+combined-options.label=옵션($O)...
+
+#{{{ Recent Directories menu
+recent-directories.label=최근 디렉토리($R)
+no-recent-dirs.label=최근 디렉토리가 없습니다
+#}}}
+
+#{{{ Favorites menu
+favorites.label=즐겨찾기($v)
+add-buffer-to-favorites.label=즐겨찾기에 버퍼 추가
+add-dir-to-favorites.label=즐겨찾기에 디렉토리 추가
+edit-favorites.label=즐겨찾기 편집
+#}}}
+
+#{{{ Current Directory menu
+current-directory.label=현재 디렉토리($C)
+#}}}
+
+#{{{ jEdit Home Directory menu
+jedit-directory.label=jEdit 홈 디렉토리($j)
+#}}}
+
+#{{{ Settings Directory menu
+settings-directory.label=jEdit 설정 디렉토리($S)
+#}}}
+
+#{{{ BeanShell menu
+beanshell.label=B$eanShell
+eval.label=BeanShell 실행($E)...
+eval-for-selected-lines.label=선택행에 BeanShell 실행($F)...
+eval-selection.label=선택 스크립트 실행($S)
+#}}}
+
+#{{{ Troubleshooting menu
+troubleshooting.label=문제 해결($T)
+log-viewer.label=작업 로그 보기($A)
+update-log.label=작업 로그 디스크에 갱신($U)
+io-progress-monitor.label=$I/O 진행 상황
+task-monitor.label=작업 관리자($T)
+keyboard-tester.label=키보드 테스터($K)...
+memory-status.label=메모리 정리 및 상태 조회($M)...
+reload-modes.label=편집모드 재정리($R)
+#}}}
+
+#{{{ Quick options menu
+quick-options.label=$빠른 설정
+edit-syntax-style.label=커서 위치에 있는 문법 스타일을 수정합니다.
+#}}}
+
+#}}}
+
+#{{{ Macros menu
+macros.label=매크로($c)
+new-macro.label=새 매크로
+record-macro.label=매크로 기록($R)...
+stop-recording.label=매크로 기록 중지($S)
+last-macro.label=마지막 매크로 다시 실행
+record-temp-macro.label=임시 매크로 기록($T)
+run-temp-macro.label=임시 매크로 실행($p)
+run-other-macro.label=다른 매크로 실행($O)...
+rescan-macros.label=매크로 재정리($n)
+no-macros.label=매크로가 없습니다.
+#}}}
+
+#{{{ Plugins menu
+plugins.label=플러그인($P)
+plugin-manager.label=플러그인 관리자($M)...
+plugin-options.label=플러그인 옵션($O)...
+no-plugins.label=설치된 플러그인이 없습니다
+#}}}
+
+#{{{ Help menu
+help-menu.label=도움말($H)
+about.label= jEdit에 대하여($A)...
+help.label=jEdit 도움말($H)
+tip-of-the-day.label=오늘의 팁($T)
+userFeedback.label=건의하기...
+#}}}
+
+#}}}
+
+#{{{ Macro strings
+
+macro.temp.header=// 임시 매크로입니다. 우선 의도하신대로 매크로가\n\
+		  // 작성되었는지 확인하세요.\n\
+		  // 그 다음에 임시 매크로를 적용할 버퍼로 이동한후\n\
+		  // 매크로>임시 매크로 실행을 선택하세요.
+
+macro.header=// 기록 완료한 매크로입니다. 우선 의도하신대로\n\
+	     // 매크로가 작성되었는지 확인하세요. 그 다음에 \n\
+	     // 이 버퍼를 저장하시면 매크로 메뉴에 보여집니다.
+
+#}}}
+
+#{{{ Commands that don't appear in menus
+backspace-word.label=이전 단어 삭제
+backspace-word-std.label=이전 단어 삭제(공백 포함)
+backspace-word-std-after.label=이전 단어 삭제(단어 뒤 공백 포함)
+backspace.label=이전 문자 삭제
+delete-word.label=다음 단어 삭제
+delete-word-std.label=다음 단어 삭제(공백 포함)
+delete.label=다음 문자 삭제
+document-end.label=버퍼 끝으로 이동
+document-home.label=버퍼 시작으로 이동
+end.label=끝
+home.label=시작
+smart-end.label=끝(공백 제외)
+smart-home.label=시작(공백 제외)
+insert-literal.label=직후에 리터럴 문자 삽입
+insert-newline.label=줄 바꿈 삽입
+insert-newline-indent.label=줄 바꿈과 들여쓰기 삽입
+insert-tab.label=탭 삽입
+insert-tab-indent.label=탭과 들여쓰기 삽입
+line-end.label=행 끝으로
+line-home.label=행 시작으로
+next-char.label=다음 문자로
+next-line.label=다음 행으로
+next-page.label=다음 페이지로
+next-paragraph.label=다음 단락으로
+next-word.label=다음 단어로
+next-word-std.label=다음 단어로(공백 포함)
+overwrite.label=덮어쓰기 모드
+prev-char.label=이전 문자로
+prev-line.label=이전 행으로
+prev-page.label=이전 페이지로
+prev-paragraph.label=이전 단락으로
+prev-word.label=이전 단어로
+prev-word-std.label=이전 단어로(공백 포함)
+prev-word-std-after.label=이전 단어로(단어 뒤 공백 포함)
+select-document-end.label=버퍼 끝까지 선택
+select-document-home.label=버퍼 시작까지 선택
+select-end.label=버퍼 끝(공백 제외)까지 선택
+select-home.label=버퍼 시작(공백 제외)까지 선택
+select-line-end.label=행 끝까지 선택
+select-line-home.label=행 시작까지 선택
+select-next-char.label=다음 문자까지 선택
+select-next-line.label=다음 행까지 선택
+select-next-page.label=다음 페이지까지 선택
+select-next-paragraph.label=다음 단락까지 선택
+select-next-word.label=다음 단어까지 선택
+select-next-word-std.label=다음 단어까지 선택(공백 포함)
+select-prev-char.label=이전 문자까지 선택
+select-prev-line.label=이전 행까지 선택
+select-prev-page.label=이전 페이지까지 선택
+select-prev-paragraph.label=이전 단락까지 선택
+select-prev-word.label=이전 단어까지 선택
+select-prev-word-std.label=이전 단어까지 선택(공백 포함)
+select-prev-word-std-after.label=이전 단어까지 선택(단어 뒤 공백 포함)
+select-visible-end.label=마지막 표시줄까지 선택
+select-visible-home.label=첫 표시줄까지 선택
+select-whitespace-end.label=공백 끝까지 선택
+select-whitespace-home.label=공백 시작까지 선택
+toggle-line-separator.label=행 구분자 전환
+toggle-word-wrap.label=폭 맞추기 전환
+visible-end.label=마지막 표시줄로 이동
+visible-home.label=첫 표시줄로 이동
+whitespace-end.label=공백 끝으로 이동
+whitespace-home.label=공백 시작으로 이동
+#}}}
+
+#{{{ View stuff
+
+# Title
+view.title=jEdit -\u0020
+view.title.dirty=\ (변경함)
+
+view.docking.close-tooltip=현재 도킹창을 숨김
+view.docking.menu-tooltip=도킹 옵션
+view.docking.menu-floating=유동
+view.docking.menu-top=상단 도킹
+view.docking.menu-left=좌측 도킹
+view.docking.menu-bottom=하단 도킹
+view.docking.menu-right=우측 도킹
+view.docking.menu-clone=새 유동 창
+view.docking.menu-close=닫기
+view.docking.menu-undock=도킹 해제
+
+view.docking.toggle.label={0}
+view.docking.float.label={0} (새 유동 창)
+
+directory.not-local=원격 파일 시스템의 파일 목록을 볼수 없습니다.
+directory.no-files=파일이 없습니다
+
+#{{{ Gutter highlight
+view.gutter.marker.no-name=마커
+view.gutter.marker=마커: {0}
+#}}}
+
+#{{{ Status messages
+view.status.add-marker=새로운 마커에 대한 단축키? [{0}]
+view.status.auto-wrap=검색어를 찾을 수 없습니다; 처음/끝부터 다시 검색합니다!
+view.status.bracket=찾은 행 {0}: {1}
+view.status.caret-tooltip=행, 열 (위치/길이)
+view.status.copy-append-string-register=복사 덧붙이기할 레지스터? [{0}]
+view.status.copy-string-register=복사할 레지스터? [{0}]
+view.status.cut-append-string-register=잘라서 덧붙이기할 레지스터 ? [{0}]
+view.status.cut-string-register=잘라내기해서 붙일 레지스터? [{0}]
+view.status.expand-folds=묶음 단계? [1-9]
+view.status.goto-marker=이동할 마커의 단축키? [{0}]
+view.status.incomplete-abbrev={0}개 파라미터를 입력했으나 {1}개를 입력해야 합니다!
+view.status.insert-literal=리터럴 문자로 삽입한 키?
+view.status.io-1=I/O: 한 개의 작업이 진행중입니다
+view.status.io.done=입출력 종료
+view.status.io=I/O: {0}개의 작업이 진행중입니다
+view.status.linesep-changed={0}로 행 구분자 변경
+view.status.linesep-tooltip=행 구분자(변경하려면 클릭하세요)
+view.status.memory-tooltip=자바 메모리: {0}Kb/{1}Kb
+view.status.mode-tooltip=현재 편집모드, 접기모드, 인코딩
+view.status.multi-changed=다중선택모드 {0,choice,0#끔|1#켬}
+view.status.multi-tooltip=다중선택모드(변경하려면 클릭하세요)
+view.status.narrow=모든 텍스트를 다시 보려면 "모든 묶음 펴기"를 수행하세요
+view.status.no-markers=마커가 없습니다.
+view.status.no-registers=정의한 레지스터가 없습니다.
+view.status.overwrite-changed=덮어쓰기 모드 {0,choice,0#끔|1#켬}
+view.status.overwrite-tooltip=덮어쓰기/삽입 모드(변경하려면 클릭하세요)
+view.status.paste-string-register=붙여넣기할 레지스터? [{0}]
+view.status.print={0} 페이지 인쇄중
+view.status.quick-copy=빠른 복사 모드 - 표시된 텍스트로 선택 영역을 바꿉니다
+view.status.recording=매크로 기록중
+view.status.rect-select-changed=사각선택모드 {0,choice,0#끔|1#켬}
+view.status.rect-tooltip=사각선택모드(변경하려면 클릭하세요)
+view.status.replace-all={1}파일에서 {0}개를 바꾸었습니다
+view.status.search-not-found=찾기 대상을 찾지 못했습니다!
+view.status.select-marker=선택할 마커의 단축키? [{0}]
+view.status.swap-marker=교환/이동에 적용할 마커의 단축키? [{0}]
+view.status.vertical-paste-string-register=사각 붙여넣기에 사용할 레지스터? [{0}]
+view.status.wrap-changed=폭맞추기 모드 "{0}"
+view.status.wrap-tooltip=<html>폭맞추기 모드: {0} (변경하려면 클릭하세요)</html>
+view.status.indent-tooltip=자동들여쓰기(변경하려면 클릭하세요)
+view.status.autoindent-changed=자동들여쓰기 상태 "{0}"
+view.status.bufferset-tooltip=버퍼 범위 : {0}
+wrap.none=사용안함
+wrap.hard=하드
+wrap.soft=소프트
+#}}}
+
+#{{{ Status bar component visibility
+
+#}}}
+
+#}}}
+
+#{{{ Printing
+
+print.headerText=jEdit - {0}
+print.footerText={0} :: {1} 페이지
+
+print-error.title=인쇄 오류
+print-error.message=인쇄 과정에서 오류가 발생했습니다:\n\
+	{0}
+#}}}
+
+#{{{ Various dialog boxes
+
+#{{{ About dialog
+about.title=jEdit에 대하여
+about.version=jEdit {0} {1} 모드, {2} Java {3} 사용
+about.mode.standalone=단독
+about.mode.server=서버
+about.mode.server-background=서버-백그라운드
+about.navigate=자세한 내용을 보시려면 방향키를 사용하세요
+
+# This text scrolls by in the about dialog box.
+# Hack: Since StringTokenizer treats two consequent \n as one token, we
+# insert a space by itself in the text to create blank lines.
+about.text.prefix=jEdit 기여자는 다음과 같습니다
+about.text.suffix=이들의 의견과 버그 리포팅에 감사 드립니다.
+#}}}
+
+#{{{ Error list dialog, used to report I/O and plugin load errors
+error-list.plugin-manager=플러그인 관리자
+#}}}
+
+#{{{
+largeBufferDialog.title=매우 큰 파일 {0}
+largeBufferDialog.message=매우 큰 파일은 문법 표시로 인해 응답이 없을 수도 있습니다 \n\
+	다음과 같은 옵션을 검토하세요.\n\
+	-전체 문법 표시 : jEdit의 문법 표시 기능은 그대로 동작 시킴 \n\
+	매우 느려집니다. 사용에 주의해야 합니다.\n\
+	-불완전하게 문법 표시 : 이경우 jEdit는 빠르게 동작할 수 \n\
+	있지만, 문맥을 무시한 문법 표시로 불완전한 결과이며\n\
+	soft 폭 맞추기도 동작하지 않습니다\n\
+	-텍스트 편집 모드 : 문법 표시와 soft 폭 맞추기 안함
+largeBufferDialog.fullSyntax=전체 문법 표시
+largeBufferDialog.contextInsensitive=불완전하게 문법 표시
+largeBufferDialog.defaultMode=텍스트 편집 모드
+#}}}
+
+#{{{ I/O error dialog box
+ioerror.title=입출력 에러
+ioerror.caption={0} 입출력 작업을 완료할 수 없습니다:
+ioerror.caption-1=입출력 작업을 완료할 수 없습니다:
+
+ioerror={0}
+ioerror.directory-error=디렉토리 리스팅 불가: {0}
+ioerror.directory-error-nomsg=디렉토리 리스팅 불가.
+ioerror.encoding-error="{0}"인코딩으로 파일을 읽을 수 없습니다(데이터 소실 가능).\n\
+	({1})\n\
+	다른 인코딩으로 다시 시도해 보세요.\n\
+	파일->인코딩 지정해서 다시 읽기로 가능합니다.\n\
+	다시 읽기를 자동으로 하려면 전역옵션->인코딩 섹션에\n\
+	대체 인코딩 목록으로 인코딩 후보 군을 입력하세요.
+ioerror.write-encoding-error=문자 인코딩 실패\n\
+	{3} 열:{2} 행:{1} 인코딩:"{0}".
+ioerror.read-error=읽기 불가: {0}
+ioerror.write-error=저장 불가: {0}
+ioerror.unsupported-encoding-error={0} 문자세트는 현재 Java 가상머신에서 지원하지 않습니다
+ioerror.open-directory=디렉토리는 버퍼로 열수 없습니다.
+ioerror.save-directory=디렉토리에 버퍼를 저장할 수 없습니다.
+ioerror.no-read=파일을 읽을 권한이 부족합니다.
+ioerror.no-write=파일을 저장할 권한이 부족합니다.
+ioerror.write-error-readonly=저장할 수 없습니다. 파일은 읽기 전용입니다.
+ioerror.save-readonly-twostagefail=저장할 수 없습니다. 파일이 읽기 전용이고 2단계 저장이 불가능합니다.
+ioerror.badurl=잘못된 URL: {0}
+ioerror.delete-error=파일을 삭제할 수 없습니다.
+ioerror.rename-exists=기존 파일 {0}을 덮어 쓸 수 없습니다.
+ioerror.rename-error={0}로 이름을 변경할 수 없습니다.
+ioerror.mkdir-error=디렉토리를 만들 수 없습니다.
+ioerror.backup-failed=백업 실패. "저장 및 백업" 옵션을 확인하세요.
+ioerror.backup-same-name=백업 파일명과 원본 파일명이 동일합니다.
+ioerror.copy-self=파일을 자신에게 복사하는 것은 파괴적입니다. 작업이 거부되었습니다: {0}
+
+vfs.not-supported.list="{0}" 파일 시스템의 디렉토리는 조회할 수 없습니다.
+vfs.not-supported.load="{0}" 파일 시스템의 파일은 열수 없습니다.
+vfs.not-supported.save="{0}" 파일 시스템에 파일을 저장 할 수 없습니다.
+
+vfs.overwrite-readonly.title=파일은 읽기 전용입니다
+vfs.overwrite-readonly.message={0}은 읽기 전용입니다.\n\
+	읽기 전용 플래그를 재설정하여 저장을 계속하겠습니까?\n\
+	2단계 저장을 사용합니다
+
+vfs.twostageimpossible.title=2단계 저장 사용 불가
+vfs.twostageimpossible.message=2단계 저장을 사용할 수 없습니다.\n\
+	저장을 계속 하시겠습니까 ?
+
+out-of-memory-error=요청 수행을 위한 자바 메모리가 부족합니다.\n\
+	최대 메모리 크기를 늘리세요.\n\
+	\n\
+	-mx640m 처럼 자바 가상머신에 메모리 옵션을 부여합니다.
+#}}}
+
+#{{{ Old I/O error dialog boxes
+ioerror.message=입출력 에러가 발생했습니다. ({0})
+
+read-error.title=읽기 에러
+# {0} - the path name {1} - the error message
+read-error.message={0} 파일은\n\
+	입출력 에러 때문에 읽을 수 없습니다.\n\
+	({1})
+
+write-error.title=쓰기 에러
+# {0} - the path name {1} - the error message
+write-error.message={0} 파일은\n\
+	입출력 에러 때문에 저장할 수 없습니다.\n\
+	({1})
+
+directory-error.title=디렉토리 에러
+# {0} - the path name {1} - the error message
+directory-error.message={0} 디텍토리는\n\
+	입출력 에러 때문에 목록을 조회할 수 없습니다.\n\
+	({1})
+
+directory-error-nomsg.title=디렉토리 에러
+# {0} - the path name
+directory-error-nomsg.message={0} 디텍토리는\n\
+	입출력 에러 때문에 목록을 조회할 수 없습니다.
+
+encoding-error.title=호환되지 않은 인코딩
+encoding-error.message={0} 파일은\n\
+	"{1}" 인코딩으로 읽을 수 없습니다.\n\
+	({2})\n\
+	\n\
+	다른 인코딩으로 다시 시도해 보세요.\n\
+	파일->인코딩 지정해서 다시 읽기로 가능합니다.\n\
+	\n\
+	인코딩을 잘모르면 "ASCII" 또는 "8859_1"로 시도해 보세요.
+
+open-directory.title=디렉토리를 열수 없습니다
+open-directory.message={0}는 디렉토리입니다.\n\
+	편집용으로 디렉토리를 열수 없습니다.
+
+save-directory.title=디렉토리를 저장할 수 없습니다
+save-directory.message={0}는 디렉토리입니다.\n\
+	버퍼를 디렉토리에 저장할 수 없습니다.
+
+no-read.title=파일을 열 수 없습니다
+no-read.message={0}에서 읽을 수 없습니다.\n\
+	권한을 확인해 보세요.
+
+no-write.title=파일을 저장할 수 없습니다
+no-write.message={0}에 저장할 수 없습니다.\n\
+	권한을 확인해 보세요.
+
+badurl.title=잘못된 URL
+# {0} - the URL
+# {1} - the error
+badurl.message=다음은 잘못된 URL입니다: {0}\n\
+	({1})
+#}}}
+
+#{{{ Go to line dialog
+goto-line.title=행번호로 이동
+goto-line.message=행번호 ({0} - {1}):
+#}}}
+
+#{{{ Word count dialog
+wordcount.title=단어수 통계
+# {0} - 문자
+# {1} - 단어
+# {2} - 행
+wordcount.message=문자수: {0}\n단어수: {1}\n행수: {2}
+#}}}
+
+#{{{ Set marker dialog
+setmarker.title=마커 설정
+setmarker.message=마커 이름:
+#}}}
+
+#{{{ File not saved dialog
+notsaved.title=파일을 저장하지 않았습니다.
+# {0} - file name
+notsaved.message={0}에 변경 내용을 저장하시겠습니까?
+#}}}
+
+#{{{ File changed, still reload dialog
+changedreload.title=파일이 변경됨
+changedreload.message={0} 파일이\n\
+	변경되었습니다;  변경 내용을 불러오면,\n\
+	현재 변경 내용이 지워집니다. 계속하시겠습니까?
+#}}}
+
+#{{{ Autosave file exists dialog
+autosave-found.title=자동 저장 파일 있음
+# {0} - autosave file name
+autosave-found.message={0} 자동 저장 파일이 있습니다!\n\
+	이전 작업에서 저장하기 전에 jEdit가 비정상 종료했을 가능성이 있습니다.\n\
+	자동 저장 파일을 여시겠습니까?
+
+autosave-loaded.title=자동 저장 파일을 로드했습니다
+autosave-loaded.message={0} 자동 저장 파일을 로드했습니다. \n\
+	저장하지 않은 자료가 있는지 확인하고 해당 자료를 유지하려면 저장하세요.\n\
+	저장하지 않았던 자료를 무시하려면 파일->새로고침 하세요.
+#}}}
+
+#{{{ Save all confirm dialog
+saveall.title=모든 버퍼 저장
+saveall.message=변경한 모든 버퍼를 저장 하시겠습니까?
+#}}}
+
+#{{{ Reload all confirm dialog
+reload-all.title=모든 버퍼 새로고침
+reload-all.message=모든 버퍼를 원본으로부터 새로고침 하시겠습니까?\n\
+	버퍼 내용중 저장하지 않은 것은 버려집니다!
+#}}}
+
+#{{{ Encoding prompt
+encoding-prompt.title=인코딩 지정해서 다시 읽기
+encoding-prompt.message=사용할 문자 인코딩:
+#}}}
+
+#{{{ Macro recording already in progress dialog
+already-recording.title=이미 기록중입니다
+already-recording.message=한 매크로가 현재 기록중입니다.
+#}}}
+
+#{{{ No temporary macro dialog
+no-temp-macro.title=임시 매크로가 없습니다
+no-temp-macro.message=아직 임시매크로를 기록하지 않았습니다.
+#}}}
+
+#{{{ Record macro dialog
+record.title=매크로 기록
+record.message=매크로 이름:
+#}}}
+
+#{{{ Some features don't work with -nosettings dialog
+no-settings.title=기능을 사용할 수 없습니다
+no-settings.message=jEdit를 -nosettings 스위치로 시작했습니다.\n\
+	이 기능을 사용하려면 이 스위치를 빼고 jEdit를 시작하세요.
+#}}}
+
+#{{{ Some features don't work with the web start version
+no-webstart.title=기능을 사용할 수 없습니다
+no-webstart.message=이 기능은 jEdit 웹 가동 버전에서는 사용할 수 없습니다.
+#}}}
+
+#{{{ Search and replace dialog
+search.title=찾기/바꾸기
+
+search.find=찾기 대상:
+search.find.tooltip=위/아래 페이지 이동키 또는 우측 마우스 클릭 하면 이전 찾기를 선택할 수 있습니다
+search.find.mnemonic=s
+search.replace=바꾸기 내용:
+search.replace.mnemonic=w
+search.string-replace-btn=텍스트
+search.beanshell-replace-btn=BeanShell 코드의 리턴값
+
+search.settings=설정:
+search.keep=창유지
+search.keep.mnemonic=k
+search.word=전체 단어 (q)
+search.word.bar=전체 단어
+search.word.mnemonic=q
+search.case=대소문자 구분 안함
+search.case.mnemonic=i
+search.regexp=정규식
+search.regexp.mnemonic=x
+search.hypersearch=하이퍼검색
+search.hypersearch.mnemonic=h
+search.wrap=자동 순환
+search.wrap.mnemonic=t
+
+search.direction=방향:
+search.back=뒤로
+search.back.mnemonic=b
+search.forward=앞으로
+search.forward.mnemonic=o
+
+search.fileset=찾기 영역:
+search.selection=선택 범위
+search.selection.mnemonic=n
+search.current=현재 버퍼
+search.current.mnemonic=c
+search.all=모든 버퍼
+search.all.mnemonic=l
+search.directory=디렉토리:
+search.directory.mnemonic=d
+search.skipHidden=백업이나 숨김 파일 생략
+search.skipBinary=이진파일 생략
+search.skipHidden.mnemonic=h
+search.skipBinary.mnemonic=b
+
+search.directoryField=디렉토리:
+search.directoryField.mnemonic=y
+search.filterField=필터:
+search.filterField.mnemonic=f
+glob.tooltip=여러 확장자 표시 방식 {*.c,*.h}
+search.subdirs=하위 디렉토리 검색
+search.subdirs.mnemonic=u
+search.choose=선택...
+search.choose.mnemonic=e
+search.synchronize=동기화
+search.synchronize.mnemonic=z
+search.synchronize.tooltip=필터와 디렉토리를 현재 버퍼의 내용을 참조해서 설정.
+search.findBtn=찾기
+search.findBtn.mnemonic=f
+search.replaceBtn=바꾸기
+search.replaceBtn.mnemonic=p
+search.replaceAndFindBtn=바꾸고 계속 찾기
+search.replaceAndFindBtn.mnemonic=r
+search.replaceAllBtn=모두 바꾸기
+search.replaceAllBtn.mnemonic=a
+
+# Beep when searching automatically wraps?
+
+#}}}
+
+#{{{ Keep searching dialog
+keepsearching.title=더이상 일치하는 내용을 찾을 수 없습니다
+keepsearching.message=더이상 일치하는 내용을 찾을 수 없습니다. \n\
+	{0,choice,0#처음|1#끝} 부터 계속 찾겠습니까?
+#}}}
+
+#{{{ HyperSearch results dialog
+hypersearch-results.title=하이퍼검색 결과
+hypersearch-results.result-caption={0} ({1,choice,1#1 항목|1<{1,number,integer} 항목,  '{2,choice,1#1 파일|1<{2,number,integer} 파일}'})
+hypersearch-results.open=열기
+hypersearch-results.open-view=새 jEdit 뷰에서 열기
+hypersearch-results.open-plain-view=새 jEdit 단순뷰에서 열기
+hypersearch-results.open-split=새 분할에서 열기
+hypersearch-results.remove-node=항목 지우기
+hypersearch-results.new-search=여기서 새 검색
+hypersearch-results.expand-child-nodes=하위 노드 열기
+hypersearch-results.collapse-child-nodes=하위 노드 접기
+hypersearch-results.copy-to-clipboard=클립보드에 복사
+hypersearch-results.redo=하이퍼검색 다시 수행
+hypersearch-results.tree-view=트리 형태 결과
+hypersearch-results.clear.label=모든 항목 지우기
+hypersearch-results.stop.label=하이퍼검색을 중단하고 현재 결과 출력
+hypersearch-results.multi.label=다중 검색 결과
+hypersearch-results.highlight.label=검색 결과 출력 스타일 설정
+hypersearch-results.file-caption={0} ({1,choice,1#1 항목|1<{1,number,integer} 항목, '{2,choice,1#1 행|1<{2,number,integer} 행}'})
+hypersearch-results.searching="{0}"검색 결과...
+hypersearch-results.no-results="{0}"에 대한 검색 결과가 없습니다.
+hypersearch-results.done="{0}"결과:
+
+hypersearch-status=검색중
+#}}}
+
+#{{{ HyperSearch too many results
+hypersearch.tooManyResults.label=결과가 너무 많습니다
+hypersearch.tooManyResults.title=결과가 너무 많습니다
+hypersearch.tooManyResults.message={0}개의 검색 결과가 있고 \
+	아직 끝나지 않은 상태입니다. 멈출까요 ?
+#}}}
+
+
+#{{{ Search and replace error dialog
+searcherror.title=찾기/바꾸기 오류
+# {0} - error message
+searcherror.message=작업중 오류가 발생했습니다.
+#}}}
+
+#{{{ Search and replace error dialog
+searcherror-bsh.title=찾기/바꾸기 오류
+# {0} - error message
+searcherror-bsh.message=작업중 오류가 발생했습니다.\n\
+	\n\
+	바꾸기 내용이 BeanShell 코드로 처리되는 의도가 아니라면  \n\
+	바꾸기 모드가 "텍스트"로 되어 있는지 확인하세요.
+#}}}
+
+#{{{ Empty fileset error dialog
+empty-fileset.title=대상 파일이 없습니다
+empty-fileset.message=검색 대상 파일이 없습니다.\n\
+	검색할 파일 필터와 디렉토리를 확인하세요.
+#}}}
+
+#{{{ Can only search local directories dialog
+remote-dir-search.title=로컬 디렉토리 확인
+remote-dir-search.message=검색 대상이 로컬 디렉토리가 아닙니다.\n\
+	네트워크 문제 등으로 매우 느릴 수 있습니다.\n\
+	계속 하시겠습니까?
+#}}}
+
+#{{{ "Search in selection" active but nothing selected in text area
+search-no-selection.title=선택하지 않았습니다
+search-no-selection.message=검색 대상을 선택하거나 \n\
+	검색 범위에서 "선택 영역"을 해제하세요.
+#}}}
+
+#{{{ Paste previous and paste deleted dialogs
+paste-from-list.whitespace=<whitespace>
+paste-previous.title=최근 붙여넣기
+paste-previous.caption=최근에 복사/붙여넣기한 텍스트:
+paste-deleted.title=삭제항목 붙여넣기
+paste-deleted.caption=최근에 삭제한 텍스트:
+#}}}
+
+#{{{ File changed on disk dialog
+filechanged-save.title=파일이 변경됨
+filechanged-save.message={0} 파일이\n\
+	다른 프로그램에 의해서 변경되었습니다.\n\
+	저장을 계속하시겠습니까?
+#}}}
+
+#{{{ File exists dialog
+fileexists.title=파일이 존재합니다
+fileexists.message={0} 파일이 이미 존재합니다. \n\
+	덮어쓰기를 하시겠습니까?
+#}}}
+
+#{{{ Select line range dialog
+selectlinerange.title=행범위 선택
+selectlinerange.caption=행범위 선택:
+selectlinerange.start=시작 행:
+selectlinerange.end=끝 행:
+#}}}
+
+#{{{ View registers dialog
+view-registers.title=레지스터
+view-registers.caption=레지스터:
+view-registers.clipboard=$ (클립보드)
+view-registers.selection=% (마지막선택영역)
+view-registers.none=정의한 레지스터가 없습니다.
+view-registers.register=레지스터:
+view-registers.contents=내용:
+view-registers.undefined=__UNDEFINED__
+#}}}
+
+#{{{ Close all buffers dialog
+close.title=저장하지 않은 변경 내역
+close.caption=변경후 저장하지 않은 버퍼 목록:
+close.selectAll=모두 선택
+close.selectAll.mnemonic=a
+close.save=선택 버퍼 저장
+close.save.mnemonic=s
+close.discard=선택 버퍼 버림
+close.discard.mnemonic=d
+#}}}
+
+#{{{ Files changed on disk dialog
+files-changed.title=파일이 변경됨
+files-changed.caption=다음의 파일이 다른 프로그램에 의해서 변경되었습니다.
+files-changed.deleted=삭제됨; 다시 만들려면 저장:
+files-changed.changed-auto=자동으로 새로고침:
+files-changed.changed=변경됨:
+files-changed.changed-dirty-auto=변경됨; 아직 새로고침 안함:
+files-changed.changed-dirty=변경됨;원본 변경됨:
+files-changed.select-all=모두 선택
+files-changed.select-all.mnemonic=a
+files-changed.reload=새로고침
+files-changed.reload.mnemonic=r
+files-changed.ignore=무시
+files-changed.ignore.mnemonic=i
+#}}}
+
+#{{{ Abbrev dialogs
+add-abbrev.title=약어 추가
+add-abbrev.mode=특정 모드 약어로 추가
+add-abbrev.global=전체 적용 약어로 추가
+
+edit-abbrev.title=약어 편집
+
+edit-abbrev.duplicate.title=중복 약어
+edit-abbrev.duplicate.message=\
+	기존에 존재하는 약어입니다.\n\
+	\n\
+	기존 자료를 수정하겠습니까?
+
+abbrev-editor.abbrev=약어:
+abbrev-editor.before=커서 앞에 삽입할 텍스트:
+abbrev-editor.after=커서 뒤에 삽입할 텍스트:
+#}}}
+
+#{{{ XMode errors
+xmode-error.title=XML 분석 에러
+# {2} is the column number, but it's not too useful so we don't show it
+xmode-error.message={0} 분석 과정에서 {1}행에 에러가 발생했습니다:\n\
+	{3}
+xmode-error.dtd=DTD를 로드할 수 없습니다\n({0})
+xmode-error.termchar-invalid=AT_CHAR 속성값 오류 ({0})
+xmode-error.doctype-invalid=MODE의 문서 타입이 필요합니다, {0}
+xmode-error.empty-tag={0} 태그가 없습니다
+xmode-error.token-invalid={0} 토큰 타입 오류
+xmode-error.empty-keyword=키워드를 입력하지 않았습니다
+xmode-error.regexp=잘못된 정규식입니다\n({0})
+xmode-error.hash-char-and-hash-chars-mutually-exclusive=HASH_CHAR, HASH_CHARS 중 하나만 입력하세요
+xmode-error.delegate-invalid=Delegate 오류입니다: {0}
+#}}}
+
+#{{{ JARClassLoader errors
+plugin-error.title=플러그인 에러
+plugin-error.caption=다음의 플러그인을 불러올 수 없습니다:
+plugin-error.caption-1=다음의 플러그인을 불러올 수 없습니다:
+
+plugin-error.load-error=로드 불가: {0}\n\
+	많은 경우 JAR 파일 오류입니다. 재설치하세요.\n\
+	상세내역은 도구->문제해결->작업 로그로 확인하세요.
+plugin-error.start-error=시작 불가: {0}\n\
+	플러그인의 새버전으로 업데이트 하세요.
+plugin-error.already-loaded=두개를 설치했습니다. 둘중 하나를 제거하세요.
+plugin-error.dep-jdk=Java {0} 이상이 필요하지만 {1}만 있습니다.
+plugin-error.dep-jedit=jEdit {0} 이상이 필요하지만 {1}만 있습니다.\n\
+	<http://www.jedit.org>에서 새로운 버전을 다운로드하세요.
+plugin-error.dep-plugin.no-version={1}의 버전 {0}이상이 필요합니다만,\n\
+	{1}을 설치하지 않았습니다.
+plugin-error.dep-plugin.broken={0}이 필요하지만 {0}을 불러올 수 없습니다.
+plugin-error.dep-plugin={1}의 버전 {0}이상이 필요합니다만, \
+	{1} 버전 {2}만 있습니다.
+plugin-error.dep-class={0} 클래스가 필요합니다.\n\
+	적절한 플러그인이나 클래스 라이브러리를 설치하세요.
+plugin-error.missing-jar={0} JAR 파일이 필요합니다.\n\
+	이 JAR 파일은 이 플러그인의 일부이지만 찾을 수 없습니다.\n\
+	플러그인을 재설치 해보세요.
+plugin-error.not-42=이 플러그인은 동적 로딩을 지원하지 않습니다.\n\
+	이 플러그인을 삭제하거나 설치한 다음에는 반드시 jEdit를 재가동해야 합니다.
+
+plugin-error-download.title=플러그인 에러
+plugin-error-download.message=플러그인 다운로드 과정에서 에러가 발생했습니다. 다른 서버를 시도해 보세요\n{0}
+#}}}
+
+#{{{ Macro dialogs
+macro-input.title=매크로 입력
+macro-error.title=매크로 에러
+macro-message.title=매크로 메시지
+macro-confirm.title=매크로 확인
+#}}}
+
+#{{{ BeanShell stuff
+beanshell-error.title=BeanShell 에러
+beanshell-error.message==BeanShell 에러가 발생했습니다.
+
+beanshell-eval-input.title=BeanShell 실행
+beanshell-eval-input.message=BeanShell 스크립트:\n\
+	\n\
+	변수명:\n\
+	view - 현재 jEdit 뷰 오브젝트\n\
+	editPane - 현재 편집창 오브젝트\n\
+	textArea - 현재 편집 영역 오브젝트\n\
+	buffer - 현재 버퍼 오브젝트
+
+beanshell-eval.title=BeanShell 실행
+beanshell-eval.message={0}
+
+beanshell-eval-line.title=BeanShell 실행
+beanshell-eval-line.message=선택한 행에 대해서 수행할 BeanShell 스크립트:\n\
+	\n\
+	변수명:\n\
+	line - 행번호\n\
+	index - 선택 행 범위의 행 순번\n\
+	text - 행의 문자열\n\
+	view - 현재 jEdit 뷰 오브젝트\n\
+	editPane - 현재 편집창 오브젝트\n\
+	textArea - 현재 편집 영역 오브젝트\n\
+	buffer - 현재 버퍼 오브젝트
+#}}}
+
+#{{{ Macro not recording dialog
+macro-not-recording.title=매크로를 기록하지 않음
+macro-not-recording.message=아직 매크로가 기록되지 않았습니다.
+#}}}
+
+#{{{ Large repeat count warning
+large-repeat-count.title=너무 큰 반복 횟수
+large-repeat-count.message="{0}"를 {1}회 수행하시겠습니까?
+
+large-repeat-count.user-input.title=너무 큰 반복 횟수
+large-repeat-count.user-input.message="{0}"를 {1}회 삽입하시겠습니까?
+#}}}
+
+#{{{ Wrong fold mode dialog
+folding-not-explicit.title=접기 모드 오류
+folding-not-explicit.message=이 명령은 명시적(explicit) 접기 모드에서만 사용할 수 있습니다.
+#}}}
+
+#{{{ Memory status dialog box
+memory-status.title=자바 메모리
+memory-status.gc={0} Kb를 정리 했습니다.
+memory-status.use=전체{1} Kb, {0} Kb 사용
+#}}}
+
+#{{{ Multiple I/O request errors
+buffer-multiple-io.title=입출력 에러
+buffer-multiple-io.message=각 버퍼는 한번에 하나의 입출력만 수행할 수 있습니다.\n\
+	다른 작업을 하시려면, 현재의 작업이 끝나기를 기다리거나\n\
+	작업관리자에서 현재 작업을 취소하세요.
+
+browser-multiple-io.title=입출력 에러
+browser-multiple-io.message=각 파일 시스템 브라우저는 하나의 입출력만 수행\n\
+	할 수 있습니다. 다른 작업을 하시려면, 현재의 작업이 끝나기를\n\
+	기다리거나 작업관리자에서 현재 작업을 취소하세요.
+#}}}
+
+#{{{ maxLineLen=0 warning
+format-maxlinelen.title=폭 맞추기 크기
+format-maxlinelen.message=이 명령을 사용하시려면 폭 맞추기 크기를 \n\
+	0보다 큰 값으로 설정해야 합니다.
+#}}}
+
+#{{{ Text under caret does not have a syntax style (token type)
+syntax-style-no-token.title=문법 스타일 수정
+syntax-style-no-token.message=현재 커서 위치에는 수정할 문법 스타일이 없습니다.
+#}}}
+
+#{{{ View title dialog
+view.title.select=이 jEdit뷰의 이름을 입력하세요:
+#}}}
+#}}}
+
+#{{{ Buffer options dialog
+buffer-options.title=버퍼 옵션
+buffer-options.caption=현재 편집 버퍼에 대한 각종 옵션을 설정합니다.\n\
+	편집 모드에 대한 기본값 변경은 전역 옵션->편집을 참조하세요.
+buffer-options.loading-saving=읽기 및 저장
+buffer-options.lineSeparator=행 구분자:
+buffer-options.encoding=인코딩:
+buffer-options.gzipped=압축 파일로 저장(GZIP)
+buffer-options.editing=편집
+buffer-options.mode=편집 모드:
+#}}}
+
+#{{{ Global options dialog
+options.title=옵션
+options.title-template={0}: {1}
+options.jedit.label=jEdit
+
+# Option pane to show by default
+options.last=편집
+
+#{{{ Options groups
+
+#}}}
+
+#{{{ General pane
+options.general.label=일반
+options.general.lineSeparator=기본 행 구분자:
+options.general.encoding=기본 인코딩:
+options.general.encodingAutodetect=파일 인코딩 자동 인식(가능할 때)
+options.general.checkModStatus=편집 파일을 외부에서 수정한 경우 :
+options.general.checkModStatus.nothing=아무것도 하지 않음
+options.general.checkModStatus.prompt=묻기
+options.general.checkModStatus.reload=자동으로 다시 읽고 사용자에게 알림
+options.general.checkModStatus.silentReload=알리지 않고 자동으로 다시 읽음
+options.general.checkModStatusUpon=파일 변경 여부 확인 시점:
+options.general.checkModStatusUpon.focus=포커스가 오면 모든 버퍼 확인
+options.general.checkModStatusUpon.all=포커스가 오거나 해당 버퍼를 방문할 때
+options.general.checkModStatusUpon.visitBuffer=버퍼를 방문할 때
+options.general.checkModStatusUpon.none=없음
+options.general.recentFiles=기억할 최근 파일수:
+options.general.hypersearch.maxWarningResults=최대 하이퍼 검색 항목수:
+options.general.sortRecent=최근 파일 목록을 정렬함
+options.general.saveCaret=최근 파일 목록에 커서 위치 저장
+options.general.persistentMarkers=마커 위치 저장
+options.general.resetUndo=저장할 때 작업 취소(Undo) 기록 지우기
+options.general.restore=시작할 때 앞서 작업하던 편집창 복원
+options.general.restore.splits=창 분할 환경 복원
+options.general.restore.remote=... 앞서 작업하던 VFS를 통한 원격 파일도 포함
+options.general.restore.cli=... 앞서 작업하던 콘솔 입력 파일명도 포함
+options.general.encodingDetectors=인코딩 자동인식기 목록:
+options.general.fallbackEncodings=대체 인코딩 목록:
+options.general.fallbackEncodings.tooltip=인코딩 인식 불가시 사용할 인코딩 목록을 공백으로 구분해서 입력합니다.
+options.general.systrayicon=작업표시줄에 아이콘 표시
+#}}}
+
+#{{{ Abbreviations pane
+options.abbrevs.label=약어
+options.abbrevs.set=약어 적용 모드:
+options.abbrevs.expandOnInput=공백키 입력시 약어 확장
+options.abbrevs.abbrev=약어
+options.abbrevs.expand=확장어
+options.abbrevs.add=추가...
+options.abbrevs.edit=수정...
+options.abbrevs.remove=삭제
+#}}}
+
+#{{{ Appearance pane
+options.appearance.label=모양
+options.appearance.iconTheme=아이콘 종류:
+options.appearance.fonts.antialias=안티-알리아스 비텍스트영역 폰트
+options.appearance.lf=Swing 테마 종류:
+options.appearance.primaryFont=버튼, 메뉴, 레이블 폰트:
+options.appearance.secondaryFont=목록, 텍스트 항목 폰트:
+options.appearance.helpViewerFont=도움말 보기/브라우저 폰트:
+options.appearance.history=기록 저장 항목수:
+options.appearance.menuSpillover=메뉴 최대 확장 크기:
+options.appearance.startup.label=시작 옵션
+options.appearance.showSplash=시작할 때 로고 창 표시
+options.appearance.showTips=시작할 때 팁 표시
+options.appearance.experimental.label=특수 옵션
+options.appearance.experimental.caption=아래의 옵션들은 정상적으로 동작하지 않을 수 있습니다 \n\
+	자바 버전에 따라 문제가 있는 경우에는 옵션을 해제하세요.
+
+options.appearance.textColors=모든 텍스트에 jEdit 텍스트 영역 색상 적용
+options.appearance.decorateFrames=창틀에 Swing 테마 적용
+options.appearance.decorateDialogs=다이얼로그 창틀에 Swing 테마 적용
+
+options.appearance.localization.section.label=지역/언어
+options.appearance.usedefaultlocale.label=기본값 사용
+options.appearance.lang.label=언어 (변경 내역을 적용하려면 재시작해야 합니다)
+#}}}
+
+#{{{ Context Menu pane
+options.context.label=팝업 메뉴
+options.context.caption=텍스트 영역에서 우측 마우스 클릭시 나오는 메뉴 항목:
+options.context.add=추가...
+options.context.remove=삭제
+options.context.moveUp=위로 이동
+options.context.moveDown=아래로 이동
+options.context.reset=기본값으로 초기화
+options.context.add.title=팝업 메뉴에 추가
+options.context.add.caption=기본값으로 초기화:
+options.context.add.separator=구분자
+options.context.add.action=명령 또는 매크로:
+options.context.includeOptionsLink.label="이 메뉴를 설정하기..." 링크 포함
+
+options.context.reset.dialog.title=기본값으로 초기화
+options.context.reset.dialog.message=팝업 메뉴를 기본값으로 초기화하시겠습니까?
+#}}}
+
+#{{{ Docking pane
+options.docking.label=도킹
+options.docking.title=기능창
+options.docking.dockPosition=도킹 위치
+options.docking.selectFramework.label=도킹 프레임워크
+options.docking.autoSaveModeLayout.label=편집모드별 도킹 레이아웃 자동 저장
+options.docking.autoLoadModeLayout.label=편집모드별 도킹 레이아웃 자동 로드
+options.docking.selectSet.label=기능창 그룹:
+options.docking.system-change.note=적용하기 위해서는 jEdit를 재가동해야 합니다.
+#}}}
+
+#{{{ Editing pane
+options.editing.label=편집
+options.editing.defaultMode=기본 편집 모드:
+options.editing.undoCount=작업 취소(Undo) 개수:
+options.editing.caption-0=\
+	편집 모드별 설정은 아래 메뉴에서 편집모드를 선택하세요.
+options.editing.caption-1=\
+	편집 모드별 설정을 하시려면 "기본 설정값 사용"을 해제하세요\n\
+	그렇지 않으면 <전역 기본값>을 사용합니다.
+options.editing.mode=편집 모드:
+options.editing.global=<전역 기본값>
+options.editing.useDefaults=기본 설정값 사용
+options.editing.filenameGlob=편집 모드별 파일 확장자:
+options.editing.firstlineGlob=편집 모드별 첫 행 구분자:
+options.editing.folding=접기 모드:
+options.editing.collapseFolds=초기에 묶음을 접을 단계:
+options.editing.wrap=폭 맞추기:
+options.editing.maxLineLen=폭 크기:
+options.editing.maxLineLen.tooltip=soft 폭 맞추기는 값을 0으로 하세요.
+options.editing.tabSize=탭 크기:
+options.editing.indentSize=들여쓰기 크기:
+options.editing.noWordSep=영숫자외에 단어로 취급할 문자:
+options.editing.camelCasedWords="CamelCased" 문자열을 각각 분리해서 단어로 인식
+options.editing.noTabs=소프트 탭(공백으로 대치)
+options.editing.elasticTabstops=탄력적 탭으로 들여쓰기
+options.editing.elasticTabstops.tooltip=고정 탭 대신 탄력적 탭으로 위 아래 행 간에 위치가 맞도록 자동 조정합니다.
+options.editing.deepIndent=괄호에 맞추어 들여쓰기(Deep indent)
+options.editing.autoIndent=자동 들여쓰기:
+options.editing.largefilemode.title=대용량 파일 모드
+options.editing.largefilemode=매우 큰 파일 처리 방법:
+options.editing.largefilemode.option.ask=<html><b>묻기</b> 큰 파일을 열때 무엇을 할지 묻는다</html>
+options.editing.largefilemode.option.full=<html><b>전체 문법 표시</b> : jEdit의 문법 표시 기능은 그대로 동작 시킴 \
+						<br/><b>매우 느려집니다. 주의하세요</b></html>
+options.editing.largefilemode.option.limited=<html><b>불완전하게 문법 표시</b>: 이경우 jEdit는 \
+		빠르게 동작할 수 있지만<br/>문맥을 무시한 문법 표시로 불완전한 결과이며 \
+		soft 폭 맞추기도 동작하지 않습니다<b>(추천)</b></html>
+options.editing.largefilemode.option.nohighlight=문법 표시와 soft 폭 맞추기 안함
+#}}}
+
+#{{{ Encodings pane
+options.encodings.label=인코딩
+options.encodings.selectEncodings=인코딩 대화창에 표시할 인코딩을 선택하세요:
+options.encodings.available=사용가능한 인코딩
+options.encodings.selected=선택한 인코딩
+options.encodings.available.tooltip=<html>이 항목은 인코딩 콤보박스에 표시되지 않습니다. 표시하려면 우측으로 끌어다 놓으세요.</html>
+options.encodings.selected.tooltip=<html>이 항목을 인코딩 콤보박스에 표시합니다. 표시하지 않으려면 좌측으로 끌어다 놓으세요.</html>
+#}}}
+
+#{{{ Gutter pane
+options.gutter.label=행 정보영역
+options.gutter.enabled=행 정보영역 보이기
+options.gutter.optionalComponents=행 정보영역 요소 설정
+options.gutter.lineNumbers=행번호
+options.gutter.minLineNumberDigits=행번호를 위한 최소 자릿수:
+options.gutter.selectionAreaEnabled=행번호를 표시하지 않을 때 행 선택 영역 사용
+options.gutter.selectionAreaBgColor=행 선택 영역 배경색:
+options.gutter.selectionAreaWidth=행 선택 영역 폭(픽셀):
+options.gutter.font=영역 폰트:
+options.gutter.foreground=행번호 색:
+options.gutter.background=배경색:
+options.gutter.borderWidth=영역 경계선 폭:
+options.gutter.numberAlignment=행번호 맞춤:
+options.gutter.interval-1=구분 표시 간격 \u0020
+options.gutter.interval-2=행:
+options.gutter.currentLineHighlight=현재행 구분:
+options.gutter.structureHighlight=구조 범위 보이기:
+options.gutter.markerHighlight=마커 위치 보이기:
+options.gutter.foldColor=묶음 표시자:
+options.gutter.focusBorderColor=포커스가 있는 영역 경계선:
+options.gutter.noFocusBorderColor=포커스가 없는 영역 경계선:
+options.gutter.foldStyle.label=묶음 표시 스타일:
+options.gutter.foldStyleNames.Triangle=삼각형
+options.gutter.foldStyleNames.Square=사각형
+options.gutter.foldStyleNames.Circle=원형
+#}}}
+
+#{{{ Mouse pane
+options.mouse.label=마우스
+options.mouse.dragAndDrop=텍스트 영역에서 끌어다 놓기(Drag and drop) 사용
+options.mouse.joinNonWordChars=특수문자에 대해서도 더블클릭으로 단어 범위 선택
+options.mouse.middleMousePaste=중간버튼 또는 Alt+클릭으로 빠른 복사 사용
+options.mouse.ctrlForRectangularSelection=Ctrl+끌어다 놓기시 사각 선택으로 자동 전환
+options.mouse.singleClickToOpen=파일/디렉토리 열기시 단일 클릭 사용
+options.mouse.gutter.foldClick=행 정보영역 클릭시:
+options.mouse.gutter.SfoldClick=행 정보영역 Shift-클릭시:
+options.mouse.gutter.toggle-fold=묶음 접기/펴기
+options.mouse.gutter.toggle-fold-fully=묶음 전체 접기/펴기
+#}}}
+
+#{{{ Plugin Manager pane
+options.plugin-manager.label=플러그인 관리자
+options.plugin-manager.updateMirrors=서버 목록 갱신
+options.plugin-manager.workthread=서버 목록 갱신 ...
+options.plugin-manager.downloadSource=플러그인 소스 코드 다운로드
+options.plugin-manager.deleteDownloads=설치후에 다운로드 디렉토리에서 보관자료 삭제
+options.plugin-manager.mirror=자주 사용하는 다운로드 서버:
+options.plugin-manager.location=플러그인 설치 위치:
+options.plugin-manager.settings-dir=jEdit 설정 디렉토리
+options.plugin-manager.app-dir=jEdit 홈 디렉토리
+options.plugin-manager.none=플러그인 센터 기본값
+options.plugin-manager.disable-obsolete=사용되지 않는 플러그인 해제
+options.plugin-manager.list-cache.minutes=플러그인 목록 캐시 시간(분) :
+options.plugin-manager.no-plugin-available=가능한 플러그인이 없습니다
+options.plugin-manager.no-plugin-uptodate=모든 플러그인이 최신 상태입니다
+#}}}
+
+#{{{ Printing pane
+options.print.label=인쇄
+options.print.font=인쇄용 폰트:
+options.print.fontstyle=인쇄용 폰트 스타일:
+options.print.fontsize=인쇄용 폰트 크기:
+options.print.header=상단에 파일명 인쇄
+options.print.footer=하단에 일자, 시간, 페이지 번호 인쇄
+options.print.lineNumbers=행번호 인쇄
+options.print.color=컬러 인쇄
+options.print.tabSize=인쇄용 탭 크기:
+options.print.workarounds=자바 오류에 대한 대처
+options.print.glyphVector=인쇄 용량 문제 대처(SPOOL 크기 확대 필요)
+options.print.force13=이전 버전의 인쇄 API 사용(문제가 있을 경우만 사용)
+options.print.folds=접힌 영역 인쇄
+#}}}
+
+#{{{ Proxy pane
+options.firewall.label=프록시 서버
+options.firewall.http.enabled=HTTP 프록시 서버 사용
+options.firewall.http.host=HTTP 프록시 호스트:
+options.firewall.http.port=HTTP 프록시 포트:
+options.firewall.http.user=사용자:
+options.firewall.http.password=비밀번호:
+options.firewall.http.nonProxy=직접 연결 대상:
+options.firewall.socks.enabled=SOCKS 프록시 서버
+options.firewall.socks.host=SOCKS 프록시 호스트:
+options.firewall.socks.port=SOCKS 프록시 포트:
+#}}}
+
+#{{{ Save & Backup pane
+options.save-back.label=저장/백업
+
+options.save-back.autosave=자동저장 주기(초):
+options.save-back.backups=최대 백업 개수:
+options.save-back.backupDirectory=백업 디렉토리:
+options.save-back.backupPrefix=백업 파일명 접두어:
+options.save-back.backupSuffix=백업 파일명 접미어:
+options.save-back.backupEverySave=매 저장마다 백업
+options.save-back.twoStageSave=2단계 저장(좀더 안전하지만 일부 파일시스템에서 소유자 권한을 수정합니다)
+options.save-back.twoStageSave.tooltip=1단계:임시파일에 저장합니다. 2단계:임시파일을 실제 파일로 이름을 변경합니다.
+options.save-back.confirmSaveAll="모든 버퍼 저장"시 확인 요구
+options.save-back.autosaveUntitled=아직 이름 없는 편집창도 자동 저장
+options.save-back.suppressNotSavedConfirmUntitled=이름 없는 편집창은 "변경함"으로 표시하지 않음.
+options.save-back.suppressNotSavedConfirmUntitled.tooltip=이 옵션을 체크하면 새 파일을 열때 버퍼가 지워지므로 주의하세요.
+options.save-back.useMD5forDirtyCalculation=실제 내용에 변경이 없으면 "변경함"으로 표시하지 않음.
+options.save-back.useMD5forDirtyCalculation.tooltip=파일 길이와 MD5 해시 비교를 통해서 실제 내용의 변경 여부를 확인합니다.
+options.save-back.saveAsUsesFSB="다른이름으로 저장시" 파일 시스템 브라우저 디렉토리 사용
+#}}}
+
+#{{{ Shortcuts pane
+options.shortcuts.deletekeymap.label=삭제
+options.shortcuts.deletekeymap.dialog.label=키맵 삭제
+options.shortcuts.deletekeymap.dialog.title=삭제
+options.shortcuts.duplicatekeymap.label=복사
+options.shortcuts.duplicatekeymap.dialog.label=새로운 키맵 이름 선택
+options.shortcuts.duplicatekeymap.keymapalreadyexists.label=이름이 이미 존재합니다, 다른 이름을 선택하세요
+options.shortcuts.duplicatekeymap.dialog.title=키맵 이름
+options.shortcuts.resetkeymap.label=리셋
+options.shortcuts.resetkeymap.dialog.label=키맵 리셋
+options.shortcuts.resetkeymap.dialog.title=키맵 리셋
+options.shortcuts.keymap.label=키맵 선택:
+options.shortcuts.label=단축키
+options.shortcuts.select.label=단축키 편집:
+options.shortcuts.select.tooltip=전역/플러그인  단축키, 매크로를 선택할 수 있습니다
+options.shortcuts.name=기능
+options.shortcuts.actionset=기능 그룹
+options.shortcuts.shortcut1=기본 단축키
+options.shortcuts.shortcut2=부가 단축키
+options.shortcuts.filter.label=필터:
+options.shortcuts.filter.tooltip=입력한 텍스트를 포함하는 기능만 보입니다
+options.shortcuts.clear.label=지우기
+
+grab-key.title=단축키를 입력하세요
+grab-key.caption="{0}"에 대한 단축키를 누르고 확인을 클릭하세요.
+grab-key.keyboard-test=문제가 있는 키를 입력하세요
+grab-key.assigned-to=현재 할당: {0}
+grab-key.assigned-to.none=<없음>
+grab-key.assigned-to.prefix={0} 확장
+grab-key.clear=지우기
+grab-key.remove=현재 단축키 해제
+
+grab-key.remove-ask.title=단축키를 해제 하겠습니까?
+grab-key.remove-ask.message=\
+	새로운 단축키를 지정하지 않았습니다.\n\
+	현재 단축키를 해제 하겠습니까?
+
+grab-key.duplicate-alt-shortcut.title=중복 단축키
+grab-key.duplicate-alt-shortcut.message=\
+	선택한 단축키가 다른 항목과 중복됩니다\n\
+	다른 항목을 선택하세요.
+
+grab-key.duplicate-shortcut.title=중복 단축키
+grab-key.duplicate-shortcut.message=\
+	이 단축키는 이미 다른 항목에 할당되었습니다.\n\
+	"{0}".\n\
+	\n\
+	이 설정으로 대치할까요?
+
+grab-key.prefix-shortcut.title=단축키 오류
+grab-key.prefix-shortcut.message=\
+	이 단축키는 사용할 수 없습니다.\n\
+	추가적인 단축키를 위하여 확장용으로 사용합니다.\n\
+	다른 단축키를 선택하세요.
+#}}}
+
+#{{{ Status bar pane
+options.status.label=상태창
+options.status.visible=상태창 보이기
+options.status.plainview.visible=단순 jEdit 뷰에서 상태창 보이기
+options.status.foreground=상태창 글씨 색상:
+options.status.background=상태창 배경 색상:
+options.status.memory.foreground=메모리 표시 전경색:
+options.status.memory.background=메모리 표시 배경색:
+options.status.edit.title=상태창 항목 편집
+options.status.edit.labelRadioButton=이름
+options.status.edit.widgetRadioButton=위젯
+options.status.edit.labelLabel=이름을 입력하세요:
+options.status.edit.widgetLabel=위젯을 선택하세요:
+options.status.caret.linenumber=커서의 행번호 표시
+options.status.caret.dot=커서의 열 표시
+options.status.caret.virtual=커서의 가상 위치 표시
+options.status.caret.offset=커서의 파일내 위치 표시
+options.status.caret.bufferlength=파일 길이 표시
+options.status.caret.title=커서 위치 표시 설정:
+#}}}
+
+#{{{ Syntax Highlighting pane
+options.syntax.label=문법 표시
+options.syntax.object=토큰 타입
+options.syntax.style=텍스트 스타일
+options.syntax.foldLine.1=접힌 행, 1단계
+options.syntax.foldLine.2=접힌 행, 2단계
+options.syntax.foldLine.3=접힌 행, 3단계
+options.syntax.foldLine.0=접힌 행, 4단계 이상
+#}}}
+
+#{{{ Text Area pane
+options.textarea.label=텍스트 영역
+options.textarea.font=텍스트 폰트:
+options.textarea.fontSubst=부가 폰트 사용
+options.textarea.fontSubst.tooltip=그래픽 문자등 텍스트 폰트에 없는 문자를 표시하기 위하여 사각형으로 표시하는 대신 다른 폰트를 찾습니다
+options.textarea.fontSubstList=부가 폰트: 자주 사용하는 폰트:
+options.textarea.fontSubstSystemFonts=부가 폰트: 모든 시스템 폰트 검색
+options.textarea.fontSubstWarning.label=부가 폰트
+options.textarea.fontSubstWarning=시스템 폰트를 사용하지 않으면 별도의 폰트를 설정해야 합니다
+options.textarea.foreground=텍스트 색상:
+options.textarea.background=배경 색상:
+options.textarea.caret=커서:
+options.textarea.blinkCaret=깜박임
+options.textarea.blockCaret=박스
+options.textarea.thickCaret=굵게
+options.textarea.selection=단일 선택:
+options.textarea.multipleSelection=다중 선택:
+options.textarea.selectionFg=선택 영역 전경색:
+options.textarea.lineHighlight=현재 행 구분:
+options.textarea.structureHighlight=일치(검색) 항목 구분:
+options.textarea.eolMarkers=행 끝 표시자:
+options.textarea.wrapGuide=폭 맞춤 표시기:
+options.textarea.electricBorders=자동 스크롤 테두리
+options.textarea.stdNextPrevWord=이전/다음 단어로 이동시 공백 감안
+options.textarea.antiAlias=부드러운 텍스트 표시
+options.textarea.antiAlias.tooltip=몇몇 시스템에서는 시스템이 느려질 수 있습니다.
+options.textarea.fracFontMetrics=부분적인 폰트 조정
+options.textarea.fracFontMetrics.tooltip=subpixel 부드러운 텍스트 표시 방법과는 같이 사용하지 마세요
+options.textarea.stripTrailingEOL=마지막 개행 문자 숨김
+options.textarea.completeFromAllBuffers=단어 자동 완성을 모든 버퍼를 대상으로 함(기본값은 현재 버퍼를 대상으로 함)
+options.textarea.insertCompletionWithDigit=단어 자동 완성시 숫자를 누르면 다른 단어로 인식(체크하지 않으면 숫자를 단어에 포함시켜 인식)
+options.textarea.lineSpacing.label=추가적인 행 간격(픽셀):
+#}}}
+
+#{{{ Tool Bar pane
+options.toolbar.label=툴바
+options.toolbar.showToolbar=툴바 표시
+options.toolbar.caption=툴바에 표시할 버튼:
+options.toolbar.add=추가...
+options.toolbar.edit=편집...
+options.toolbar.remove=삭제
+options.toolbar.moveUp=위로 이동
+options.toolbar.moveDown=아래로 이동
+options.toolbar.reset=기본값으로 초기화
+options.toolbar.edit.title=툴바 항목 편집
+options.toolbar.edit.caption=타입:
+options.toolbar.edit.separator=구분자
+options.toolbar.edit.action=명령 또는 매크로:
+options.toolbar.edit.builtin=내장 아이콘 사용:
+options.toolbar.edit.file=파일에서 아이콘 가져오기:
+options.toolbar.edit.choose=선택
+options.toolbar.edit.no-icon=아이콘을 선택하지 않았습니다
+
+options.toolbar.reset.dialog.title=기본값으로 초기화
+options.toolbar.reset.dialog.message=설치시 기본값으로 초기화 하시겠습니까?
+#}}}
+
+#{{{ View pane
+options.view.label=보기
+options.view.viewLayout=jEdit 뷰 레이아웃
+options.view.floatableToolbars=유동 툴바
+options.view.alternateDockingLayout=도킹 창 위치 전환
+options.view.alternateToolBarLayout=툴바 위치 전환
+options.view.abbreviatePaths=환경변수로 단축 경로 사용
+options.view.showFullPath=제목에 버퍼의 전체 경로 표시
+options.view.showSearchbar=항상 검색창 표시
+options.view.beepOnSearchAutoWrap=자동 순환 검색시 소리 내기
+options.view.showBufferSwitcher=버퍼 전환창 표시
+options.view.bufferSwitcherMaxRowsCount=버퍼 전환창 표시 개수:
+options.view.sortBuffers=버퍼 정렬
+options.view.sortByName=버퍼 정렬시 경로 대신 파일명 사용
+options.view.fullScreenIncludesMenu=전체 화면 모드에서 메뉴 표시
+options.view.fullScreenIncludesToolbar=전체 화면 모드에서 툴바 표시
+options.view.fullScreenIncludesStatus=전체 화면 모드에서 상태창 표시
+options.bufferset.scope=버퍼 범위:
+#}}}
+
+
+
+#{{{ File System Browser panes
+options.browser.label=파일 시스템 브라우저
+
+options.browser.colors.label=색상
+options.browser.colors.glob=파일 그룹 필터
+options.browser.colors.color=색상
+options.browser.colors.add=추가
+options.browser.colors.remove=삭제
+
+options.browser.general.label=일반
+options.browser.general.defaultPath=기본 경로:
+options.browser.general.defaultPath.favorites=즐겨찾기
+options.browser.general.defaultPath.home=홈 디렉토리
+options.browser.general.defaultPath.last=가장 최근에 방문한 디렉토리
+options.browser.general.defaultPath.buffer=현재 버퍼의 상위 디렉토리
+options.browser.general.defaultPath.working=jEdit 작업 디렉토리
+options.browser.general.showMenubar=메뉴 표시
+options.browser.general.showToolbar=툴바 표시
+options.browser.general.showIcons=아이콘 표시
+options.browser.general.showHiddenFiles=숨김 파일 표시
+options.browser.general.sortIgnoreCase=정렬시 대소문자 구분 안함
+options.browser.general.sortMixFilesAndDirs=파일과 디렉토리를 섞음
+options.browser.general.doubleClickClose=열린 파일을 더블클릭하면 닫음
+options.browser.general.currentBufferFilter=파일 대화창의 필터는 현재 버퍼의 확장자
+options.browser.general.useDefaultIcons=기본 아이콘 사용
+#}}}
+
+#{{{ Browser Context Menu
+options.browser.custom.context.label=팝업 메뉴
+options.browser.custom.context.caption=우 클릭시의 메뉴 설정:
+#}}}
+
+#{{{ Font selector
+font-selector.title=폰트 선택기
+font-selector.family=폰트 종류:
+font-selector.size=폰트 크기:
+font-selector.style=폰트 스타일:
+font-selector.plain=일반
+font-selector.bold=굵게
+font-selector.italic=이탤릭
+font-selector.bolditalic=굵고 이탤릭
+font-selector.preview=미리보기
+font-selector.long-text=The AbCd 국어사랑 Hello 안녕.
+#}}}
+
+#{{{ Color chooser, used by options.syntaxs
+colorChooser.title=색상 선택
+#}}}
+
+#{{{ Style editor, used by options.syntaxs
+style-editor.title=스타일 편집기
+style-editor.tokenType=스타일 타입:
+style-editor.italics=이탤릭
+style-editor.bold=강조
+style-editor.fgColor=텍스트 색상:
+style-editor.bgColor=배경 색상:
+#}}}
+
+#}}}
+
+#{{{ Plugin options dialog
+plugin-options.title=옵션
+options.plugins.label=플러그인
+options.no-plugins.label=플러그인 옵션 없음
+#}}}
+
+#{{{ Help viewer
+helpviewer.title=jEdit 도움말
+helpviewer.loading=로딩...
+helpviewer.back.label=뒤로
+helpviewer.forward.label=앞으로
+helpviewer.copy-link.label=클립보드에 링크 복사
+
+helpviewer.toc.loading=로딩...
+helpviewer.toc.label=내용
+helpviewer.toc.welcome=jEdit에 오신 것을 환영합니다
+helpviewer.toc.readme=일반적인 정보
+helpviewer.toc.changes=자세한 변경 기록
+helpviewer.toc.todo=앞으로 할일과 알려진 버그
+helpviewer.toc.copying=GNU General Public License
+helpviewer.toc.copying-doc=GNU Free Documentation License
+helpviewer.toc.copying-apache=Apache License
+helpviewer.toc.copying-plugins=Plugin Licensing Amendment
+helpviewer.toc.plugins=플러그인
+helpviewer.toc.online-apidocs=온라인 jEdit API 레퍼런스
+
+helpviewer.search.label=검색
+helpviewer.search.caption=검색 대상:
+helpviewer.searching=검색중...
+helpviewer.no-results=검색 결과가 없습니다
+#}}}
+
+#{{{ Tip of the day window
+tip.title=오늘의 팁
+tip.caption=혹시 이거 아세요...
+tip.show-next-time=시작할 때 팁 보이기
+tip.next-tip=다음 팁
+
+tip.not-found=문서/팁 디렉토리를 찾을 수 없습니다
+#}}}
+
+#{{{ Activity log
+log-viewer.title=작업 로그
+log-viewer.caption={0}에 전체 로그가 있습니다.
+log-viewer.copy=복사
+log-viewer.tail.label=끝부분 보기
+#}}}
+
+#{{{ Marker Viewer
+view-markers.label=마커 보기($w)
+view-markers.title=마커
+#}}}
+
+#{{{ I/O progress monitor
+io-progress-monitor.title=입출력 진행 상황 모니터
+io-progress-monitor.caption={0}개의 요구가 대기중입니다.
+io-progress-monitor.idle=대기
+io-progress-monitor.abort=취소
+
+#{{{ I/O abort dialog box
+abort.title=입출력 취소
+abort.message=현재 진행중인 입출력을 취소하시겠습니까?\n\
+	파일 저장을 취소하시면 자료가 소실될 수 있습니다.
+#}}}
+
+#}}}
+
+#{{{ Task  monitor
+task-monitor.title=작업 관리자
+#}}}
+
+#{{{ VFS browser
+vfs.browser.title=파일 브라우저
+vfs.browser.longtitle=파일 시스템 브라우저
+vfs.browser.title.open=파일 브라우저 - 열기
+vfs.browser.title.save=파일 브라우저 - 저장
+vfs.browser.title.dialog=파일 브라우저 - 열기
+vfs.browser.path=경로:
+vfs.browser.path.mnemonic=p
+vfs.browser.filter=필터:
+vfs.browser.tree.loading=로딩...
+
+vfs.browser.name=이름
+vfs.browser.type=타입
+vfs.browser.type.file=파일
+vfs.browser.type.directory=디렉토리
+vfs.browser.type.filesystem=파일 시스템
+vfs.browser.status=상태
+vfs.browser.status.no=접근 불가
+vfs.browser.status.ro=읽기 전용
+vfs.browser.status.append=덧붙이기 전용
+vfs.browser.status.rw=읽기/쓰기
+vfs.browser.size=크기
+vfs.browser.modified=최종변경
+
+vfs.browser.file_filter.glob=Glob 파일 필터
+vfs.browser.file_filter.dir_only=디렉토리만
+
+#{{{ Actions
+vfs.browser.browse-window.label=새창에서 보기
+vfs.browser.browse.label=보기
+vfs.browser.close.label=닫기
+vfs.browser.copy-path.label=복사
+vfs.browser.delete.label=삭제...
+vfs.browser.home.label=홈 디렉토리
+vfs.browser.properties.label=속성
+vfs.browser.properties.title=파일/디렉토리 속성
+vfs.browser.insert.label=삽입
+vfs.browser.new-directory.label=새 디렉토리...
+vfs.browser.new-file.label=새 파일
+vfs.browser.open.label=열기
+vfs.browser.open-desktop.label=데스크탑에서 열기($D)
+vfs.browser.other-encoding-2.label=다른 인코딩({0})...
+vfs.browser.other-encoding.label=다른 인코딩...
+vfs.browser.reload.label=디렉토리 새로고침
+vfs.browser.rename.label=이름변경...
+vfs.browser.roots.label=루트 디렉토리
+vfs.browser.search-directory.label=디렉토리에서 검색...
+vfs.browser.show-hidden-files.label=숨김 파일 보기
+vfs.browser.synchronize.label=현재 버퍼의 디렉토리
+vfs.browser.up.label=상위 디렉토리
+vfs.browser.paste.label=붙여넣기
+vfs.browser.previous.label=이전 디렉토리
+vfs.browser.next.label=다음 디렉토리
+#}}}
+
+#{{{ Tool bar
+
+#}}}
+
+#{{{ Commands menu
+vfs.browser.commands.label=기능($C)
+vfs.browser.commands.encoding.label=인코딩
+vfs.browser.commands.encoding.auto-detect=자동 인식
+
+vfs.browser.open-in.label=추가 열기
+vfs.browser.open-view.label=jEdit 뷰 추가 열기
+vfs.browser.open-plain-view.label=jEdit 단순뷰 추가 열기
+vfs.browser.open-split.label=새 분할에서 열기
+#}}}
+
+#{{{ Plugins menu
+vfs.browser.plugins.label=플러그인($P)
+vfs.browser.plugins.plugin-manager.label=플러그인 관리자...
+vfs.browser.plugins.plugin-options.label=플러그인 옵션...
+vfs.browser.plugins.no-plugins.label=플러그인이 없습니다
+#}}}
+
+#{{{ Favorites menu
+vfs.browser.favorites.label=즐겨찾기($v)
+vfs.browser.favorites.add-to-favorites.label=즐겨찾기에 추가
+vfs.browser.favorites.edit-favorites.label=즐겨찾기 편집
+vfs.browser.favorites.no-favorites.label=즐겨찾기가 없습니다
+#}}}
+
+vfs.browser.dialog.open=열기
+vfs.browser.dialog.save=저장
+vfs.browser.dialog.choose-dir=선택
+vfs.browser.dialog.filename=파일명:
+vfs.browser.dialog.filename.mnemonic=f
+
+#{{{ Dialogs
+vfs.browser.bad-filter.title=필터 오류
+vfs.browser.bad-filter.message={0}필터에 문제가 있습니다 ({1})
+
+vfs.browser.recurse-favorites.title=스스로에게는 즐겨찾기를 추가할 수 없습니다.
+vfs.browser.recurse-favorites.message=스스로에게 즐겨찾기 목록을 추가할 수 없습니다.
+
+vfs.browser.delete-confirm.title=파일 삭제 확인
+vfs.browser.delete-confirm.message={1}를 확실히 삭제하시겠습니까?
+
+vfs.browser.delete-favorites.title=즐겨찾기에서 삭제
+vfs.browser.delete-favorites.message=아래 파일들을 즐겨찾기에서 삭제하시겠습니까?
+
+vfs.browser.rename.title=파일 이름 변경
+vfs.browser.rename.message={0}에 대한 새이름을 입력하세요:
+
+vfs.browser.mkdir.title=새 디렉토리
+vfs.browser.mkdir.message=새 디렉토리의 이름 및 경로:
+#}}}
+
+#}}}
+
+#{{{ I/O status messages
+vfs.status.load=로딩 {0}
+vfs.status.load-markers={0}의 마커 로딩
+vfs.status.save={0} 저장중
+vfs.status.save-markers={0}의 마커 저장중
+vfs.status.autosave={0} 자동 저장중
+vfs.status.listing-directory={0} 디렉토리 리스팅
+vfs.status.deleting={0} 삭제중
+vfs.status.renaming={0}를 {1}로 이름변경
+#}}}
+
+#{{{ Plugin manager
+
+plugin-manager.title=플러그인 관리자
+
+plugin-manager.hide-libraries=라이브러리 숨김
+
+plugin-manager.mgr-options=다운로드 옵션...
+plugin-manager.plugin-options=플러그인 옵션...
+plugin-manager.done=닫기
+
+plugin-manager.remove-confirm.title=플러그인 삭제
+plugin-manager.remove-confirm.message=다음의 플러그인을 삭제하시겠습니까?
+
+plugin-manager.dependency.title=플러그인 의존성
+lugin-manager.dependency.message={0}를 다음과 같은 플러그인에서 필요로 합니다.\n\
+	{0}를 해제하시면 아래의 플러그인도 해제합니다:
+
+plugin-manager.remove-dependencies.title=플러그인 의존성
+plugin-manager.remove-dependencies.message=삭제된 플러그인을 다음과 같은 플러그인에서 필요로 합니다.\n\
+	해당 플러그인 삭제로 아래의 플러그인도 해제할 것입니다:
+
+plugin-manager.cleanup.label=지우기
+plugin-manager.cleanup.title=플러그인 자료 지우기
+plugin-manager.cleanup.message=아래의 플러그인 자료 삭제:
+
+plugin-manager.noOrphan.label=사용하지 않는 JAR 찾기
+plugin-manager.noOrphan.title=사용하지 않는 JAR가 없습니다
+plugin-manager.noOrphan.message=현재 설치에 사용하지 않는 JAR가 없습니다
+
+plugin-manager.findOrphan.label=사용하지 않는 JAR 찾기
+plugin-manager.findOrphan.title=사용하지 않는 JAR 찾기
+plugin-manager.findOrphan.message=다음 JAR들은 어떤 플러그인에도 속하지 않습니다. 삭제하시겠습니까?\n\
+	(주의하세요. JDBC 드라이버처럼 몇몇 플러그인에서 동적으로 정의해서 사용할 수도 있습니다):
+
+install-plugins.depend.title=의존성 있는 플러그인 설치
+install-plugins.depend.message=설치하는 플러그인이 추가적인 다른 플러그인을 필요로 합니다\n\
+	계속하시면 필요한 것을 자동으로 설치합니다.
+
+plugin-manager.status.loaded=로드 완료
+plugin-manager.status.disabled=지원되지 않음
+plugin-manager.status.not-loaded=로드되지 않음
+plugin-manager.status.error=에러
+
+plugin-manager.list-download-connect=plugins.jedit.org에 연결중
+plugin-manager.list-download=plugins.jedit.org에서 플러그인 목록을 다운로드하고 있습니다
+plugin-manager.list-download.mirror-autoselect-error.title=서버 선택 에러
+plugin-manager.list-download.mirror-autoselect-error.message=서버 자동 선택 에러:\n\
+	{0}\n\
+	특정 서버를 선택하면 정상 동작 할 수 있습니다.
+plugin-manager.list-download.need-password.title=HTTP 프록시가 비밀번호를 필요로 합니다
+plugin-manager.list-download.need-password.message=HTTP 프록시가 비밀번호를 필요로 합니다.\n\
+	"다운로드 옵션"에서 적절한 사용자/비밀번호를 설정하세요.
+plugin-manager.list-download.disconnected.title=플러그인 목록 다운로드 에러
+plugin-manager.list-download.disconnected.message=플러그인 목록을 다운로드 할 수 없습니다:\n\
+	{0}호스트에 접근할 수 없습니다. 인터넷 연결을 확인해 보세요...
+plugin-manager.list-download.generic-error.title=플러그인 목록 다운로드 에러
+plugin-manager.list-download.generic-error.message=플러그인 목록 다운로드 에러:\n\
+	{0} - {1}
+plugin-manager.filterField=이 텍스트를 포함하는 플러그인만 보이기
+
+#{{{ Plugin management
+manage-plugins.title=관리
+
+manage-plugins.info.name=이름
+manage-plugins.info.version=버전
+manage-plugins.info.status=상태
+manage-plugins.info.data=데이터
+
+manage-plugins.data-size.unknown=<모름>
+
+manage-plugins.remove=삭제...
+manage-plugins.help=도움말...
+plugin-load-error.message=플러그인을 로드할 수 없습니다
+plugin-load-error.title=플러그인 로드 에러
+#}}}
+
+#{{{ Plugin installation
+install-plugins.title=설치
+
+install-plugins.info.name=이름
+install-plugins.info.size=크기
+install-plugins.info.releaseDate=릴리즈 일자
+install-plugins.info.version=버전
+install-plugins.info.category=분류
+install-plugins.info.author=저자
+install-plugins.info.released=릴리즈 일자
+install-plugins.info.depends=의존성
+install-plugins.info.optionalDepends=옵션 의존성
+
+install-plugins.totalSize={0} 플러그인, 총크기: {1}
+install-plugins.select-all=모두 선택
+install-plugins.install=설치
+install-plugins.show-updates=업데이트 보이기
+
+update-plugins.title=업데이트
+
+plugin-manager.progress={1}에서 {0}를 다운로드중
+plugin-manager.progress.title=플러그인 설치중
+plugin-manager.progress.stop=중지
+#}}}
+
+#{{{ Plugin remove error
+plugin-manager.remove-failed.title=삭제 실패
+plugin-manager.remove-failed.message={0} 플러그인을 삭제할 수 없습니다.
+#}}}
+
+#}}}
+
+#{{{ File Properties Dialog
+fileprop.name=이름
+fileprop.path=경로
+fileprop.lastmod=최종 변경
+fileprop.size=크기
+fileprop.properties=속성
+fileprop.readable=읽기가능
+fileprop.writeable=쓰기가능
+fileprop.attribute=속성
+fileprop.okBtn=확인
+fileprop.cancelBtn=취소
+fileprop.selectedFiles=선택한 파일
+fileprop.selectedDirectories=선택한 디렉토리
+#}}}
+
+#{{{ Activity log viewer
+log-viewer.dialog.title=작업 로그 설정
+log-viewer.settings.label=설정
+log-viewer.message.label=메시지:
+log-viewer.message.debug.label=디버그
+log-viewer.message.message.label=메시지
+log-viewer.message.notice.label=주의
+log-viewer.message.warning.label=경고
+log-viewer.message.error.label=에러
+# This one should be actually placed in Debugging options, but
+# we don't have such a pane yet
+debug.beepOnOutput.label=출력시 경고음
+#}}}
+
+logs-remove-all-errors.label=모든 에러 지움
+
+taskmanager.remainingtasks.label=남은 작업 {0}개
+
+#{{{ Statusbar Widgets
+# the widgets should have a label and a sample.
+# the label is displayed when choosing the list of widgets
+# the sample is an example of what the widget will show, for the
+# preview in the options
+statusbar.mode.label=편집 모드 (ex:java)
+statusbar.mode.sample=java
+statusbar.fold.label=접기 모드 (ex:explicit)
+statusbar.fold.sample=explicit
+statusbar.encoding.label=인코딩 (ex:UTF-8)
+statusbar.encoding.sample=UTF-8
+statusbar.wrap.label=폭 맞추기 모드(ex:N)
+statusbar.wrap.sample=N
+statusbar.indent.label=자동 들여쓰기 (ex:F)
+statusbar.indent.sample=F
+statusbar.multiSelect.label=다중 선택 모드 (ex:m)
+statusbar.multiSelect.sample=m
+statusbar.rectSelect.label=사각 선택 모드 (ex:r)
+statusbar.rectSelect.sample=r
+statusbar.overwrite.label=덮어쓰기 (ex:o)
+statusbar.overwrite.sample=o
+statusbar.lineSep.label=행 구분자 (ex:U)
+statusbar.lineSep.sample=U
+statusbar.memory-status.label=메모리 상태 (ex:9/24Mb)
+statusbar.memory-status.sample=9/24Mb
+statusbar.clock.label=시각 (ex:16:45)
+statusbar.clock.sample=16:45
+statusbar.buffersets.label=버퍼 범위 (ex:G)
+statusbar.buffersets.sample=G
+statusbar.selection-length.label=선택 길이 (ex:192)
+statusbar.selection-length.sample=192
+statusbar.last-modified.label=파일 최종 변경 일시 (ex:12/03/11 16:43)
+statusbar.last-modified.sample=12/03/11 16:43
+statusbar.task-monitor.label=작업 관리자 (예: 7 작업)
+statusbar.task-monitor.tooltip=진행중인 작업 보려면 클릭하세요
+statusbar.task-monitor.sample=7 작업
+statusbar.task-monitor.template={0} 작업
+#}}}
+
+killring.load-memoryerror.message=<html>앞서 삭제한 텍스트를 로드할 수 없습니다. 메모리 공간을 확장시켜주세요.<br>\
+  <b>시작</b>을 누르면 jEdit를 그냥 시작합니다. <br><b>중지</b>를 누르면 실행을 중지하고 설정을 수정합니다. <br>또한 <b>기록 파일을 삭제</b>하고 jEdit를 시작할 수 있습니다</html>
+killring.load-memoryerror.title=메모리 에러
+killring.start=시작
+killring.stop=중지
+killring.delete=기록 파일을 삭제하고 시작
+
+#}}}
+
+#{{{ Macros
+
+#{{{ Properties used by macros
+
+#{{{ common
+macro.rs.general.ErrorNotEditableDialog.title=쓰기 권한
+macro.rs.general.ErrorNotEditableDialog.message=버퍼를 수정할 수 없습니다!
+#}}}
+
+#{{{ Clipboard
+
+#{{{ Copy Lines Containing
+macro.rs.CopyLinesContaining.CopyLinesContaining.label=다음을 포함하는 행 복사:
+macro.rs.CopyLinesContaining.LinesCopied.message=행 복사
+#}}}
+
+#{{{ Cut Lines Containing
+macro.rs.CutLinesContaining.CutLinesContaining.label=다음을 포함하는 행 잘라내기:
+macro.rs.CutLinesContaining.LinesCut.message=행 잘라내기
+#}}}
+
+#}}}
+
+#{{{ Editing
+
+#{{{ Go to column
+macro.rs.GoToColumn.label=열 (1 과 {0} 사이):
+#}}}
+
+# Go To Offset
+macro.rs.GoToOffset.label=위치 (0 과 {0} 사이):
+
+#{{{ Key Words to Uppercase
+macro.rs.KeywordsToUpperCase.ConvertedKeywords.message=키워드를 대문자로 변환했습니다
+#}}}
+
+#{{{ Mode Switcher
+macro.rs.BufferModeSwitcher.MainDialog.title=편집모드 전환기
+macro.rs.BufferModeSwitcher.EnterBufferMode.label=편집 모드를 입력하세요:
+macro.rs.BufferModeSwitcher.ChangingBufferMode.label=버퍼의 편집모드 변환
+macro.rs.BufferModeSwitcher.To.label=로
+macro.rs.BufferModeSwitcher.Mode.label=모드
+macro.rs.BufferModeSwitcher.NotFound.label=찾을 수 없습니다
+#}}}
+
+#{{{ Moves Lines Down - Move Lines Up
+macro.rs.MoveLines.NoMultipleSelection.error=다중 선택 모드에서는 행이동을 할 수 없습니다.
+#}}}
+
+#}}}
+
+#{{{ Files
+
+#{{{ Browse Directory
+macro.rs.BrowseDirectory.DirectoryBrowse.label=조회할 디렉토리:
+#}}}
+
+#{{{ Buffer Switcher
+macro.rs.BufferSwitcher.OpenBuffers.label=버퍼 편집중
+macro.rs.BufferSwitcher.QuickHelp.label=[ENTER] 전환; [SPACE] 대화창 유지하며 전환 ; [DEL] 버퍼 닫기
+macro.rs.BufferSwitcher.Help1.label=버퍼 전환기 안내:
+macro.rs.BufferSwitcher.Help2.label=DELETE 선택 버퍼 닫음.
+macro.rs.BufferSwitcher.Help3.label=ENTER 대화창 닫으며 전환.
+macro.rs.BufferSwitcher.Help4.label=ESCAPE 대화창 닫음.
+macro.rs.BufferSwitcher.Help5.label=SPACE 대화창 유지하며 전환.
+macro.rs.BufferSwitcher.Help6.label=이 창은 한번만 표시합니다
+#}}}
+
+#{{{ Delete Current
+macro.rs.DeleteCurrent.NotOnDisk.error=버퍼 원본이 저장소에 존재하지 않습니다.
+macro.rs.DeleteCurrent.DeleteNotSupport.error=삭제를 지원하지 않습니다.
+macro.rs.DeleteCurrent.Deleted.message=삭제:
+#}}}
+
+#{{{ Glob Close
+macro.rs.GlobClose.GlobPattern.label=와일드 카드 패턴(예 *.txt 또는 /usr/include/*):
+macro.rs.GlobClose.ErrorGlobPattern.error=와일드 카드 패턴에 오류가 있습니다:
+#}}}
+
+#{{{ Next Dirty Buffer
+macro.rs.NextDirtyBuffer.NoOtherBufferDirty.message=변경한 다른 버퍼가 없습니다
+macro.rs.NextDirtyBuffer.NoBufferDirty.message=변경한 버퍼가 없습니다
+#}}}
+
+#{{{ open Path
+macro.rs.OpenPath.PathName.label=경로 이름:
+#}}}
+
+#{{{Toggle ReadOnly
+macro.rs.ToggleReadOnly.OnlyLocalFiles.error=이 매크로는 내부 파일만 지원합니다.
+macro.rs.ToggleReadOnly.OnlyWindowsUnixMacos.error=이 매크로는 Windows, Unix, & MacOS X에서만 지원합니다.
+#}}}
+
+#}}}
+
+#{{{ Interface
+
+#{{{ Decrease Font Size - Increase Font Size
+macro.rs.ChangeFontSize.FontSize.message=현재 폰트 크기:
+#}}}
+
+#}}}
+
+#{{{ Java
+
+#{{{ Create Constructor
+macro.rs.CreateConstructor.UnevenNumber.message=타입 이름과 변수 지정 오류.
+#}}}
+
+#{{{ Get Package Name
+macro.rs.GetPackageName.NotWorking1.error=자바 인터프리트에서는 이 매크로가 동작하지 않습니다
+macro.rs.GetPackageName.NotWorking2.error=jEdit를 '-jar' 옵션으로 시작하세요
+macro.rs.GetPackageName.NotFind.error=패키지 이름을 찾을 수 없습니다.
+#}}}
+
+#{{{ Java File Save
+macro.rs.JavaFileSave.InfiniteLoop.error=무한 루프:
+#}}}
+
+#{{{Make Get and Set Methods
+macro.rs.MakeGetAndSetMethods.GenerateCode.label=코드 생성
+macro.rs.MakeGetAndSetMethods.CreateGetMethods.label=Get 메소드 생성
+macro.rs.MakeGetAndSetMethods.CreateSetMethods.label=Set 메소드 생성
+macro.rs.MakeGetAndSetMethods.CreateGetandSetMethods.label=Get/Set 메소드 생성
+#}}}
+
+#}}}
+
+#{{{ Misc
+
+#{{{ Buffer to HyperSearch Results - HyperSearch Results to Buffer
+macro.rs.HyperSearchResults.WindowNotOpen.error=하이퍼 검색 결과 창이 열리지 않습니다.
+macro.rs.HyperSearchResults.NotMatch.error=하이퍼 검색 결과가 없습니다.
+#}}}
+
+#{{{ Debug BufferSets
+macro.rs.DebugBuffersets.BuffersetDebugging.label=버퍼 디버깅
+macro.rs.DebugBuffersets.BufferCount.label=버퍼 개수:
+macro.rs.DebugBuffersets.BufferList.label=버퍼 목록
+macro.rs.DebugBuffersets.EndBufferList.label=버퍼 목록 끝
+macro.rs.DebugBuffersets.EditpaneList.label=편집창 목록
+macro.rs.DebugBuffersets.EndEditpaneList.label=편집창 목록 끝
+#}}}
+
+#{{{ Display Abbreviations
+macro.rs.DisplayAbbreviations.Abbreviation.label=약어
+macro.rs.DisplayAbbreviations.Expansion.label=확장
+macro.rs.DisplayAbbreviations.Close.label=닫기
+macro.rs.DisplayAbbreviations.WriteSet.label=약어 그룹 내보내기
+macro.rs.DisplayAbbreviations.WriteAll.label=약어 전체 내보내기
+macro.rs.DisplayAbbreviations.AbbreviationList.label=약어 목록
+macro.rs.DisplayAbbreviations.CallingWTTNB.label=새 버퍼에 약어 테이블 쓰기 호출
+macro.rs.DisplayAbbreviations.SizeVector.label=벡터 크기:
+macro.rs.DisplayAbbreviations.jEditAbbreviationTable.label=jEdit 약어 테이블
+macro.rs.DisplayAbbreviations.AbbreviationSet.label=약어 그룹:
+macro.rs.DisplayAbbreviations.AbbreviationExpansion.label=약어    확장
+macro.rs.DisplayAbbreviations.NoAbbreviations.label=<< 약어가 없습니다 >>
+#}}}
+
+#{{{ Display Actions
+macro.rs.DisplayActions.jEditActionBar1.label=jEdit 액션 스크립트 창은 일반적으로 도구 메뉴를 통해 사용합니다
+macro.rs.DisplayActions.jEditActionBar2.label=C+ENTER 키보드 단축키가 할당되어 있습니다.
+macro.rs.DisplayActions.NoLabel.label=<이름 없음>
+#}}}
+
+#{{{ Display Character Code
+macro.rs.DisplayCharacterCode.CharacterAtCaret.label=커서 위치의 문자 코드:
+#}}}
+
+#{{{ Display Shorcuts
+macro.rs.DisplayShortcuts.jEditShortcutTable.label=jEdit 단축키 테이블
+macro.rs.DisplayShortcuts.Name.label=이름
+macro.rs.DisplayShortcuts.Shortcut1.label=단축키 - 1
+macro.rs.DisplayShortcuts.Shortcut2.label=단축키 - 2
+macro.rs.DisplayShortcuts.Close.label=닫기
+macro.rs.DisplayShortcuts.WriteToBuffer.label=버퍼로 내보내기
+macro.rs.DisplayShortcuts.ShortcutList.label=키보드 단축키 목록
+macro.rs.DisplayShortcuts.Center.label=가운데
+macro.rs.DisplayShortcuts.South.label=아래
+#}}}
+
+#{{{ Hex Convert
+macro.rs.HexConvert.Before.label=이전:
+macro.rs.HexConvert.After.label=이후:
+macro.rs.HexConvert.NotValidHex.label=는 올바른 16진 스트링이 아닙니다.
+macro.rs.HexConvert.ByteToString.label=스트링으로 변환할 바이트:
+#}}}
+
+#{{{ Make Bug Report
+macro.rs.MakeBugReport.OpeningActivityLog.error=작업 로그 열기 오류.
+macro.rs.MakeBugReport.UsefulEntriesForReport.label=버그 리포트에 유용한 작업 로그 항목:\n\n.
+macro.rs.MakeBugReport.MessagejEdit.label=[메시지] jEdit:
+macro.rs.MakeBugReport.NoticejEdit.label=[주의] jEdit:
+macro.rs.MakeBugReport.NoticeJarClassLoader.label=[주의] JARClassLoader:
+macro.rs.MakeBugReport.MessagejEditStartupComplete.label=[메시지] jEdit: 시작 완료
+macro.rs.MakeBugReport.Error.label=[에러]
+macro.rs.MakeBugReport.ReadingActivityLog.error=작업 로그 읽기 오류
+#}}}
+
+#{{{ Run Script
+macro.rs.RunScript.SpecifyParametersForRunning.label=스크립트 실행에 필요한 파라미터를 입력하세요
+macro.rs.RunScript.ScriptExecutionCancelled.message=스크립트 실행이 취소됨.
+macro.rs.RunScript.FileNotScript.error=현재 파일은 스크립트가 아닙니다.
+#}}}
+
+#{{{ Show Threads
+macro.rs.ShowThreads.Daemon.label=대몬
+macro.rs.ShowThreads.Priority.label=우선순위
+macro.rs.ShowThreads.NotStarted.label=시작되지 않음
+macro.rs.ShowThreads.Interrupted.label=가로채기 됨
+macro.rs.ShowThreads.CloseUpdate.label=[Esc] 닫기      [U] 업데이트
+macro.rs.ShowThreads.CurrentThreads.label=현재 쓰레드
+#}}}
+
+#}}}
+
+#{{{ Properties
+
+#{{{ Insert Buffer Properties
+macro.rs.InsertBufferProperties.InsertLocalProperties.label=버퍼 속성 삽입
+macro.rs.InsertBufferProperties.Properties.label=속성:
+macro.rs.InsertBufferProperties.Insert.label=삽입
+macro.rs.InsertBufferProperties.MustBeIn10Lines.message=jEdit가 버퍼 속성을 자동으로 인식케 하려면 처음 또는 끝 10행 안에 버퍼 속성을 기술해야 합니다.
+#}}}
+
+#{{{ Look and Feel Properties
+macro.rs.LookAndFeelProperties.Listing.label=--사용자 인터페이스(UI) 속성 목록--
+#}}}
+
+#{{{ System Properties
+macro.rs.SystemProperties.SystemProperties.label=시스템 속성
+#}}}
+
+#}}}
+
+#{{{ Text
+
+#{{{ Add Prefix And Suffix
+macro.rs.AddPrefixAndSuffix.MainDialog.title=선택 행 범위에 행단위 접두어/접미어 붙이기
+macro.rs.AddPrefixAndSuffix.PrefixToAdd.label=추가할 접두어:
+macro.rs.AddPrefixAndSuffix.SuffixToAdd.label=추가할 접미어:
+#}}}
+
+#{{{ Color Picker
+macro.rs.ColorPicker.ColorPicker.label=색상 선택기
+#}}}
+
+#{{{ Insert Date
+macro.rs.InsertDate.InternetTime.label=인터넷 시간
+#}}}
+
+#{{{ Insert Tag
+macro.rs.InsertTag.EnterNameTag.label=태그 이름 입력:
+#}}}
+
+#{{{ Line_Filter
+macro.rs.LineFilter.MainDialog.title=라인 필터
+macro.rs.LineFilter.ignoreCaseCheckBox.label=대소문자 구분 안함
+macro.rs.LineFilter.regexpPanelBorder.title=비교에 사용할 정규식
+macro.rs.LineFilter.processModeRadioButtonMatching.label=정규식에 맞는 행
+macro.rs.LineFilter.processModeRadioButtonNotMatching.label=정규식에 맞지 않는 행
+macro.rs.LineFilter.processModeOptionPanelBorder.title=대상 행
+macro.rs.LineFilter.actionModeRadioButtonWrite.label=새 버퍼로 내보내기
+macro.rs.LineFilter.actionModeRadioButtonDelete.label=삭제
+macro.rs.LineFilter.actionModeOptionPanelBorder.title=작업
+
+macro.rs.LineFilter.DeleteActionDisabled.message=삭제 할 수 없습니다
+macro.rs.LineFilter.MultipleSelection.message=다중 선택은 지원하지 않습니다
+macro.rs.LineFilter.BlockSelection.message=사각 선택은 지원하지 않습니다
+
+macro.rs.LineFilter.SummaryDeleted.label=삭제 했습니다!
+macro.rs.LineFilter.SummaryWritten.label=새 버퍼로 내보내기 했습니다!
+
+macro.rs.LineFilter.ErrorRegexpDialog.title=잘못된 정규식
+macro.rs.LineFilter.ErrorRegexpDialog.message=잘못된 정규식입니다!
+#}}}
+
+#{{{ Next Char
+macro.rs.InsertTag.EnterCharacter.label=문자를 입력하세요
+#}}}
+
+#{{{ Reverse Lines
+macro.rs.ReverseLines.NotWorkingRectangularSelection.error=죄송합니다, 이 매크로는 사각 선택에는 동작하지 않습니다.
+#}}}
+
+#{{{ Single Space Buffer
+macro.rs.SingleSpaceBuffer.NotDoubleSpaced.message=빈 행이 아닌 행이 있습니다:
+macro.rs.SingleSpaceBuffer.Line.message=행
+macro.rs.SingleSpaceBuffer.NotBlank.message=에 내용이 있습니다.
+#}}}
+
+#}}}
+
+#}}}
+
+#{{{ Macro Names for Macros Menu (only original macros in original folders!)
+
+#{{{ C
+macros.folder.C.label=C 언어
+
+C/Include_Guard.label=중복 Include 방지 구문
+C/Toggle_Header_Source.label=헤더/소스간 전환
+#}}}
+
+#{{{ Clipboard
+macros.folder.Clipboard.label=클립보드
+
+Clipboard/Copy_Lines.label=행 복사
+Clipboard/Copy_Lines_Containing.label=검색어를 포함하는 행 복사
+Clipboard/Copy_Visible_Lines.label=보여진(펴진) 행 복사
+Clipboard/Cut_Lines.label=행 잘라내기
+Clipboard/Cut_Lines_Containing.label=검색어를 포함하는 행 잘라내기
+Clipboard/Paste_Indent.label=들여쓰기로 붙여넣기
+#}}}
+
+#{{{ Editing
+macros.folder.Editing.label=편집
+
+Editing/Duplicate_Lines_Above.label=행범위를 위에 복제
+Editing/Duplicate_Lines_Below.label=행범위를 아래에 복제
+Editing/Go_to_Column.label=특정 열로 이동
+Editing/Greedy_Backspace.label=소프트 탭 Backspace
+Editing/Greedy_Delete.label=소프트 탭 Delete
+Editing/Greedy_Left.label=소프트 탭 Left
+Editing/Greedy_Right.label=소프트 탭 Right
+Editing/Keywords_to_Upper_Case.label=키워드 스타일 단어를 대문자로
+Editing/Mode_Switcher.label=편집 모드 전환기
+Editing/Move_Lines_Down.label=행범위를 아래로 이동
+Editing/Move_Lines_Up.label=행범위를 위로 이동
+Editing/Open_Line_Above.label=위에 빈행 삽입
+Editing/Open_Line_Below.label=아래에 빈행 삽입
+Editing/Toggle_Fold.label=현재 묶음 접기/펴기
+#}}}
+
+#{{{ Emacs
+macros.folder.Emacs.label=Emacs
+Emacs/Emacs_Align_Decls.label=Emacs Align Decls
+Emacs/Emacs_Backward_Sentence.label=Emacs Backward Sentence
+Emacs/Emacs_Capitalize_Word.label=Emacs Capitalize Word
+Emacs/Emacs_Center_Line.label=Emacs Center Line
+Emacs/Emacs_Ctrl-K.label=Emacs Ctrl-K
+Emacs/Emacs_Downcase_Word.label=Emacs Downcase Word
+Emacs/Emacs_Exchange_Point_and_Mark.label=Emacs Exchange Point and Mark
+Emacs/Emacs_Fixup_Whitespace.label=Emacs Fixup Whitespace
+Emacs/Emacs_Forward_Sentence.label=Emacs Forward Sentence
+Emacs/Emacs_Insert_File.label=Emacs Insert File
+Emacs/Emacs_Kill_Line.label=Emacs Kill Line
+Emacs/Emacs_Kill_Region.label=Emacs Kill Region
+Emacs/Emacs_Kill_Ring_Save.label=Emacs Kill Ring Save
+Emacs/Emacs_Kill_Sentence.label=Emacs Kill Sentence
+Emacs/Emacs_Next_Line.label=Emacs Next Line
+Emacs/Emacs_Open_Line.label=Emacs Open Line
+Emacs/Emacs_Previous_Line.label=Emacs Previous Line
+Emacs/Emacs_Set_Mark.label=Emacs Set Mark
+Emacs/Emacs_Set_Wrap=Emacs Set Wrap
+Emacs/Emacs_Transpose_Chars.label=Emacs Transpose Chars
+Emacs/Emacs_Transpose_Lines.label=Emacs Transpose Lines
+Emacs/Emacs_Upcase_Word.label=Emacs Upcase Word
+#}}}
+
+#{{{ Files
+macros.folder.Files.label=파일
+
+Files/Browse_Buffer_Directory.label=버퍼 디렉토리 보기
+Files/Browse_Directory.label=디렉토리 보기
+Files/Buffer_Switcher.label=버퍼 전환기
+Files/Close_All_Except_Active.label=작업중인것 제외하고 모두 닫기
+Files/Copy_Name_to_Clipboard.label=이름을 클립보드에 복사
+Files/Copy_Path_to_Clipboard.label=경로를 클립보드에 복사
+Files/Delete_Current.label=현재 파일 삭제
+Files/Duplicate_Buffer.label=버퍼 복제
+Files/Glob_Close.label=파일 와일드 카드로 닫기
+Files/Insert_Selection.label=선택 텍스트로 지정한 파일 이름의 내용을 읽어 선택 영역에 삽입
+Files/Next_Dirty_Buffer.label=변경한 다음 버퍼
+Files/Open_Path.label=경로 열기
+Files/Open_Selection.label=선택 텍스트로 지정한 파일 이름 열기
+Files/Send_Buffer_To_Next_Split.label=버퍼 내용을 다음 분할에 전송
+Files/Toggle_ReadOnly.label=읽기 전용 설정/해제
+#}}}
+
+#{{{ Interface
+macros.folder.Interface.label=UI(사용자 인터페이스)
+
+Interface/Decrease_Font_Size.label=폰트 크기 줄이기
+Interface/Increase_Font_Size.label=폰트 크기 늘이기
+Interface/Open_Context_Menu.label=팝업 메뉴 열기
+Interface/Reset_TextArea.label=텍스트 영역 초기화
+Interface/Splitpane_Grow.label=현재 분할창 크게하기
+Interface/Toggle_Bottom_Docking_Area.label=하단 도킹 영역 전환
+Interface/Toggle_Left_Docking_Area.label=좌측 도킹 영역 전환
+Interface/Toggle_Right_Docking_Area.label=우측 도킹 영역 전환
+Interface/Toggle_Top_Docking_Area.label=상단 도킹 영역 전환
+#}}}
+
+#{{{ Java
+macros.folder.Java.label=Java언어
+
+Java/Create_Constructor.label=생성자 만들기
+Java/Get_Class_Name.label=클래스 이름 가져오기
+Java/Get_Package_Name.label=패키지 이름 가져오기
+Java/Java_File_Save.label=자바 파일 저장
+Java/Make_Get_and_Set_Methods.label=Get/Set 메소드 만들기
+Java/Preview_JavaDoc_Of_Current_Buffer.label=현재 버퍼의 JavaDoc 미리보기
+#}}}
+
+#{{{ Misc
+macros.folder.Misc.label=기타
+
+Misc/Buffer_to_HyperSearch_Results.label=버퍼 내용을 하이퍼 검색 결과로
+Misc/Debug_BufferSets.label=버퍼 디버깅
+Misc/Display_Abbreviations.label=약어표 내보내기
+Misc/Display_Actions.label=액션 스크립트 목록 내보내기
+Misc/Display_Character_Code.label=현재 커서 위치의 문자코드 출력
+Misc/Display_Shortcuts.label=단축키 테이블 내보내기
+Misc/Evaluate_Buffer_in_BeanShell.label=현재 버퍼의 내용을 BeanShell로 실행하고 결과를 새 버퍼에 담음
+Misc/Hex_Convert.label=16진 변환기
+Misc/HyperSearch_Results_to_Buffer.label=하이퍼 검색 결과를 버퍼로
+Misc/Make_Bug_Report.label=버그 리포트 제작
+Misc/Run_Script.label=스크립트 실행
+Misc/Show_Threads.label=쓰레드 보기
+#}}}
+
+#{{{ Properties
+macros.folder.Properties.label=속성
+
+Properties/Create_Plugin_Announcement.label=Plugin Announcement 만들기
+Properties/Insert_Buffer_Properties.label=버퍼 속성 가져오기
+Properties/jEdit_Properties.label=jEdit 속성 가져오기
+Properties/Look_and_Feel_Properties.label=사용자 인터페이스(UI) 속성 가져오기
+Properties/System_Properties.label=시스템 속성 가져오기
+#}}}
+
+#{{{ Text
+macros.folder.Text.label=텍스트
+
+Text/Add_Prefix_and_Suffix.label=행범위에 접두어/접미어 붙이기
+Text/Color_Picker.label=색상 선택기
+Text/Compose_Tag.label=태그 생성하기
+Text/Duplicate_Line.label=행 복제
+Text/Insert_Date.label=일자 삽입
+Text/Insert_Tag.label=태그 삽입
+Text/Line_Filter.label=라인 필터
+Text/Next_Char.label=다음 문자
+Text/Reverse_Lines.label=행 뒤집기
+Text/Single_Space_Buffer.label=버퍼 정리(공백 문자 하나로 만들기)
+#}}}
+
+#}}}
+
+#}}}
diff --git a/org/jedit/localization/package.html b/org/jedit/localization/package.html
new file mode 100644
index 0000000..714f4a3
--- /dev/null
+++ b/org/jedit/localization/package.html
@@ -0,0 +1,22 @@
+<html>
+<!-- :encoding=utf-8: -->
+<body>
+<p>This folder contains property files for localization in different
+languages. To add another localization to jEdit, you can add
+a new property file to this folder, but be sure to also fix
+the following properties in <tt>jedit_gui.props</tt>. </p>
+<ol>
+<li> Update the
+<tt>available.lang</tt> to list
+the 2-letter localization code for the language you added.
+</li>
+<li> Add a new property for the "display name"
+of the new language, preferably in the language itself. For example:
+<pre>
+options.appearance.lang.ja=日本語
+</pre>
+</li>
+</ol>
+
+</body>
+</html>
diff --git a/org/jedit/options/OptionGroupPane.java b/org/jedit/options/OptionGroupPane.java
index 074dd7d..ad94f55 100644
--- a/org/jedit/options/OptionGroupPane.java
+++ b/org/jedit/options/OptionGroupPane.java
@@ -303,6 +303,7 @@ public class OptionGroupPane extends AbstractOptionPane implements TreeSelection
 		}
 
 		paneTree = new JTree(optionTreeModel);
+		paneTree.setRowHeight(0);
 		paneTree.setRootVisible(false);
 		paneTree.setCellRenderer(new PaneNameRenderer());
 		
diff --git a/org/jedit/options/TabbedOptionDialog.java b/org/jedit/options/TabbedOptionDialog.java
index c7ab53b..5203693 100644
--- a/org/jedit/options/TabbedOptionDialog.java
+++ b/org/jedit/options/TabbedOptionDialog.java
@@ -84,7 +84,7 @@ public class TabbedOptionDialog extends EnhancedDialog implements ActionListener
 
 	} // }}}
 
-	// {{{ OptionsDialog constructor
+	// {{{ TabbedOptionDialog constructor
 	public TabbedOptionDialog(Dialog dialog, String name)
 	{
 		super(dialog, jEdit.getProperty(name + ".title"), true);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jedit.git



More information about the pkg-java-commits mailing list