*getscript.txt*	For Vim version 7.0.  Last change: 2006 Apr 30

		Get the Latest VimScripts

Authors:  Charles E. Campbell, Jr.  <NdrOchip@ScampbellPfamilyA.Mbiz>
	  (remove NOSPAM from the email address)
						*GetLatestVimScripts-copyright*
Copyright: (c) 2004-2005 by Charles E. Campbell, Jr.
	   The VIM LICENSE applies to GetLatestVimScripts.vim and
	   GetLatestVimScripts.txt (see |copyright|) except use
	   "GetLatestVimScripts" instead of "Vim".
	   No warranty, express or implied.  Use At-Your-Own-Risk.


==============================================================================
1. Contents						*glvs-contents*

	1. Contents.......................................: |glvs-contents|
	2. GetLatestVimScripts Usage......................: |glvs|
	3. GetLatestVimScripts Data File..................: |glvs-data|
	4. GetLatestVimScripts Plugins....................: |glvs-plugins|
	5. GetLatestVimScripts AutoInstall................: |glvs-autoinstall|
	6. GetLatestVimScripts Algorithm..................: |glvs-alg|
	7. GetLatestVimScripts History....................: |glvs-hist|


==============================================================================
2. GetLatestVimScripts Usage	      *getlatestvimscripts* *getscript* *glvs*

	While in vim, type
>
		:GetLatestVimScripts
<
	Unless its been defined elsewhere,
>
		:GLVS
<
	will also work.

	The script will attempt to update and, if so directed, automatically
	install scripts from http://vim.sourceforge.net/.  To do so it will
	peruse a file, [.vim|vimfiles]/GetLatest/GetLatestVimScripts.dat
	(see |glvs-data|), and examine plugins in your [.vim|vimfiles]/plugin
	directory (see |glvs-plugins|).

	Scripts which have been downloaded will appear in the .../GetLatest
	subdirectory.

	The <GetLatestVimScripts.dat> file will be automatically be updated to
	reflect the latest version of script(s) so downloaded.


==============================================================================
3. GetLatestVimScripts Data File	*getlatestvimscripts-data* *glvs-data*

	The Data file has a header which should appear as:
>
		ScriptID SourceID Filename
		--------------------------
<
	Below that are three columns; the first two are numeric followed by a
	text column.

	The first number on each line gives the script's ScriptID.  When
	you're about to use a web browser to look at scripts on
	http://vim.sf.net/, just before you click on the script's link, you'll
	see a line resembling

	http://vim.sourceforge.net/scripts/script.php?script_id=40

	The "40" happens to be a ScriptID that GetLatestVimScripts needs to
	download the associated page.

	The second number on each line gives the script's SourceID.  The
	SourceID records the count of uploaded scripts as determined by
	vim.sf.net; hence it serves to indicate "when" a script was uploaded.
	Setting the SourceID to 1 insures that GetLatestVimScripts will assume
	that the script it has is out-of-date.

	The SourceID is extracted by GetLatestVimScripts from the script's
	page on vim.sf.net; whenever its greater than the one stored in the
	GetLatestVimScripts.dat file, the script will be downloaded.

	If your script's author has included a special comment line in his/her
	plugin, the plugin itself will be used by GetLatestVimScripts to build
	your <GetLatestVimScripts.dat> file, including any dependencies on
	other scripts it may have.

	If your comment field begins with :AutoInstall:, GetLatestVimScripts
	will attempt to automatically install the script.  Thus,
	GetLatestVimScripts thus provides a comprehensive ability to keep your
	plugins up-to-date!

==============================================================================
4. GetLatestVimScripts Plugins	*getlatestvimscripts-plugins* *glvs-plugins*


	If a plugin author includes the following comment anywhere in their
	plugin, GetLatestVimScripts will find it and use it to build user's
	GetLatestVimScripts.dat files:
>
				     src_id
					    v
		" GetLatestVimScripts: ### ### yourscriptname
					^
				    scriptid
