*bashsupport.txt*                Bash Support                 March 25 2014

Bash Support                                      *bash-support* *bashsupport*
                             Plugin version 4.2.1
                        for Vim version 7.0 and above
                       Fritz Mehner  <mehner@fh-swf.de>

Bash Support implements a bash-IDE for Vim/gVim. It is written to considerably
speed up writing code in a consistent style.  This is done by inserting
complete statements, comments, idioms, and code snippets.  Syntax checking,
running a script, starting a debugger  can be done with a keystroke.  There
are many additional hints and options which can improve speed and comfort when
writing shell scripts. This plug-in can be used for Bash version 4.0.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++  The plug-in version 4.0+ is a rewriting of version 3.12.1.              ++
++  The versions 4.0+ are based on a new and more powerful template system  ++
++  (please see |template-support|for more information).                    ++
++  The template syntax has changed!                                        ++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 1.     Usage with GUI                           |bashsupport-usage-gvim|
 1.1     Menu 'Comments'                         |bashsupport-comments|
 1.1.1   Append aligned comments                 |bashsupport-aligned-comm|
 1.1.2   Adjust end-of-line comments             |bashsupport-comm-realign|
 1.1.3   Comment/uncomment                       |bashsupport-comm-toggle|
 1.1.4   Frame comments, file header, ...        |bashsupport-comm-templates|
 1.1.5   Comment/uncomment with echo             |bashsupport-comm-echo|
 1.1.6   KEYWORD + comment                       |bashsupport-comm-keywords|
 1.2     Menu 'Statements'                       |bashsupport-statements|
 1.2.1    Normal mode, insert mode               |bashsupport-stat-norm-ins|
 1.2.2    Visual mode                            |bashsupport-stat-visual|
 1.3     Menus'Tests' ... 'Shopts'               |bashsupport-tests|
 1.4     Menu 'PatternMatching'                  |bashsupport-pattern|
 1.5     Menu 'I/O-Redir'                        |bashsupport-io-redir|
 1.6     Menu 'Snippets'                         |bashsupport-snippets|
 1.6.1    Code Snippets                          |bashsupport-codesnippets|
 1.6.2    Edit Templates                         |bashsupport-templates-edit|
 1.7     Menu 'Run'                              |bashsupport-run|
 1.7.1    Save and run                           |bashsupport-run-script|
 1.7.2    Script command line arguments          |bashsupport-cmdline-args|
 1.7.3    Bash command line arguments            |bashsupport-bash-cmdline-args|
 1.7.4    Save and check syntax                  |bashsupport-syntax-check|
 1.7.4.1   Error format                          |bashsupport-errorformat|
 1.7.4.2   Syntax check options                  |bashsupport-syntax-check-options|
 1.7.5    Start debugger                         |bashsupport-debugger|
 1.7.6    Hardcopy                               |bashsupport-hardcopy|
 1.7.7    Xterm size                             |bashsupport-xterm|
 1.7.8    Output redirection                     |bashsupport-output|
 1.8     Menu 'Help'                             |bashsupport-help|
 2.     Usage without GUI                        |bashsupport-usage-vim|
 3.     Hot keys                                 |bashsupport-hotkeys|
 4.     Customization and configuration          |bashsupport-customization|
 4.1     Files                                   |bashsupport-custom-files|
 4.2     Global variables                        |bashsupport-custom-variables|
 4.3     The root menu                           |bashsupport-custom-root|
 4.4     System-wide installation                |bashsupport-system-wide|
 5.      Template files and tags                 |bashsupport-templates|
 5.1      Template files                         |bashsupport-templates-files|
 5.2      Macros                                 |bashsupport-templates-macros|
 5.2.1   Formats for date and time               |bashsupport-templates-date|
 5.3      Templates                              |bashsupport-templates-names|
 5.3.1    Template definition                    |bashsupport-templates-definition|
 5.3.1    Template names                         |bashsupport-templates-names|
 5.3.2    The jump tags <+text+> etc.            |bashsupport-templates-jumptags|
 5.3.3    Command Ctrl-j                         |bashsupport-Ctrl-j|
 5.4     Additional filenames with filetype 'sh' |bashsupport-also-bash|
 6.     Bash dictionary                          |bashsupport-dictionary|
 7.     Additional Mappings                      |bashsupport-ad-mappings|
 8.     Windows particularities                  |bashsupport-windows|
 9.     TROUBLESHOOTING                          |bashsupport-troubleshooting|
10.     Release Notes                            |bashsupport-release-notes|

        How to add this help file to Vim's help  |add-local-help|


==============================================================================
1.  USAGE with GUI  (gVim)                            *bashsupport-usage-gvim*
==============================================================================

If the menus are not visible call them with the entry "Load Bash Support"
in the standard Tools-menu.

------------------------------------------------------------------------------
1.1  MENU 'Comments'                                    *bashsupport-comments*
------------------------------------------------------------------------------

1.1.1 APPEND ALIGNED COMMENTS TO CONSECUTIVE LINES  *bashsupport-aligned-comm*
--------------------------------------------------

In NORMAL MODE the menu item 'end-of-line comment' will append a comment to
the current line.
In VISUAL MODE, this item will append aligned comments to all marked lines.
Marking the 4 lines
>
 x11=11;
 x1111=1111;

 x11111111=11111111;
<
and choosing 'end-of-line comment' will yield
>
 x11=11;                                        # |
 x1111=1111;                                    #

 x11111111=11111111;                            #
<
The cursor position above is marked by '|' . Empty lines will be ignored.

The default starting column is 49 ( = (multiple of 2,4, or 8) + 1 ).  This can
be changed by setting a global variable in the file '.vimrc', e.g. :
>
  let g:BASH_LineEndCommColDefault    = 45
<
The starting column can also be set by the menu item 'Comments->adjust
end-of-line com.' . Just position the cursor in an arbitrary column (normal
mode; column number is shown in the Vim status line) and choose this menu
item.  This setting is buffer related.
If the cursor was at the end of a line you will be asked for a column number
because this position is most likely not the desired starting column.  Your
choice will be confirmed.


