<sect1 id="setup-env"><title>Environment Variables</title>

<para>
Before starting bash, you may set some environment variables.  A .bat
file is provided where the most important ones are set before bash in
launched.  This is the safest way to launch bash initially.  The .bat
file is installed in the root directory that you specified during setup
and pointed to in the Start Menu under the "Cygwin" option.  You can
edit it this file your liking.</para>

<para>
The <envar>CYGWIN</envar> variable is used to configure many global
settings for the Cygwin runtime system.  Initially you can leave
<envar>CYGWIN</envar> unset or set it to <literal>tty</literal> (e.g.
to support job control with ^Z etc...) using a syntax like this in the
DOS shell, before launching bash.  </para>

<screen>
<prompt>C:\&gt;</prompt> <userinput>set CYGWIN=tty notitle glob</userinput>
</screen>

<para>
The <envar>PATH</envar> environment variable is used by Cygwin
applications as a list of directories to search for executable files
to run.  This environment variable is converted from Windows format
(e.g. <filename>C:\WinNT\system32;C:\WinNT</filename>) to UNIX format
(e.g., <filename>/WinNT/system32:/WinNT</filename>) when a Cygwin
process first starts.
Set it so that it contains at least the <filename>x:\cygwin\bin</filename>
directory where "<filename>x:\cygwin</filename> is the "root" of your
cygwin installation if you wish to use cygwin tools outside of bash.
</para>

<para> 
The <envar>HOME</envar> environment variable is used by many programs to
determine the location of your home directory and we recommend that it be
defined.  This environment variable is also converted from Windows format
when a Cygwin process first starts.  Set it to point to your home directory
before launching bash. 
</para>

<para>
The <envar>TERM</envar> environment variable specifies your terminal
type.  It is automatically set to <literal>cygwin</literal> if you have
not set it to something else.
</para>

<para>The <envar>LD_LIBRARY_PATH</envar> environment variable is used by
the Cygwin function <function>dlopen ()</function> as a list of
directories to search for .dll files to load.  This environment variable
is converted from Windows format to UNIX format when a Cygwin process
first starts.  Most Cygwin applications do not make use of the
<function>dlopen ()</function> call and do not need this variable.
</para>

</sect1>

<sect1 id="setup-maxmem"><title>Changing Cygwin's Maximum Memory</title>

<para>
By default no Cygwin program can allocate more than 384 MB of memory 
(program+data).  You should not need to change this default in most 
circumstances.  However, if you need to use more real or virtual memory in 
your machine you may add an entry in the either the 
<literal>HKEY_LOCAL_MACHINE</literal> (to change the limit for all users) or 
<literal>HKEY_CURRENT_USER</literal> (for just the current user) section of 
the registry. 
</para>

<para>
Add the <literal>DWORD</literal> value <literal>heap_chunk_in_mb</literal> 
and set it to the desired memory limit in decimal MB. It is preferred to do 
this in Cygwin using the <command>regtool</command> program included in the 
Cygwin package.
(For more information about <command>regtool</command> or the other Cygwin 
utilities, see <Xref Linkend="using-utils"> or use each the
<literal>--help</literal> option of each util.)  You should always be careful 
when using <command>regtool</command> since damaging your system registry can 
result in an unusable system.  This example sets memory limit to 1024 MB:

<screen>
regtool -i set /HKLM/Software/Cygnus\ Solutions/Cygwin/heap_chunk_in_mb 1024
regtool -v list /HKLM/Software/Cygnus\ Solutions/Cygwin
</screen>
</para>

<para>
Exit all running Cygwin processes and restart them. Memory can be allocated up 
to the size of the system swap space minus any the size of any running 
processes. The system swap should be at least as large as the physically 
installed RAM and can be modified under the System category of the 
Control Panel.  
</para>

<para>
Here is a small program written by DJ Delorie that tests the 
memory allocation limit on your system:

<screen>
main()
{
  unsigned int bit=0x40000000, sum=0;
  char *x;
  
  while (bit > 4096) 
  {
    x = malloc(bit);
    if (x)
    sum += bit;
    bit >>= 1;
  }
  printf("%08x bytes (%.1fMb)\n", sum, sum/1024.0/1024.0);
  return 0;
}
</screen>

You can compile this program using:
<screen>
gcc max_memory.c -o max_memory.exe
</screen>

Run the program and it will output the maximum amount of allocatable memory.
</para>
</sect1>

<sect1 id="setup-files"><title>Customizing bash</title>

<para>
To set bash up so that cut and paste work properly, click on the
"Properties" button of the window, then on the "Misc" tab.  Make sure
that "Quick Edit" is checked and "Fast Pasting" isn't.  These settings
will be remembered next time you run bash from that
shortcut. Similarly you can set the working directory inside the
"Program" tab. The entry "%HOME%" is valid.
</para>

<para>
Your home directory should contain three initialization files
that control the behavior of bash.  They are
<filename>.profile</filename>, <filename>.bashrc</filename> and
<filename>.inputrc</filename>.  These initialization files will only
be read if <envar>HOME</envar> is defined before starting bash.
</para>

<para>
<filename>.profile</filename> (other names are also valid, see the bash man
page) contains bash commands.  It is executed when bash is started as login
shell, e.g. from the command <command>bash --login</command>.
This is a useful place to define and
export environment variables and bash functions that will be used by bash
and the programs invoked by bash.  It is a good place to redefine
<envar>PATH</envar> if needed.  We recommend adding a ":." to the end of
<envar>PATH</envar> to also search the current working directory (contrary
to DOS, the local directory is not searched by default).  Also to avoid
delays you should either <command>unset</command> <envar>MAILCHECK</envar> 
or define <envar>MAILPATH</envar> to point to your existing mail inbox.
</para>

<para>
<filename>.bashrc</filename> is similar to
<filename>.profile</filename> but is executed each time an interactive
bash shell is launched.  It serves to define elements that are not
inherited through the environment, such as aliases. If you do not use
login shells, you may want to put the contents of
<filename>.profile</filename> as discussed above in this file
instead.
</para>

<para>
<screen>
shopt -s nocaseglob
</screen>
will allow bash to glob filenames in a case-insensitive manner.
Note that <filename>.bashrc</filename> is not called automatically for login 
shells. You can source it from <filename>.profile</filename>.
</para>

<para>
<filename>.inputrc</filename> controls how programs using the readline
library (including <command>bash</command>) behave.  It is loaded
automatically.  For full details see the <literal>Function and Variable
Index</literal> section of the GNU <systemitem>readline</systemitem> manual.
Consider the following settings:
<screen>
# Ignore case while completing
set completion-ignore-case on
# Make Bash 8bit clean
set meta-flag on
set convert-meta off
set output-meta on
</screen>
The first command makes filename completion case insensitive, which can
be convenient in a Windows environment.  The next three commands allow
<command>bash</command> to display 8-bit characters, useful for
languages with accented characters.  Note that tools that do not use
<systemitem>readline</systemitem> for display, such as
<command>less</command> and <command>ls</command>, require additional
settings, which could be put in your <filename>.bashrc</filename>:
<screen>
alias less='/bin/less -r'
alias ls='/bin/ls -F --color=tty --show-control-chars'
</screen>
</para>

</sect1>