<
	As an author, you should include such a line in to refer to your own
	script plus any additional lines describing any plugin dependencies it
	may have.  Same format, of course!

	If your command is auto-installable (see |glvs-autoinstall|), and most
	scripts are, then you may include :AutoInstall: at the start of
	"yourscriptname".

	GetLatestVimScript commands for those scripts are then appended, if
	not already present, to the user's GetLatest/GetLatestVimScripts.dat
	file.  Its a relatively painless way to automate the acquisition of
	any scripts your plugins depend upon.

	Now, as an author, you probably don't want GetLatestVimScripts to
	download your own scripts for you yourself, thereby overwriting your
	not-yet-released hard work.  GetLatestVimScripts provides a solution
	for this:  put
>
		0 0 yourscriptname
<
	into your <GetLatestVimScripts.dat> file and GetLatestVimScripts will
	skip examining the "yourscriptname" scripts for those
	GetLatestVimScript comment lines.  As a result, those lines won't be
	inadvertently installed into your <GetLatestVimScripts.dat> file and
	subsequently used to download your own scripts.  This is especially
	important to do if you've included the :AutoInstall: option.

	Be certain to use the same "yourscriptname" in the "0 0
	yourscriptname" line as you've used in your GetLatestVimScript
	comment!


==============================================================================
5. GetLatestVimScripts AutoInstall	*getlatestvimscripts-autoinstall*
					*glvs-autoinstall*

	GetLatestVimScripts now supports "AutoInstall".  Not all scripts are
	supportive of auto-install, as they may have special things you need
	to do to install them (please refer to the script's "install"
	directions).  On the other hand, most scripts will be
	auto-installable.

	To let GetLatestVimScripts do an autoinstall, the data file's comment
	field should begin with (surrounding blanks are ignored):

		:AutoInstall:

	Both colons are needed, and it should begin the comment
	(yourscriptname) field.

	One may prevent any autoinstalling by putting the following line
	in your <.vimrc>:
>
		let g:GetLatestVimScripts_allowautoinstall= 0
<

	With :AutoInstall: enabled, as it is by default, files which end with

	  ---.tar.bz2  : decompressed and untarred in [.vim|vimfiles] directory
	  ---.tar.gz   : decompressed and untarred in [.vim|vimfiles] directory
	  ---.vim.bz2  : decompressed and moved to the .vim/plugin directory
	  ---.vim.gz   : decompressed and moved to the .vim/plugin directory
	  ---.zip      : unzipped in [.vim|vimfiles] directory
	  ---.vim      : moved to [.vim|vimfiles]/plugin directory

	and which merely need to have their components placed by the
	untar/gunzip or move-to-plugin-directory process should be
	auto-installable.

	When is a script not auto-installable?  Let me give an example:
>
		[.vim|vimfiles]/after/syntax/blockhl.vim
<
	The <blockhl.vim> script provides block highlighting for C/C++
	programs; it is available at:
>
		http://vim.sourceforge.net/scripts/script.php?script_id=104
<
	Currently, vim's after/syntax only supports by-filetype scripts (in
	blockhl.vim's case, that's after/syntax/c.vim).  Hence, auto-install
	would possibly overwrite the current user's after/syntax/c.vim file.

	In my own case, I use <aftersyntax.vim> (renamed to
	after/syntax/c.vim) to allow a after/syntax/c/ directory:
>
		http://vim.sourceforge.net/scripts/script.php?script_id=1023
<
	The script allows multiple syntax files to exist separately in the
	after/syntax/c subdirectory.  I can't bundle aftersyntax.vim in and
	build an appropriate tarball for auto-install because of the potential
	for the after/syntax/c.vim contained in it to overwrite a user's
	c.vim.


==============================================================================
6. GetLatestVimScripts Algorithm	*getlatestvimscripts-algorithm*
								*glvs-alg*

	The Vim sourceforge page dynamically creates a page by keying off of
	the so-called script-id.  Within the webpage of

		http://vim.sourceforge.net/scripts/script.php?script_id=40

	is a line specifying the latest source-id (src_id).  The source
	identifier numbers are always increasing, hence if the src_id is
	greater than the one recorded for the script in GetLatestVimScripts
	then its time to download a newer copy of that script.

	GetLatestVimScripts will then download the script and update its
	internal database of script ids, source ids, and scriptnames.

	The AutoInstall process will:

		Move the file from GetLatest/ to the following directory
			Unix   : $HOME/.vim
			Windows: $HOME\vimfiles

		if the downloaded file ends with ".bz2"
			bunzip2 it
		else if the downloaded file ends with ".gz"
			gunzip it
		if the resulting file ends with ".zip"
			unzip it
		else if the resulting file ends with ".tar"
			tar -oxvf it
		else if the resulting file ends with ".vim"
			move it to the plugin subdirectory