1.1.2 ADJUST END-OF-LINE COMMENTS                   *bashsupport-comm-realign*
---------------------------------
After some copy/paste/change actions comments may be misaligned:
>
 pathname=$(pwd)                    # the complete path
 basename=${pathname##*/}                # the basename
 dirname=${pathname%/*}                        # the pathname
<
Realignment can be achieved with the menu item 'adjust end-of-line com.' In
normal mode the comment (if any) in the current line will be aligned to the
end-of-line comment column (see above) if possible. In visual mode the
comments in the marked block will be aligned:
>
 pathname=$(pwd)                                # the complete path
 basename=${pathname##*/}                       # the basename
 dirname=${pathname%/*}                         # the pathname
<
Another way is to use the hotkey \cj. In normal and insert mode the current
line will be adjusted. To adjust n lines starting with the current one use
n\cj.

1.1.3  COMMENT/UNCOMMENT                             *bashsupport-comm-toggle*
------------------------
The comment sign # can be set or removed at the beginning of the current line
or for a marked block using the menu items 'comment' (or \cc) and 'uncomment'
(or \cu).  A single line needs not to be marked (normal mode, insert mode).

A marked block
>
 pathname=$(pwd)                                # the complete path
 basename=${pathname##*/}                       # the basename
 dirname=${pathname%/*}                         # the pathname
<
will be changed into (and vice versa)
>
 #pathname=$(pwd)                                # the complete path
 #basename=${pathname##*/}                       # the basename
 #dirname=${pathname%/*}                         # the pathname
<

1.1.4 FRAME COMMENTS, FILE HEADER, ...            *bashsupport-comm-templates*
--------------------------------------

Frame comments, function descriptions and file header comments are read as
templates from the appropriate files (see |bashsupport-templates|).

1.1.5 COMMENT/UNCOMMENT WITH echo                      *bashsupport-comm-echo*
---------------------------------

The echo-entry in the Comments-menu can be used to put one or more statements
in a sort of comment. This is usually done for testing:
>
 echo "rm -f $allfiles"
<
This can only be done in normal mode: The complete line (from the first
non-blank to the end) is framed with  echo "..." ; the cursor will then be
moved to the next line. Now this line can be framed and so forth.

The remove-echo-entry removes an echo.  The keyword echo, the following double
quotation mark, and the last double quotation mark in the current line will be
removed; the cursor will then be moved to the next line.

1.1.6 KEYWORD+comment                              *bashsupport-comm-keywords*
---------------------

Preliminary end-of-line comments to document (and find again!) places where
work will be resumed shortly, like
>
 # :BUG:23.05.2013 16:43:fgm: 
<
Here 'fgm' is the authors reference (see section 4. for templates and tags).
Usually these comments are not meant for the final documentation.

------------------------------------------------------------------------------
1.2  MENU 'Statements'                                *bashsupport-statements*
------------------------------------------------------------------------------

1.2.1  NORMAL MODE, INSERT MODE.                   *bashsupport-stat-norm-ins*
--------------------------------

An empty statement will be inserted and properly indented. The item 'if'
will insert an if-statement:
>
 if | ; then
 fi
<
The statement will be indented.

1.2.2  VISUAL MODE                                   *bashsupport-stat-visual*
------------------
The highlighted area
>
 xxxxx
 xxxxx
<
can be surrounded by one of the following statements ( '|'
marks the cursor position after insertion):
>
  +--------------------------+---------------------------------------+
  |                          |                                       |
  |  for | in ; do           |  for (( CNTR=0; CNTR<|; CNTR++ )); do |
  |    xxxxx                 |    xxxxx                              |
  |    xxxxx                 |    xxxxx                              |
  |  done                    |  done                                 |
  |                          |                                       |
  +--------------------------+---------------------------------------+
  |                          |                                       |
  |  if | ; then             |  if | ; then                          |
  |    xxxxx                 |    xxxxx                              |
  |    xxxxx                 |    xxxxx                              |
  |  fi                      |  else                                 |
  |                          |                                       |
  |                          |  fi                                   |
  |                          |                                       |
  +--------------------------+---------------------------------------+
  |                          |                                       |
  |  select | in ; do        |  until | ; do                         |
  |    xxxxx                 |    xxxxx                              |
  |    xxxxx                 |    xxxxx                              |
  |  done                    |  done                                 |
  |                          |                                       |
  +--------------------------+---------------------------------------+
  |                          |                                       |
  |  while | ; do            |                                       |
  |    xxxxx                 |                                       |
  |    xxxxx                 |                                       |
  |  done                    |                                       |
  |                          |                                       |
  +--------------------------+---------------------------------------+
  |                                                                  |
  |  fname ()                                                        |
  |  {                                                               |
  |    xxxxx                                                         |
  |    xxxxx                                                         |
  |  }  # ----------  end of function fname  ----------              |
  |                                                                  |
  +------------------------------------------------------------------+
<
The whole statement will be indented after insertion.

------------------------------------------------------------------------------
1.3  MENUS 'Tests' ... 'Shopts'                            *bashsupport-tests*
------------------------------------------------------------------------------

Insert tests, parameter substitutions, ... I/O-redirections. 

------------------------------------------------------------------------------
1.4  MENU 'PatternMatching'                              *bashsupport-pattern*
------------------------------------------------------------------------------

This menu can be used to compose globs and regular expressions with a few
keystrokes.  In normal and insert mode the items insert the shown constructs
after the cursor. The first group ( "zero or more" ... "anything expect") can
enclose a marked text.  The marked text
>
 xxxxx
<
will be changed into
>
 *(xxxxx|)
<
by the first choice.

------------------------------------------------------------------------------
1.5  MENU 'I/O-Redir'                                   *bashsupport-io-redir*
------------------------------------------------------------------------------

This menu can be used to insert I/O redirectors. The cursor will be positioned
at the obvious or most likely continuation point.
The item 'here-document' has a visual mode. A few marked lines will be
surrounded by the necessary statements, e.g.
>
 << EOF
 xxxxxxxxxxx
 xxxxxxxxxxx
 EOF
 # ===== end of here-document =====
<

------------------------------------------------------------------------------
1.6  MENU 'SNIPPETS'                                    *bashsupport-snippets*
------------------------------------------------------------------------------

1.6.1 Code Snippets                                 *bashsupport-codesnippets*
-------------------
Code snippets are pieces of code which are kept in separate files in a special
directory. File names are used to identify the snippets.  The default snippet
directory is  '$HOME/.vim/bash-support/codesnippets'.  Snippets are managed
with the 4 items
>
 'read  code snippet'
 'view  code snippet'
 'write code snippet'
 'edit  code snippet'
<
from the Snipptes submenu.

Creating a new snippet:
-----------------------
When nothing is marked, 'write code snippet' will write the whole buffer
to a snippet file, otherwise the marked area will be written to a file.

Insert a snippet:
-----------------
Select the appropriate file from the snippet directory ('read  code snippet').
The inserted lines will be indented.

Indentation / no indentation
----------------------------
Code snippets are normally indented after insertion. To suppress indentation
add the file extension "ni" or "noindent" to the snippet file name, e.g.
>
  parameter_handling.noindent
<
Snippet browser
---------------
Under a GUI a file requester will be put up. Without GUI the filename will be
read from the command line. You can change this behavior by setting a global
variable in your $HOME/.vimrc :
>
 let g:BASH_GuiSnippetBrowser = 'commandline'
<
The default value is 'gui'.


1.6.2  Edit Templates                             *bashsupport-templates-edit*
---------------------
Nearly all menu items insert code snippets or comments. All of these are
contained within template files and can be changed by the user to meet their
requirements (see|bashsupport-templates|on how to use the template system).

The menu item 'edit templates' opens the main template file in a local plug-in
installation. This is usually the file
'$HOME/.vim/bash-support/templates/Templates'.  There may be dependent files
loaded from the main file.  Now change whatever file you want, save it, and
click on the menu item 'reread templates' to read in the file(s) and to
rebuild the internal representation of the templates. If menu items,  hotkeys,
or shortcuts have been added or changed these changes will be applied with the
next start of Vim.

------------------------------------------------------------------------------
1.7  MENU 'Run'                                              *bashsupport-run*
------------------------------------------------------------------------------

1.7.1 Save and run                                    *bashsupport-run-script*
------------------

Save the current buffer to his file and run this file. The command line, the
applied parameters and the shell return code are shown in the bottom line.

 * In NORMAL MODE the whole buffer will be executed.
 * In VISUAL MODE only the selected lines will be executed.

There are three output destinations (see|bashsupport-output|).  If the output
destination is VIM runtime errors are caught in an error window allowing
quickfix commands to be used (see|quickfix|).

The shell used can be set in the file '.vimrc', e.g. :
>
  let g:BASH_Executable			= '/bin/zsh'
<
The default is the value of $SHELL (Linux/U**X) or 'bash.exe' (Windows).

1.7.2 Script command line arguments                 *bashsupport-cmdline-args*
-----------------------------------

The item 'script cmd. line arg.' calls an input dialog which asks for command
line arguments. These arguments are forwarded to the script which is run by
the 'run' item. The arguments are kept until you change them. For file names
tab-expansion will work.  The ex command
>
  :BashScriptArguments ...
<
can also be used to set the command line arguments for the current script.

The arguments belong to the current buffer (that is, each buffer can have its
own arguments). The input dialog has a history.

If the buffer gets a new name with "save as" the arguments will now belong to
the buffer with the new name.

1.7.3 Bash command line arguments              *bashsupport-bash-cmdline-args*
---------------------------------

The menu item 'Bash com. line arg.' calls an input dialog which asks for
command line options for the the Bash shell running the script in the actual
buffer (like -x or -v; see the Bash manual for possible options). These
arguments are forwarded to the invocation of Bash which is run by the 'run'
entry. The arguments are kept until you change them.  

The arguments belong to the current buffer (that is, each buffer can have its
own arguments).
If the buffer gets a new name with "save as" the arguments will now belong to
the buffer with the new name.

1.7.4 Save and check syntax                         *bashsupport-syntax-check*
---------------------------

Save the current buffer to this file and run this file with the -n flag
(Bash: read commands but do not execute them; same for dash, ksh, zsh).
Errors are listed in an error window; now the quickfix commands can be used.

1.7.4.1 ERROR FORMAT                                 *bashsupport-errorformat*
--------------------
The format used to parse runtime errors handle bash, dash, ksh, and zsh
errors.  This format is appropriate for most locales including 'C' and
'POSIX'. 

1.7.4.2 SYNTAX CHECK OPTIONS                *bashsupport-syntax-check-options*
----------------------------

The syntax check can be influenced by shopt options. Options which shall
always take effect can be declared in '.vimrc' , e.g.
>
  let g:BASH_SyntaxCheckOptionsGlob  = "-O extglob"
<
These options can be augmented or canceled using the menu entry 'syntax check
options' typing for instance
>
  +O extglob -O nocaseglob
<
after the prompt. The options entered this way are buffer related.  The global
options set in '.vimrc' and the buffer related options are checked.


1.7.5 START DEBUGGER                                    *bashsupport-debugger*
--------------------

Start the debugger 'bashdb' or the frontend 'ddd' from the menu entry
Run->debug (GUI), with hotkey \rd or F9.  Your version of the bash must be
prepared for debugging and the debugger must be installed (see
http://bashdb.sourceforge.net/).

(1) Using bashdb
When using gvim or vim running under a GUI the debugger will be started in an
independent xterm. This is done because the shell integration in gvim has
deficiencies (see also :h shell-window).

When using vim from a console terminal the debugger will be started as
>
  :!xterm <xterm defaults>  -e bashdb -- <script> <arguments> &
<
The debugger now will be run inside vim.

(2) Using ddd
The frontend ddd can be started via the menu or the hotkeys instead of bashdb
as described above.  The preference can be set with the global variable
g:BASH_Debugger (possible values: 'term', 'ddd' ) in '.vimrc' :
>
  let g:BASH_Debugger     = 'ddd'
<
The default is 'term'.

In all cases the command line arguments from the argument setting
(|bashsupport-cmdline-args|) are passed to the debugger.


1.7.6 Hardcopy                                          *bashsupport-hardcopy*
--------------

Generates a PostScript file from the whole buffer or from a marked region.
The hardcopy goes to the current working directory.  If the buffer contains
documentation or other material from non-writable directories the hardcopy
goes to the HOME directory. The output destination will be shown in a message.

The print header contains date and time for the current locale. The definition
used is
>
  let s:BASH_Printheader = "%<%f%h%m%<  %=%{strftime('%x %X')}     Page %N"
<
The current locale can be overwritten by changing the language, e.g.
>
  :language C
<
or by setting a global variable in the file '.vimrc', e.g. :
>
  let g:BASH_Printheader = "%<%f%h%m%<  %=%{strftime('%x %X')}     SEITE %N"
<
See :h printheader and :h strftime()  for more details.


1.7.7 Xterm size                                           *bashsupport-xterm*
----------------

The size of the xterm (see below) can be changes for the current session.  The
size has to be specified as COLUMNS LINES (e.g. 96 32 ).

1.7.8 Output redirection                                  *bashsupport-output*
------------------------

The last menu entry 'output: ... ' has 3 states:
  'output: VIM->buffer->xterm'
  'output: BUFFER->xterm->vim'
  'output: XTERM->vim->buffer'
The first state (upper-case) is the current one.

Target VIM
----------
The script is run from the command line like  ":!${SHELL}  %  arguments".
This is suitable for scripts with dialog elements and few lines of output.

When a script is started this way errors and warnings (if any) are caught in
an error window allowing quickfix commands to be used (see|quickfix|).

Target BUFFER
-------------
The shell output will be displayed in a window with name "Bash-Output".  This
buffer and its content will disappear when the window is closed.  It is not
writable and it has no file. The content could be saved with "save as".
If the output fits completely into this window the cursor will stay in the
script window otherwise the cursor will be set into the output window (you may
want to scroll).
When the script is run again and the output buffer is still open it will be
reused.

The buffer will not be opened if the script does not produce any output.
This is for convenience; you do not have to close an empty buffer.

* This is suitable for scripts without dialog elements and many lines of output
* (e.g. from options like xtrace). Use Vim as pager (scroll, jump, search with
* regular expressions, .. )

Target XTERM
------------
The script will be run in a xterm-window. A wrapper script will ask you to
close this window with Return or <C-D> (bash).
The wrapper shows the complete command line and the return code of the script.

* This is suitable for scripts with dialog elements and many lines of output.
* The xterm is scrollable and independent from the editor window.

Appearance of the xterm
-----------------------
The appearance of the xterm can be controlled by the global variable
g:BASH_XtermDefaults. The assignment
>
  let g:BASH_XtermDefaults = "-fa courier -fs 10 -geometry 96x32"
<
placed in '.vimrc' would override the defaults. The defaults are
>
  "-fa courier -fs 12 -geometry 80x24"
<
FreeType font 'courier', FreeType font size 12 point, window width 80
characters, window height 24 lines.

The default output method is VIM. The preferred output method can be selected
in '.vimrc' by the global variable g:BASH_OutputGvim, e.g.
>
  let g:BASH_OutputGvim            = "xterm"
<
The methods are "vim", "buffer" and "xterm".

------------------------------------------------------------------------------
1.8  MENU 'Help'                                            *bashsupport-help*
------------------------------------------------------------------------------

Item 'Bash manual'
---------------------------
Open the Bash manual.

Item 'help (Bash builtins)'
---------------------------
Look up Bash help for the word under the cursor. If there is no word under the
cursor you will be asked for the name of a builtin. The tab expansion can be
used.

Item 'manual (utilities)'
-------------------------
Display the manual for the word under the cursor. If there is more than one
hit a list of possibilities will be displayed to choose from.

If there is no word under the cursor you will be asked for the name of a
command line utility. In this case the command completion is on while entering
a name.
An interface to the on-line reference manuals must be installed (usually
man(1) for Linux/Unix, see|bashsupport-custom-variables|).

Item 'bash-support'
-------------------
Display this help text if it was properly added with ':helptags'.


==============================================================================
2.  USAGE without GUI  (Vim)                           *bashsupport-usage-vim*
==============================================================================

The frequently used constructs can be inserted with key mappings.  The
mappings are also described in the document 'bash-hotkeys.pdf' (reference
card, part of this package).

 * All mappings are filetype specific: they are only
 * defined for buffers with filetype 'sh' to minimize conflicts with mappings
 * from other plug-ins.

Hint: Typing speed matters. The combination of a leader ('\') and the
following character(s) will only be recognized for a short time.

Some mappings can be used with line range. In normal mode
>
 \cl
<
appends a end-of-line comment to the current line,  whereas 
>
 4\cl
<
appends end-of-line comments to the 4 lines starting with the current line.

Legend:  (i) insert mode, (n) normal mode, (v) visual mode
         [n] range

  -- Submenus ----------------------------------------------

     \bps    parameter substitution (list)       (n, i)
     \bsp    special parameters (list)           (n, i)
     \ben    environment (list)                  (n, i)
     \bbu    builtin (list)                      (n, i)
     \bse    set options (list)                  (n, i)
     \bso    shopts (list)                       (n, i)
   
  -- Comments ----------------------------------------------

  [n]\cl     line end comment                    (n, i, v)
  [n]\cj     adjust end-of-line comments         (n, i, v)
     \cs     set end-of-line comment column      (n)
  [n]\cc     code -> comment                     (n, i, v)
  [n]\cu     uncomment code                      (n, i, v)
     \cfr    frame comment                       (n, i)
     \cfu    function description                (n, i)
     \ch     file header                         (n, i)
     \cd     date                                (n, i, v)
     \ct     date & time                         (n, i, v)
     \css    script sections                     (n, i)
     \ckc    keyword comments                    (n, i)
     \cma    plug-in macros                      (n, i)
     \ce     echo "..."                          (n, i)
     \cr     remove echo "..."                   (n, i)

  -- Statements ---------------------------------------------

     \sc     case in ... esac                    (n, i)
     \sei    elif then                           (n, i)
     \sf     for in do done                      (n, i, v)
     \sfo    for ((...)) do done                 (n, i, v)
     \si     if then fi                          (n, i, v)
     \sie    if then else fi                     (n, i, v)
     \ss     select in do done                   (n, i, v)
     \su     until do done                       (n, i, v)
     \sw     while do done                       (n, i, v)
     \sfu    function                            (n, i, v)
     \se     echo -e "..."                       (n, i, v)
     \sp     printf "..."                        (n, i, v)
     \sa     array element, ${.[.]}              (n, i, v)
     \saa    array elements (all), ${.[@]}       (n, i, v)
     \sas    array elements (string), ${.[*]}    (n, i, v)
     \ssa    subarray, ${.[@]::}                 (n, i, v)
     \san    no. of array elements, ${#.[@]}     (n, i, v)
     \sai    array indices, ${!.[*]}             (n, i, v)

  -- Test ---------------------------------------------------

     \ta     arithmetic tests                    (n, i)
     \tfp    file permission                     (n, i)
     \tft    file types                          (n, i)
     \tfc    file characteristics                (n, i)
     \ts     string comparison                   (n, i)
     \toe    option is enabled                   (n, i)
     \tvs    variables has been set              (n, i)
     \tfd    file descriptor is open             (n, i)
     \tm     string matches regexp               (n, i)

  -- I/O-Redirection ----------------------------------------
     \ior    IO-redirections (list)              (n, i)
     \ioh    here-document                       (n, i)

  -- Pattern Matching ---------------------------------------

     \pzo    zero or more, ?( | )                (n, i)
     \pzm    zero or more, *( | )                (n, i)
     \pom    one or more, +( | )                 (n, i)
     \peo    exactly one, @( | )                 (n, i)
     \pae    anything except, !( | )             (n, i)
     \ppc    POSIX classes                       (n, i)
     \pbr    BASH_REMATCH                        (n, i)

  -- Snippets -----------------------------------------------

     \nr     read code snippet                   (n, i)
     \nv     view code snippet  (readonly)       (n, i)
     \nw     write code snippet                  (n, v, i)
     \ne     edit code snippet                   (n, i)

     \ntl    edit templates                      (n, i)
     \ntr    reread the templates                (n, i)
     \nts    switch template style               (n, i)

  -- Run ----------------------------------------------------

  [n]\rr     update file, run script             (n, i)
     \ra     set script cmd. line arguments      (n, i)
     \rba    set Bash cmd. line arguments        (n, i)
     \rc     update file, check syntax           (n, i)
     \rco    syntax check options                (n, i)
     \rd     start debugger                      (n, i)
     \re     make script executable/not exec.(*) (in )
     \rh     hardcopy buffer to FILENAME.ps      (n, i)
     \rs     plug-in settings                    (n, i)
     \rt     set xterm size (*)                  (n, i)
     \ro     change output destination           (n, i)

  -- Bash help ----------------------------------------------

     \hb     Displays the Bash manual            (n, i)
     \hh     Displays help for the builtin       (n, i)
             under the cursor (Bash help).
             The tab expansion is active.
     \hm     displays the manual for the         (n, i)
             Bash command under the cursor
             The tab expansion is active.
     \hbs    Displays the Vim help page for      (n, i)
             this plug-in.

(*) Linux/UNIX only

File 'bash-hotkeys.pdf' contains a reference card for these key mappings.
Multiline inserts and code snippets will be indented after insertion.

Changing the default map leader '\'
-----------------------------------
The map leader can be changed by the user by setting a global variable in the
file .vimrc 
>
 let g:BASH_MapLeader  = ','
<
The map leader is now a comma. The 'line end comment' command is now defined
as ',cl'. This setting will be used as a so called local leader and influences
only files with filetype 'sh'.

The configured mapleader can also be used in the ftplugin, by calling the
functions *Bash_SetMapLeader()* and *Bash_ResetMapLeader()* . The maps created
between the two calls will use |g:BASH_MapLeader| as the |<LocalLeader>|:
>
  call Bash_SetMapLeader ()

  map  <buffer>  <LocalLeader>eg  :echo "Example Map :)"<CR>

  call Bash_ResetMapLeader ()
<

==============================================================================
3.  HOT KEYS                                             *bashsupport-hotkeys*
==============================================================================

The following hot keys are defined in NORMAL, VISUAL and INSERT MODE:

    Ctrl-F9   run script
     Alt-F9   run syntax check
   Shift-F9   command line arguments (for the current buffer)
         F9   start debugger (bashdb)

See |bashsupport-usage-vim| for more hotkeys.


==============================================================================
4.0  CUSTOMIZATION                                 *bashsupport-customization*
==============================================================================

------------------------------------------------------------------------------
4.1  FILES                                          *bashsupport-custom-files*
------------------------------------------------------------------------------

README.bashsupport                  Release notes, installation description.

plugin/bash-support.vim             The Bash plug-in for Vim/gVim.
bash-support/scripts/wrapper.sh     A wrapper script for the use of an xterm.

doc/bashsupport.txt                 The help file for the local online help.

bash-support/codesnippets/*         Some code snippets as a starting point.

bash-support/templates/*            Bash template files (see |bashsupport-comm-templates|).

bash-support/wordlists/*            Additional word lists (dictionaries).

  -------------------------------------------------------------
  The following files and extensions are for convenience only.
  bash-support.vim will work without them.
  -------------------------------------------------------------

bash-support/rc/costumization.bashrc  Additional settings I use in .bashrc: 
                                      set the prompt P2, P3, P4 (for debugging).

bash-support/rc/costumization.vimrc   Additional settings I use in '.vimrc': incremental
                                      search, tabstop, hot keys, font, use of dictionaries,
                                      ...  The file is commented. Append it to your '.vimrc'
                                      if you like.

bash-support/rc/costumization.gvimrc  Additional settings I use in '.gvimrc': hot keys,
                                      mouse settings, ...  The file is commented.
                                      Append it to your '.gvimrc' if you like.
bash-support/rc/sh.vim                Suggestions for additional maps.

bash-support/doc/*                    Hotkey reference card (PDF), changelog.


------------------------------------------------------------------------------
4.2  GLOBAL VARIABLES                           *bashsupport-custom-variables*
------------------------------------------------------------------------------

Several global variables are checked by the script to customize it:

------------------------------------------------------------------------------
global variable                default value
------------------------------------------------------------------------------
g:BASH_GlobalTemplateFile      root_dir.'bash-support/templates/Templates'
g:BASH_LocalTemplateFile       $HOME.'/.vim/bash-support/templates/Templates'

g:BASH_CodeSnippets            $HOME.'/.vim/bash-support/codesnippets'     (Linux/U**X)
                               $VIM.'\vimfiles\bash-support/codesnippets/' (Windows)
g:BASH_LoadMenus               'yes'
g:BASH_CreateMenusDelayed      'no'
g:BASH_Dictionary_File         $HOME."/.vim/bash-support/wordlists/bash.list"
g:BASH_RootMenu                '&Bash.'
g:BASH_GuiSnippetBrowser       'gui'

g:BASH_OutputGvim              'vim'   (Linux/U**X)
                               'xterm' (Windows)
g:BASH_XtermDefaults           '-fa courier -fs 12 -geometry 80x24'
g:BASH_Debugger                'term'
g:BASH_LineEndCommColDefault   49
g:BASH_SyntaxCheckOptionsGlob  ''
g:BASH_Printheader             '%<%f%h%m%<  %=%{strftime('%x %X')}     Page %N'
g:BASH_InsertFileHeader        'yes'
g:BASH_Executable              $SHELL         (Linux/U**X)
                               'bash.exe'     (Windows)
g:BASH_ManualReader            'man'          (Linux/U**X)
                               'man.exe'      (Windows)
g:BASH_MapLeader               '\'
g:BASH_Errorformat             '%f:\ line\ %l:\ %m'
g:BASH_AlsoBash                ''

------------------------------------------------------------------------------

 1. group: Defines the text which will be inserted for the tags when a
           template is read in (see |bashsupport-templates|).
 
           g:BASH_GlobalTemplateFile     : sets the global template file
                                           (see|bashsupport-templates|)
           g:BASH_LocalTemplateFile      : sets the local template file  
                                           (see|bashsupport-templates|)
 
 2. group: g:BASH_CodeSnippets           : The name of the code snippet directory
                                           (see |bashsupport-snippets|).
           g:BASH_LoadMenus              : Load menus and mappings (yes/no) at start up.
           g:BASH_CreateMenusDelayed     : Load menus only with filetype 'sh'
           g:BASH_Dictionary_File        : Path and file name of the Bash word list used
                                           for dictionary completion
                                           (see |bashsupport-dictionary|).
           g:BASH_RootMenu               : Name of the root menu item of this plug-in
                                           (see |bashsupport-custom-root|).
           g:BASH_GuiSnippetBrowser      : code snippet browser: 'gui', 'commandline'
 
 3. group: g:BASH_OutputGvim             : Target for a script output
                                           (see |bashsupport-output|).
           g:BASH_XtermDefaults          : The xterm defaults (see |bashsupport-xterm|).
           g:BASH_Debugger               : the debugger called by F9 (term, ddd).
           g:BASH_LineEndCommColDefault  : default starting column for line end comments
           g:BASH_SyntaxCheckOptionsGlob : shopt options used with syntax checking
           g:BASH_Printheader            : hardcopy header format
           g:BASH_InsertFileHeader       : suppress file header comment for new files
           g:BASH_Executable             : the shell used
           g:BASH_ManualReader           : the interface to the on-line manuals
           g:BASH_MapLeader              : the map leader for hotkeys 
                                           (see|bashsupport-usage-vim|)
           g:BASH_Errorformat            : errorforamat used to parse runtime errors
           g:BASH_AlsoBash               : filename patterns considered as Bash files
                                           (see |bashsupport-also-bash|)

To override the defaults add appropriate assignments in '.vimrc'.


------------------------------------------------------------------------------
4.3  THE ROOT MENU                                   *bashsupport-custom-root*
------------------------------------------------------------------------------

The variable g:BASH_RootMenu, if set (in '.vimrc' or in '.gvimrc'), gives the
name of the single gVim root menu entry in which the Bash submenus will be
put.  The default is
>
 '&Bash'

If you want to set the plug-in root menu into another menu, e.g. 'Plugin',
this is done by the following line in '.vimrc'
>
  let g:BASH_RootMenu = "&Plugin.&Bash"
<
------------------------------------------------------------------------------
4.4  System-wide installation                        *bashsupport-system-wide*
------------------------------------------------------------------------------

A system-wide installation (one installation for all users) is done as
follows.

As *** SUPERUSER *** :

(1) Find the Vim installation directory.
The Vim ex command ':echo $VIM' gives '/usr/local/share/vim' or something like
that. Beyond this directory you will find the Vim installation,  e.g. in
'/usr/local/share/vim/vim73' if Vim version 7.3 has been installed.

(2) Create a new subdirectory 'vimfiles', e.g. '/usr/local/share/vim/vimfiles'.

(3) Install Bash Support
Copy the archive 'bash-support.zip' to this new directory and unpack it:
>
  unzip bash-support.zip
<
(4) Generate the help tags:
>
  :helptags $VIM/vimfiles/doc
<
SPECIAL CASES. Some Linux distributions use non-standard names for Vim
directories. SUSE has a directory '/usr/share/vim/site' to put plug-ins in.
These directories will not be found automatically.  After installing the
plug-in below '/usr/share/vim/site' the use of the templates will be enabled by
the following line in '~/.vimrc':
>
  let g:BASH_GlobalTemplateFile = '/usr/share/vim/site/bash-support/templates/Templates'
<

As ****** USER ****** :

The plug-in tries to create a minimal template file 'Templates' (and the
necessary directory '$HOME/.vim/bash-support/templates') when the first buffer
with filetype 'vim' will be opened. You should edit this file to personalize
some macros.

Create your private snippet directory:
>
  mkdir --parents  $HOME/.vim/bash-support/codesnippets
<
You may want to copy the snippets coming with this plug-in (in
$VIM/vimfiles/bash-support/codesnippets) into the new directory or to set a
link to the global directory.


==============================================================================
5.  TEMPLATE FILES AND TAGS                            *bashsupport-templates*
==============================================================================

------------------------------------------------------------------------------
5.1  TEMPLATE FILES                              *bashsupport-templates-files*
------------------------------------------------------------------------------

Nearly all menu items insert code snippets or comments. All of these are
contained within template files and can be changed by the user to meet their
requirements. The menu shortcuts (e.g. 'c' for the Comments menu) and the
menu item hotkeys (e.g. '\ct' insert date and time) are also defined in the
templates.
The template engine comes as a separate plug-in contributed by Wolfgang Mehner.
This section is a short introduction to this template system. Please see
|templatesupport.txt| for more information.

The master template file is '$HOME/.vim/bash-support/templates/Templates' for
a user installation and  '$VIM/vimfiles/bash-support/templates/Templates' for
a system-wide installation (see |bashsupport-system-wide|).

The master template file starts with a macro section followed by templates for
single menu items or better by including other template files grouping the
templates according to the menu structure of this plug-in. The master file
usually looks like this (my settings as an example):
>
 § =============================================================
 §  User Macros
 § =============================================================

 SetMacro( 'AUTHOR',      'Dr. Fritz Mehner' )
 SetMacro( 'AUTHORREF',   'fgm' )
 SetMacro( 'COMPANY',     '' )
 SetMacro( 'COPYRIGHT',   'Copyright (c) |YEAR|, |AUTHOR|' )
 SetMacro( 'EMAIL',       'mehner.fritz@fh-swf.de' )
 SetMacro( 'LICENSE',     'GNU General Public License' )
 SetMacro( 'ORGANIZATION','FH Südwestfalen, Iserlohn, Germany' )

 SetFormat( 'DATE', '%x' )
 SetFormat( 'TIME', '%H:%M' )
 SetFormat( 'YEAR', '%Y' )

 SetStyle( 'default' )

 § =============================================================
 §  File Includes and Shortcuts
 § =============================================================

 MenuShortcut( 'Comments',        'c' )
 MenuShortcut( 'Statements',      's' )
 MenuShortcut( 'Tests',           't' )
 MenuShortcut( 'ParamSub',        'p' )
 MenuShortcut( 'PatternMatching', 'p' )
 MenuShortcut( 'IO-Redir',        'i' )

 IncludeFile( 'comments.templates'        )
 IncludeFile( 'statements.templates'      )
 IncludeFile( 'tests.templates'           )
 IncludeFile( 'paramsub.templates'        )
 IncludeFile( 'specialparams.templates'   )
 IncludeFile( 'environment.templates'     )
 IncludeFile( 'builtins.templates'        )
 IncludeFile( 'set.templates'             )
 IncludeFile( 'shelloptions.templates'    )
 IncludeFile( 'io-redirection.templates'  )
 IncludeFile( 'patternmatching.templates' )
<
Lines starting with a paragraph sign are comments. The section starting with
>
  SetMacro( 'AUTHOR',      'Dr. Fritz Mehner' )
<
assigns values to predefined tags (macros).  Arbitrary user-defined macros are
possible. The macro name must follows the rules for a C language identifier:
first character letter  or underscore; case matters; digits are allowed
beginning with the second character.

The statement
>
  IncludeFile( 'comments.templates' )
<
includes the templates from the file 'comments.templates' (in the same
directory). An absolute path would also be possible.  The statement
>
  MenuShortcut( 'Comments',      'c' )
<
sets 'c' as the shortcut for the Comments menu.

------------------------------------------------------------------------------
5.2  Macros                                     *bashsupport-templates-macros*
------------------------------------------------------------------------------

The following macro names are predefined. The first group of macros is used to
personalize templates.

 ----------------------------------------------------------------------------
 PREDEFINED MACROS FOR PERSONALIZATION,  DEFAULT VALUE is ''
 ----------------------------------------------------------------------------
*|AUTHOR|*
*|AUTHORREF|*
*|COMPANY|*
*|COPYRIGHT|*
*|EMAIL|*
*|LICENSE|*
*|ORGANIZATION|*

 ----------------------------------------------------------------------------
 PREDEFINED MACROS  DEFAULT VALUE
 ----------------------------------------------------------------------------
*|BASENAME|*        filename without path and suffix
*|DATE|*            the preferred date representation for the current locale
                    without the time
*|FILENAME|*        filename without path
*|PATH|*            path without filename
*|SUFFIX|*          filename suffix
*|TIME|*            the preferred time representation for the current locale
                    without the date and the time zone or name or abbreviation
*|YEAR|*            the year as a decimal number including the century

 ----------------------------------------------------------------------------
 PREDEFINED TAGS USED IN TEMPLATES
 ----------------------------------------------------------------------------
 <CURSOR>           The cursor position after insertion of a template.
 <+text+>,<-text->  See |bashsupport-templates-jumptags|.
 {+text+},{-text-}

 <SPLIT>            The split point when inserting in visual mode
                    (see|bashsupport-templates|)

A dependent template file can start with its own command section. There is no
need to have all user defined macros in the master file.

------------------------------------------------------------------------------
5.2.1   User defined formats for date and time    *bashsupport-templates-date*
------------------------------------------------------------------------------
The format for *|DATE|* ,*|TIME|* , and*|YEAR|* can be set by the user. The
defaults are
    *|DATE|*        '%x'
    *|TIME|*        '%X'
    *|YEAR|*        '%Y'
See the manual page of the C function strftime() for the format.  The accepted
format depends on your system, thus this is not portable!  The maximum length
of the result is 80 characters.

User defined formats can be set using the following function calls in the
master template file is '$HOME/.vim/bash-support/templates/Templates',  e.g.
>
  SetFormat( 'DATE', '%D'      )
  SetFormat( 'TIME', '%H:%M'   )
  SetFormat( 'YEAR', 'year %Y' )
<
------------------------------------------------------------------------------
5.3  Templates                                   *bashsupport-templates-names*
------------------------------------------------------------------------------

5.3.1 Template Definition                   *bashsupport-templates-definition*
The template behind a menu item is identified its name. The first part
of the name identifies the menu name, the second part identifies the item.
A template definition starts with a template header with the following syntax:

  == menu_name.template_name == options ==

The options are described here: |template-support-options|.

5.3.2  The jump tags <+text+> etc.            *bashsupport-templates-jumptags*

There are four jump tag types which can be used as jump targets in templates:

 <+text+>   Can be jumped to by hitting Ctrl-j.
 {+text+}   Same as <+text+>. Used in cases where indentation gives unwanted
            results with the first one.

 <-text->   Same as the two above. Will be removed if the template is used
 {-text-}   in visual mode.

The text inside the brackets is userdefined and can be empty. The text can be
composed from letters (uppercase and lowercase), digits, and underscores.
After the insertion of an template these jump targets will be highlighted.

5.3.3  Command Ctrl-j                                     *bashsupport-Ctrl-j*

Use the command Ctrl-j to jump to the next target. The target will be removed
and the mode will switched to insertion. Ctrl-j works in normal and in insert
mode.  The template for an if-else-statement can be written as follows:
>
 == Statements.if-else == map:sie, shortcut:i  ==
 if <CURSOR> ; then
 <SPLIT><-IF_PART->
 else
  <-ELSE_PART->
 fi
<
The cursor will be set as shown. When the condition is specified a Ctrl-j let
you jump to the target <-IF_PART-> and deletes it.  When the block is written
a Ctrl-j leads you to the else-part.  The target <-ELSE_PART-> disappears and
you can type on.


==============================================================================
5.4  ADDITIONAL FILENAMES WITH FILETYPE 'sh'           *bashsupport-also-bash*
==============================================================================

The standard extension for shell script files used by this plug-in is ".sh".
If you want to have other filenames recognized and treated as shell files
set the global variable  g:BASH_AlsoBash in your '.vimrc' :
 >
 let g:BASH_AlsoBash = [ '*.SlackBuild' , 'rc.*' ]
<
This is a Vim List. Please quote the entries and separate them with commas.
Do not include  the default extension '*.sh'.


==============================================================================
6.  BASH DICTIONARY                                   *bashsupport-dictionary*
==============================================================================

The file 'bash.list' contains words used as dictionary for automatic word
completion.  This feature is enabled by default. The default word list is
>
  $HOME/.vim/bash-support/wordlists/bash.list
<
If you want to use an additional list 'MyBash.List' put the following line
into $HOME/.vimrc :
>
  let g:BASH_Dictionary_File   =  "$HOME/.vim/bash-support/wordlists/bash.list,".
                              \   "$HOME/.vim/bash-support/wordlists/MyBash.List"
<
The right side is a comma separated list of files. Note the point at the end
of the first line (string concatenation) and the backslash in front of the
second line (continuation line).
You can use Vim's dictionary feature CTRL-X, CTRL-K (and CTRL-P, CTRL-N).

==============================================================================
7.  ADDITIONAL MAPPINGS                              *bashsupport-ad-mappings*
==============================================================================

Some suggestions are in 'bash-support/rc/sh.vim'. This is a filetype plug-in
and would go to '$HOME/.vim/ftplugin/'.

==============================================================================
8.  WINDOWS PARTICULARITIES                              *bashsupport-windows*
==============================================================================

For a user installation the plug-in should go into the directory structure
below 
>
  $HOME/vimfiles/
<
for a system installation below
>
 $VIM/vimfiles/
<
The values of the two variables can be found from inside Vim:
>
   :echo $VIM
<
or
>
   :echo $HOME
<
The configuration files for a user are
>
  $HOME/_vimrc   and  $HOME/_gvimrc
<
for the system
>
  $VIM/_vimrc   and  $VIM/_gvimrc
<
A Bash shell is not a part of a Windows system and has to be installed in
addition. This plug-in assumes that the shell port bash.exe
(http://www.cygwin.com) is present and the that command line utilities you
want to use can be reached via your path variable.  This shell can be changed
to xyz-shell.exe by setting the following line into the file _vimrc:
>
  let g:BASH_Executable = 'xyz-shell.exe'
<
The run-menu and the corresponding hotkeys are restricted. Please see 
the document 'bash-hotkeys.pdf' for this restrictions.

The file format is switches to 'unix' on entering a buffer of type 'sh'.
The filetype can be changed by setting a global variable in file _vimrc:
>
  let g:BASH_FileFormat = 'something_else'
<
CYGWIN
------
Executing scripts with DOS style pathnames causes the error "MS-DOS style path
detected". To turn these messages off add the CYGWIN environment variable
CYGWIN with the value "nodosfilewarning".

==============================================================================
9.  TROUBLESHOOTING                             *bashsupport-troubleshooting*
==============================================================================

* I do not see any new main menu item.
  - Was the archive extracted into the right directory?

* How can I see what was loaded?
  - Use ':scriptnames' from the Vim command line.

* No main menu item.
  - Loading of plug-in files must be enabled. If not use
>
     :filetype plugin on
<
    This is the minimal content of the file '$HOME/.vimrc'. Create one if
    there is none, or better use customization.vimrc.

* Most key mappings do not work.
  - They are defined in a filetype plugin in '$HOME/.vim/ftplugin/'. Use
    ':filetype' to check if filetype plug-ins are enabled. If not, add the line
>
      filetype plugin on
<
    to the file '~/.vimrc'.

* Some hotkeys do not work.
  - The hotkeys might be in use by your graphical desktop environment.  Under
    KDE Ctrl-F9 is the hotkey which let you switch to the 9. desktop.  The key
    settings can usually be redefined.

==============================================================================
10.  Release Notes                                  *bashsupport-release-notes*
==============================================================================

See file 'README.bashsupport'.

==============================================================================
vim:tw=78:noet:ts=2:ft=help:norl:
