= FingerText (current version 0.5.60(Alpha))

Tab triggered snippet plugin for Notepad++.

== Description

FingerText is a tab triggered snippet plugin for Notepad++. Support multiple hotspots simultaneous editing, nested hotspots, dynamic hotspots(a lot more than just plain text, you can run commands, or trigger another snippet in your snippets), hotspot text hint(instead of just a $ or # sign) and hotspot default value. It also features a SnippetDock which shows a list of currently available snippets. (see screenshots) You can import or export your snippets and share them to others.

If you are new to FingerText, follow the section "Install", "Importing Sample Snippets" and "Basic Usage" in this file. That should give you a step by step tutorial on how to use FingerText.

== Development Status

This plugin is still in Alpha stage so do expect that it can be buggy. However, things are getting more and more stable now so I am listing out the stability of different parts of the program instead of just saying that "everything can be changed in future releases". Please scroll down to the section "Snippet Syntax and Program Structure Stability" for more details. 

== Install

I guess most notepad++ users are using plugin manager. You can just go to Plugins>Plugin Manager>Show Plugin Manager and look for Fingertext to install this plugin.

However if you would like to install it manually or the plugin manager is not providing the most updated version, you can download the file "FingerText - 0.5.60.zip" at http://sourceforge.net/projects/fingertext/files/Alpha%20Releases/FingerText%20-%200.5.60.zip/download
Unzip the package and copy the FingerText.dll to the plugins folder of Notepad++. This is the only file you need to run FingerText in notepad++.

The readme.rdoc file is for your reference.

== Screenshots

Screenshots are available here:

http://github.com/downloads/erinata/FingerText/FingerText0.5.46_ScreenClip_1_label_2.jpg

http://github.com/downloads/erinata/FingerText/FingerText0.5.46_ScreenClip_2_label_3.jpg

http://github.com/downloads/erinata/FingerText/FingerText0.5.46_ScreenClip_3_label_2.jpg

http://github.com/downloads/erinata/FingerText/FingerText0.5.46_ScreenClip_4_label_2.jpg

== Install Default Snippet Package

You should have FingerText installed. If you are in doubt, go to the notepad++ menu, there should be "FingerText" under "Plugins".

To install the default snippet package, go to notepad++ menu > plugin > FingerText > Install Default Snippet Package and all the sample snippets will be installed.

To verify you have imported the snippets correctly, go to notepad++ menu > Plugins > FingerText > Show SnippetDock. A Dialog with a list of available snippets should show up.

== Basic Usage

Here I assume the you have already install FingerText and imported the sample snippets. If you are not, please refer to previous sections.

Open a new file in notepad++ and go to notepad++ menu > Plugins > FingerText > Show SnippetDock. A Dialog with a list of available plugins should show up. Here you can see a list of available snippets. There is one of them called "<GLOBAL> num". "num" is the trigger text of the snippet. To trigger it, type in "num" (without quotes) and hit the [Tab] key.

  lorem[Tab]

The trigger text disappear and it is replaced by some lorem ipsum text.

  Lorem ipsum dolor sit amet, libero turpis non cras ligula, id commodo, aenean est in volutpat amet sodales, porttitor bibendum facilisi suspendisse, aliquam .......................

That's it. You can try triggering others snippets in the list. Snippet can be as long as several paragraphs (try "lorem"). Or as short as just one word (try "npp")
  
  npp[Tab]

You probably have already noticed, as you type, the SnippetDock is updated. When you type "lor"(without quotes), FingerText will show on the Dock that there is a snippet "lorem", in case you forget how to spell it.

How about if you do not want to type the whole word? just type "lor" and go to Menu>Plugins>FingerText>Tag completion. The word lorem is completed and you can trigger the snippet by hitting [tab]. Assigning the Tag completion to a hot key is highly recommended.

You can trigger snippets anywhere in your document. the snippet will be inserted to the location where you type in the trigger text.

== Snippet Scope

Some snippets are file specific. Try to open a new file and save it as "test.cpp".

Notice that the SnippetDock is updated. There are a bunch of snippets added to the list. One of them is called "<Lang:CPP> cout". Try triggering it inside the test.cpp.

  cout[Tab]
  
The snippet is triggered and a bunch of code is inserted. This snippet is only available when your Notepad++ language choice is CPP. But you can still trigger the global snippets. (Try "time" in the test.cpp file)

As you may notice, <GLOBAL> indicates that the snippet is available anywhere, while <.cpp> snippets are only for .cpp files. The SnippetDock automatically updates the available snippets for your reference. The text box on the top of the SnippetDock will show a preview of the snippet that is currently selected.

== Hotspots Navigation

Some snippets contain hotspots. For example, open a new file and trigger the snippet "mit". 

  mit[tab]

A sample of MIT license will appear in the editor. Notice that your caret is automatically moved to the "year" spot. Now type in 2011 and hit [Tab] again. The caret is now on the name spot and you can enter your name. Hit [Tab] after you enter you name will bring the caret to the end of the text. This is a very convenient way to fill in information while the snippet acts as a template file.

Another way to insert text into hotspot is to pass the text as params. For example you can trigger the snippet "mit" by typing
   
  mit(2010,John Smith)[tab]

Right after you hit tab you should see the same MIT license template with "2010" and "John Smith" automatically filled in to the correct place.

Some of the snippets contain multiple hotspots with the same name. For example you can trigger the snippet "awesome". Your cursor is on all three spots and anything you type will change all of them simultaneously. You can also try the snippet "for" in a .cpp file. Trigger the snippet and press the letter "i" once to change all the iteration variable to "i".

To see feature this in action, open a .cpp file and trigger the snippet "template". Use [tab] to navigate to each part and fill in the details. Now you have a working framework for your cpp main program. (Also see the snippet "simple" in Makefile)

== Creating and Editing Snippets

To create new snippets, the easiest way is to select some text in your document, and go to menu>Plugins>FingerText>Create snippet from selection. The Snippet editor shows up and you can edit the TriggerText and Scope. Click the save button when you finish editing, or you can use the shortkey Ctrl+S.

Alternatively, you can click the create button at the SnippetDock. The snippet editor shows up. You can edit the TriggerText, Scope and enter your snippet content. REMEMBER to place a [>END<] at the end of the snippet. Click the save button when you finish editing, or you can use the shortkey Ctrl+S.

To edit a snippet, select the snippet on the snippet list and click the edit button. You can also double click on the list to edit a particular snippet. Click the save button when you finish editing.

Be careful not to mess up the template when you are editing or creating snippets. If you are in doubt, you can always press the "create" button to get a fresh correct template.

Deleting a snippet is easy, just select the snippet and click the delete button.

== Basic Hotspots Editing

Other than plain text, you can put one or more Hotspots in you snippet.

Hotspots are indicated by $[![Whatever Text]!]. This "Whatever Text" can be a hint of the hotspot, or you can fill it with a default value. (If you type nothing and just hit tab, the hotspot $[![Whatever Text]!] will be substituted by the string "Whatever Text"(without quotes)). You may want to add a empty Hotspot (i.e. $[![]!]) at the location where you want the cursor to move to after tabbing through the last hotspot. Try to edit the sample snippets and use them as reference. 

Notice that hotspots with the same name will be highlighted at the same time. Try editing the snippet "for" which you have triggered in previous section. You can see that there are a bunch of $[![(var)]!], which will be highlighted simultaneously when the snippet is triggered.

You may also add one $[0[]0] in your snippet. This indicates the final caret position, which means where you want the caret to locate after you have navigate through all the hotspots.

Anything after [>END<] will not be inserted into the document so you can write comment about the snippet there.

Chinese characters are supported. You can try it by triggering the snippet "chinese". All snippets should be encoded in UTF-8 and being triggered in UTF-8 document. Notice that Chinese character tag names are not supported. Actually sometimes it works sometimes it doesn't so it is not officially supported. 

== Dynamic Hotspots
FingerText supports dynamic hotspots. Currently, there are five kinds of dynamic hotspots.

- Chain - This is indicated by $[![(cha)somesnippet]!]. When the snippet is triggered, this hotspot is replaced by the text generated from activating another snippet "somesnippet". You can trigger the snippet "chain" to see how it works

- Keyword - This is indicated by $[![(key)XXXXX]!]. And XXXXX is some predefined keyword. Currently the supported keywords are DATE, TIME, FILENAME, EXTNAME, DIRECTORY and PASTE. All of them are self-explaining (like DATE will insert the current date). And among them the most important one is PASTE. If your snippet contain $[![(key)PASTE]!], it will be replaced by whatever text in the clipboard. This is very useful in tag languages or snippets that turn a bunch of code into a function. To see this in action, copy a line of code and trigger the snippet "method". The code that you copied will be turned into a ruby method.

- Command - This is indicated by $[![(run)XXXXX]!]. And XXXXX is some command that you can run in the console. For example $[![(run)dir]!] will fill your hotspot with the output that you would see when you run dir in console. Of course you can run a batch file if you want. Try snippet "cmddir" and "cmdbat" to see it in action.

- Option - This is indicated by $[![(opt)XXX|YYY|ZZZ]!]. Just make a snippet containing $[![(opt)Snippet1|Snippet2|Snippet3|Snippet4]!] and try to trigger it. The text "Snippet1" will be inserted to the editor. Press right/down arrow to go to next option, and left/up arrow to go to previous option. Press tab again when you are done choosing the options.

- List - This is indicated by $[![(lis)XXX|YYY|ZZZ]!]. Just make a snippet containing $[![(lis)Snippet1|Snippet2|Snippet3|Snippet4]!] and try to trigger it. A dropdown box will appear and you can choose from the list items.

- Evaluation(experimental) - This is indicated by $[![(eva)XXXXX]!]. This hotspot evaluate what's inside the hotspot and put the answer in to notepad++. For example $[![(eva)1+(2-3)*4/5]!] will yield 0.2 and $[![(eva)sin(PI/2)]!] will yield 1.

More dynmaic hotspot types are coming.

== Snippets Backup and Sharing

To backup the snippets, you can go to notepad++ menu > Plugins > FingerText > Export Snippets. Choose a file name (which extension .ftd) and the snippets are exported. You can import them in the same way as importing the sample snippets.

The .ftd files are in plain text so you can edit them directly too. But don't do that unless you know exactly what you are doing because this can cause serious problem in importing and exporting. Editing .ftd files is not officially supported. If you use sqlite, you can directly edit the snippet database too. It is not officially supported neither.

== Snippet Syntax and Program Structure Stability
- snippet triggering (stable) - snippets are default to be triggered by tab. You can change it to the hotkey you like but I assume that you are using the default hotkey
- static hotspots (stable) - static hotspots are indicated by $[![XXXXX]!] where XXXXX is the default value of the hotspots. This won't be changed unless serious compatibility issues happen.
- dynamic hotspots (not stable) - currently there are 3 kinds of dynamic hotspots, chain, keyword and command. They are indicated by $[![(cha)XXXXX]!], $[![(key)XXXXX]!] and $[![(run)XXXXX]!] respectively. I am still experimenting what's the best way to do it so do expect changes in future releases.
- Folder Structure (stable) - the FingerText.ini and FingerText.db3 file are staying in config/FingerText folder.
- Database Structure (not stable) - the structure of FingerText.db3 is not stable yet but the user is not supposed to edit the database file directly.
- Snippet Package format (not stable) - currently using the ftd format.

== Upgrading from 0.5.36 or above

Everything is compatible.

== Upgrading from any version between 0.5.20 and 0.5.35

In version 0.5.60 after you triggered a option hotspot, you can use right/down arrow to move to next option, left/up arrow to move to previous option. Hit tab confirm the choice.
Also the option hotspot is not delimited by |~| anymore, it's using is simplier |. So $[![(opt)ABC|DEF|GHI]!] will define an hotspot with 3 options.

== Upgrading from any version between 0.5.0 and 0.5.18

All hotspots are now triggered from inside to outside, left to right. Therefore dynamic snippets that is created before 0.5.20 can behave differently in this version.

== Upgrading from any version between 0.4.0 and 0.4.16

If you want to use your snippets after you upgrade to 0.5.24, you can go to the config folder and move the FingerText.db3 file to the config\FingerText folder after update.

== Upgrading from 0.3.5 or below

FingerText 0.3.5 or below use a "one snippet per file" system to store snippets, which is not compatibile with current version. If you really have a lot of snippets created using these early version, please send your snippet to erinata@gmail.com. I will try my best to import them into the database in the current version.

== Change log 
(for the detail change log (including the development log) please refer to the CHANGELOG file in the repository)


0.5.60
- Fingertext will not be shipped with a Fingertextsamplesnippet.ftd file. To install the default snippets, just go to menu > plugin > FingerText > Install Default Snippet Package.
- The symbol "-" is allowed in triggertext.
- Only () can used to wrap parameters. It means that you can only trigger the mit snippet using "mit(Tom)", but not "mit<Tom>".

0.5.58
- The last hotspot problem works for diaglog insertion too
- The "delete all snippet" command backup snippets automatically without asking 
- default hotkey for insertion dialog changed to alt+/
- Ask about overwriting option only when the database is not empty
- Add final caret position $[0[]0] only when necessary so that it won't sprinkle unnecessary $[0[]0] in the document
- Fixed: error in finding previous hotspot when the hotspot is located at the beginning of the document
- Fixed: error causing fingertext do not navigate to another hotspot after choice in (lis)

0.5.56
- use $[0[]0] to indicate final caret position in snippet. If $[0[]0] is not found in snippet, it will be added to the end of snippet automatically.
- automatically navigate to next hotspot when (lis) hotspot is chosen.
- Added: keyword hotspot LASTOPTION and LASTLISTITEM, which will yield the previously chosen option or list item respectively
- Added: keyword DIRECTORY, TEMPFILE and FILEFOCUS now takes delimiter as a parameter. Therefore $[![(key)DIRECTORY]!] will show the current directory, and $[![(key)DIRECTORY:\\]!] will show the current directory with //, e.g. d:\\documents\\files.
- Added: keyword TRIGGERTEXT, which will show the triggertext of the previously triggered snippet
- Added: a menu item which will trigger the previously triggered snippet
- clean up subclassing when Fingertext is closed
- Fixed: bug caused by too many escape chars, now limited to 20
- Fixed: last hotspot or option hotspot not working properly
- updated snippet editor hint
- improved performance in dealing with escape char
- The scope name is finalized. There are 4 kinds of scopes. "Ext" "Name" "Lang" "GLOBAL". So if you want your snippet to be available when the file extension is cpp, you should use "Ext:cpp" (without quotes). If you want the snippet to be available when the file name is Makefile, use "Name:Makefile". If you want the snippet to be available when the language choice in Notepad++ is C++, use "Lang:CPP". If you want the snippet to be available anywhere, use "GLOBAL".
- Added: Scope Association. It means the if you language choice is CPP, those snippets with "Ext:cpp" and "Ext:h" are automatically be available.
- Added: multiple scope. When editing snippets you can put multiple scopes. For example if you put Lang:CPP|Lang:C, the snippets will be save into both scope. And when you open a snippets in editor, it automatically fetch all the identical snippets in different scopes.


0.5.47
- Added: snippet count on snippetDock
- Fixed: delete and edit doesn't scroll the snippet list
- Fixed: Fingertext hotspot will not interfere regular autocomplete
- Changed: Auto hotspot navigation after list box seletion
- Fixed: Messagebox wordings and typos
- Changed: snippet dock show all snippet when there is a selection
- Fixed: The bug of double clicking on Snippet dock will not edit the clicked snippet
- Fixed: problem importing and exporting snippets to very long path name


0.5.46
- Added: Dynamic insertion hint, press alt+. to invoke the insertion dialog, params hint will show when you type the triggertext
- Added: more informative save snippet confirmation message
- Changed: remove spaces in insertion dialog hint
- Added: The snippetdock is reconstructed and provide more functionalities. The layout changes in edit mode.
- Added: you can export a subset of snippets, type the search key in the filter text box in snippetdock. Click "Export Current List to export the current snippet list to a ftd file.
- Fixed: use _ in Oldcopy and fixed the import error
- Fixed: closing snippetdock and reopen cause bug in edit button
- Changed: Disable Fingertext will disable all snippet trigger related functionalities
- Changed: New stub text of new snippet.


0.5.44
- Added: Snippet Dialog - the Default hotkey is "Alt+.". You can bring up the dialog, enter the triggertext in the dialog and hit [TAB] to trigger snippet.  
- Fixed: snippet editor not showing all snippets
- Changed: The snippet dock is showing snippets of different scope in senible order
- Fixed: nested hotspot not triggered correctly when an empty param is inserted
- Performance improvement of hotspot navigation
- Fingertext is now respecting the EOL settings in notepad++. Thanks for username39's patch
- Fixed: Tab is not responsive when notepad++ is launched
- Changed: prevent settings window to be saved in the session
- Fixed: shutdown autocomplete when undo
- Fixed: Params direct Insertion is now compatible with (opt) and (lis)
- Changed: Snippet preview layout is improved.

0.5.42
- Added: improved snippet preview box
- Fixed: memory leakage problem of live update
- Fixed: export snippet error due to live update problem
- Fixed: export and import snippet speed largely improved by shutting down live update during the process
- Fixed: inclusive triggertext complete not working
- improve start up performance by removing redundant updateScintilla calls
- update the settings hint
- Changed: undo after a tab triggertext completetion will become a regular tab
- Fixed: undo works properly after params insertion
- Changed: params insertion can accept values with hotspot tags
- the limit of option numbers is lifted
- Fixed: snippet dock not updating when previous session is loaded.
- Fixed: Notepad++ not registering state of snippet dock
- Fixed: FILENAME EXTNAME keyword insert paths with Chinese characters properly under ANSI
- Added: more instructions about params insertion method into the README. Try to trigger the snippet "mit" by typing "mit(John Smith)" (without quote) and hit tab to see what it means.

0.5.39
- Added: dynamic hotspot (lis), which is a drop down box version of (opt)
- Changed: the default delimiter of (opt) is set to be |
- Changed: Increase the limit of total number of options to 50
- Fixed: Params insertion is now compatible with chain snippet
- Fixed: import snippet character overflow problem
- Fixed: Params insertion cause fingertext to freeze
- Fixed: Pressing return key in the triggertext field of snippet editor cause annotation bug.
- Fixed: a bug causing npp to freeze when updating fingertext and shutdown npp afterwards 
- Performance improvement by using GETTEXTRANGE instead of SETSELECTION and GETSELTEXT

0.5.34
- Fixed: tab caused document to scroll in large documents
- Added: user customizable delimiter of parameter insertion, default value is set to ,
- Fixed: tag_tab_completion notworking

0.5.33
- Fixed: freeze when closing npp immediately after upgrade 
- Changed: Snippets can be triggered after period
- Fixed: a bug causing nested normal hotspot not triggering in correct sequence is fixed.
- Improved performance by removing redundant check during parameter insertion
- Hotspot that skipped by manually moving the caret will be pick up after all other hotspots are triggered
- Fixed: a critical bug of snippet not importing correctly

0.5.30
- Added: hotspots can be instantly replaced by parameters passed to the triggertext
- Added: snippetdock states remember previous state
- Changed: merge in jvdanilo's implementation of executecommand
- Changed: change hotspot (cmd) to (run)
- Changed: conflict suffix is now added to the old snippet instead of new snippet
- Added: option to force multipasting or not
- Fixed: Lang:PHP not working
- upgrade to sqlite3.7.7.1
- snippet triggertext completion are default to be non-inclusive
- Big performance improvement by using direct scintilla method
- Fixed: Buffer changed triggered events (like updateMode) not triggering when user attempt to close npp and cancel afterwards
- turn off live update when selection is rectangle to prevent freeze when selecting multiple line and type
- Change default snippet list length to 1000 to temporarily deal with the problem caused by snippetlistlength limit

0.5.24
- Added: Can go forward (right/down arrow) or backward(left/up arrow) when cycling through option hotspot, tab to choose option
- Added: New snippet editor
- Changed: increase default chain limit to 40
- Added: Import and export action will show waiting cursor
- Fixed: potential memory leakage problem cause by the quick fix in 0.5.20
- Fixed: Fingertext freeze if there are incomplete closing hotspot brankets
- Fixed: better checking for the end of option hotspot

0.5.20
- Changed: All hotspots, both normal and dynamic, are triggered under the same rule, from inside to outside and from left to right. And they all nesting correctly.
- Added: New keyword DATE and TIME. Which makes the format of datetime output customizable, for example you can use $[![(key)DATE:yyyyMMdd]!] to get 20110601 on 1st of June 2011
- Added: export and delete all snippets
- Added: new keyword UPPER and LOWER. For example: $[![(key)UPPER:aBcDe]!] will become ABCDE
- Changed: Nested Dynamic hotspots are allowed. They are triggered from inside to outside just like normal hotspots
- Fixed: Typo in upgrade message
- Fixed: (hopefully) a real fix to selectiontosnippet
- Changed: Pop up option of whether to overwrite or keep copies in conflicting snippets
- Fixed: less memory leakage on liveupdate and snippet import
- Fixed: extra newline in tempfile generation
- Update scintilla.h so that it's compatibile with notepad++ 5.9
- Fixed: great improvement in undo action as live update is turn off temporarily int he middle of an undo action
- Experimental: Language based snippets, for example if you have snippets with scope Lang:HTML, the snippet is available for all HTML files. You can use the scope Lang:C or Lang:PYTHON. Basically all the languages in Notepad++ are supported, such as Lang:HTML, Lang:D ......etc. A complete list of language supported will be in a list when this feature is finalized.
- Experimental: Option Hotspot, just try making a snippet containing $[![(opt)Snippet1|~|Snippet2|~|Snippet3|~|Snippet4]!] and try to trigger it. The text "Snippet1" will be inserted to the editor and everytime you hit [tab], it will cycle though the options provided in the hotspot

0.5.11
- Added: Custom Scope, a user defined Global scope
- Added: User customizable escape character
- Added: snippet preview box live update
- Fixed: Snippet export limited by list length
- Fixed: critical bug when live update is on and a long chain of chinese characters are typed
- Fixed: creating snippet with empty selection sometimes still cause freeze after 0.5.9 fix
- Performance improvement in snippet triggering

0.5.9
- Dynamically resize snippet list
- In case of conflicting snippets during import, Fingertext will generate a conflict copy instead of keep asking whether you want to overwrite or not
- Allow for underscore and period in triggertext
- Added: Option to make triggertext completion less inclusive
- Fixed: bug in importing snippets with different endline characters.
- Fixed: unknown exception and bad allocation in import snippet function
- Added: Close the temp file and Prompt to close the ftb file before import
- Fixed: A temporary fix for cmd hotspot error
- Fixed: creating snippet with empty selection sometimes cause freeze
- Fixed: Extra space added to the end of snippet everytime a snippet is saved.
- Change the wording of the message when no snippets are imported or exported

0.5.7
- performance improvement for live update snippet hint
- fixed: Annotation not shown correctly in editmode
- update quick guide
- Other small typos fixed

0.5.6
- Added: You can trigger snippets in editor mode (but you cannot navigate to hotspots in editor mode as it will disturb snippet editing)
- commands that insert dynamic hotspots are removed (you can make a snippet for that instead)
- Fixed: snippet editor annotation infinite loop bug
- Fixed: snippet editor annotation appear in normal mode by accident
- performance improvement in dynamic hotspot triggering (especially for keyword hotspots)

0.5.4
- The create button will create snippet using selection if selection is not empty.
- Multi pasting work for simultaneous hotspots
- Nested (normal) hotspots
- Empty hotspots are independent of each others.
- Fixed: Snippetdock not updating when save a file with another extension name
- Fixed: Autoscrolling when switch between file
- Fixed: a bug causing hotspot with the same name not triggering correctly
- Fixed: Edit view not activa te correctly when the screen is splitted
- More reliable edit mode

0.5.0
- Added command for inserting different kinds of hotspots
- Added command to create snippet from selection
- Added command to change settings in config.ini
- SnippetDock items are lining up better
- Group config and database files into a FingerText folder under config folder

0.4.16
- Add Dynamic Hotspots. Currently there are 3 types of dynamic hotspots (chain) (key) (cmd). More is coming.
- Added Tag completion command
- Added indentation reference
- Added Live update SnippetDock
- Fixed heap corruption bug in edit snippet, getcurrenttag and hotspotnavigation
- Fixed snippetdock toggle bug
- Fixed incompatibility with tab autocompletion

0.4.11
- Snippets TriggerText and Scope are NOT case sensitive now. Extension .c and .C are viewed as the same extension,and TriggerText "NpP" is the same as "nPp"
- Totally new snippet editing view with more wrong format checking
- Change double click behaviour in SnippetDock. It trigger editview instead of inserting snippets.
- Use ctrl-S to save snippet while in editing view
- Added an "About" and "Quick Guide" command in menu
- Added a command to temporarily enable or disable fingertext
- Added a command to toggle show/Hide SnippetDock
- Added a snippet Preview Box (chinese snippet text not supported)
- Snippets function are disabled when you are editing snippets
- All snippets are shown in SnippetDock when editing snippets
- Remove the list length text box, use ini config file to configure snippet list maximum length (more configuration coming)
- Fixed problem of extra endline during repeated exporting and importing
- save button disabled when the editor is not editing snippet
- More instructions on the snippetdock
- More messages for snippet saving and importing
- Fixed problem of not opening the correct snippet in editor
- Tons of other bugs fixed

0.4.0
- First stable version using sqlite3. 

0.3.11
- Using Sqlite to store snippets instead of using recusive file system.
- Add Snippet Dock, which shows all available snippets according to the curent file.
- Implemented Create Edit and Delete from the snippet dock.
- Impletmented Double Click insert snippet function.

0.3.2
- Last stable version using the recusive file system to store snippets. All the snippets create under this version will not work in version later than FingerText - 0.3.5

0.2.6
- Multiple hotspots selection and hotspot hint text replacement works simultaneously

0.1.0 
- First Alpha verison. Implemented basic tab trigger snippets and hotspots navigation

== Tested with

- Notepad++ 5.9.2(Unicode), Windows 7 Ultimate 64bit 
- Notepad++ 5.9.2(Unicode), Windows XP 
- Notepad++ 5.8.7(Unicode), Windows 7 Ultimate 64bit 
- Notepad++ 5.8.6(Unicode), Windows 7 Ultimate 64bit 

== Credits

Many thanks to..........
- Dave Brotherstone for his helpful comments and programmming help (especially for the sqlite support fork). 
- jvdanilo for his implementation of executeCommand() using CreateProcess instead of _popen
- bbluemel for testing and suggesting solution for the indent reference function.
- Tsz Kin Chan for his suggestions on the UI and testing those super buggy nightly versions.   
- Also thanks for all the other comments and bug report from SourceForge forum and Github.
- And last but not least, Don Ho for making Notepad++ and providing a flexible and well documented api for plugin programming. 

== License

This plugin is built using the ErinataNppPluginTemplate. The template has its 
own license and it invloves some files from the NppPluginTemplate released by 
Don Ho and the Function List plugin released by Jens Lorenz. The licenses of 
those files are included in the source.

DuckEval and sqlite3 have their own licenses. The licenses are included in the 
source.

FingerText version 0.5.58 (excluding the parts mentioned above) is released 
under MIT license.

MIT license

Copyright (C) 2011 by Tom Lam

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.