==============================================================================
7. GetLatestVimScripts History       *getlatestvimscripts-history* *glvs-hist*

	v20 Dec 23, 2005 : * Eric Haarbauer found&fixed a bug with unzip use;
			     unzip needs the -o flag to overwrite.
	v19 Nov 28, 2005 : * v18's GetLatestVimScript line accessed the wrong
			     script! Fixed.
	v18 Mar 21, 2005 : * bugfix to automatic database construction
			   * bugfix - nowrapscan caused an error
			     (tnx to David Green for the fix)
	    Apr 01, 2005   * if shell is bash, "mv" instead of "ren" used in
			     :AutoInstall:s, even though its o/s is windows
	    Apr 01, 2005   * when downloading errors occurred, GLVS was
			     terminating early.  It now just goes on to trying
			     the next script (after trying three times to
			     download a script description page)
	    Apr 20, 2005   * bugfix - when a failure to download occurred,
			     GetLatestVimScripts would stop early and claim that
			     everything was current.  Fixed.
	v17 Aug 25, 2004 : * g:GetLatestVimScripts_allowautoinstall, which
			     defaults to 1, can be used to prevent all
			     :AutoInstall:
	v16 Aug 25, 2004 : * made execution of bunzip2/gunzip/tar/zip silent
			   * fixed bug with :AutoInstall: use of helptags
	v15 Aug 24, 2004 : * bugfix: the "0 0 comment" download prevention wasn't
			     always preventing downloads (just usually).  Fixed.
	v14 Aug 24, 2004 : * bugfix -- helptags was using dotvim, rather than
			     s:dotvim.	Fixed.
	v13 Aug 23, 2004 : * will skip downloading a file if its scriptid or srcid
			     is zero.  Useful for script authors; that way their
			     own GetLatestVimScripts activity won't overwrite
			     their scripts.
	v12 Aug 23, 2004 : * bugfix - a "return" got left in the distribution that
			     was intended only for testing.  Removed, now works.
			   * :AutoInstall: implemented
	v11 Aug 20, 2004 : * GetLatestVimScripts is now a plugin:
			   * :GetLatestVimScripts command
			   * (runtimepath)/GetLatest/GetLatestVimScripts.dat
			     now holds scripts that need updating
	v10 Apr 19, 2004 : * moved history from script to doc
	v9  Jan 23, 2004 :   windows (win32/win16/win95) will use
			     double quotes ("") whereas other systems will use
			     single quotes ('') around the urls in calls via wget
	v8  Dec 01, 2003 :   makes three tries at downloading
	v7  Sep 02, 2003 :   added error messages if "Click on..." or "src_id="
			     not found in downloaded webpage
			     Uses t_ti, t_te, and rs to make progress visible
	v6  Aug 06, 2003 :   final status messages now display summary of work
			     ( "Downloaded someqty scripts" or
			       "Everything was current")
			     Now GetLatestVimScripts is careful about downloading
			     GetLatestVimScripts.vim itself!
			     (goes to <NEW_GetLatestVimScripts.vim>)
	v5  Aug 04, 2003 :   missing an endif near bottom
	v4  Jun 17, 2003 :   redraw! just before each "considering" message
	v3  May 27, 2003 :   Protects downloaded files from errant shell
			     expansions with single quotes: '...'
	v2  May 14, 2003 :   extracts name of item to be obtained from the
			     script file.  Uses it instead of comment field
			     for output filename; comment is used in the
			     "considering..." line and is now just a comment!
			   * Fixed a bug: a string-of-numbers is not the
			     same as a number, so I added zero to them
			     and they became numbers.  Fixes comparison.

==============================================================================
vim:tw=78:ts=8:ft=help
