<?xml version="1.0" ?>
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
  <!ENTITY kdevelop "<application>KDevelop</application>">
  <!ENTITY kdevrelease "3.0.91">
  <!ENTITY apache "<application>Apache</application>">
  <!ENTITY appwizard "Application Wizard">
  <!ENTITY autoconf "<command>autoconf</command>">
  <!ENTITY automake "<command>automake</command>">
  <!ENTITY automanag "Automake Manager">
  <!ENTITY ctags "<command>ctags</command>">
  <!ENTITY CVS "<application>CVS</application>">
  <!ENTITY cvs "CVS">
  <!ENTITY doxygen "<application>Doxygen</application>">
  <!ENTITY doxywizard "<application>doxywizard</application>">
  <!ENTITY egrep "<command>egrep</command>">
  <!ENTITY grep "<command>grep</command>">
  <!ENTITY libtool "<command>libtool</command>">
  <!ENTITY python "<application>Python</application>">
  <!ENTITY perl "<application>Perl</application>">
  <!ENTITY php "<application>PHP</application>">
  <!ENTITY promanag "Project Manager">
  <!ENTITY qte "<application>Qt/embedded</application>">
  <!ENTITY ssh "<application>ssh</application>">
  <!-- chapters in separate docbook files -->
  <!ENTITY unixdev SYSTEM "unixdev.docbook">
  <!ENTITY kdevelop-survey SYSTEM "kdevelop-survey.docbook">
  <!ENTITY kdevelop-install SYSTEM "kdevelop-install.docbook">
  <!ENTITY setup SYSTEM "setup.docbook">
  <!ENTITY applicationwizard SYSTEM "applicationwizard.docbook">
  <!ENTITY project-advanced SYSTEM "project-advanced.docbook">
  <!ENTITY project-management SYSTEM "project-management.docbook">
  <!-- book related entities -->
  <!ENTITY kappname "&kdevelop;">
  <!ENTITY % addindex "INCLUDE">
  <!ENTITY % English "INCLUDE" > <!-- change language only here -->
]>

<!--
NOTE:
Entries which require special treatment are marked with comments starting with '###'. They should be visited on a regular basis.
-->

<book lang="&language;">

<bookinfo>
  <title>&kdevelop; User Manual</title>

  <date>2004-07-14</date>
  <releaseinfo>&kdevrelease;</releaseinfo>

  <authorgroup>
    <author>
      <firstname>Bernd</firstname>
      <surname>Gehrmann</surname>
      <affiliation>
        <address><email>bernd@kdevelop.org</email></address>
      </affiliation>
    </author>

    <author>
      <firstname>Caleb</firstname>
      <surname>Tennis</surname>
      <affiliation>
        <address><email>caleb@aei-tech.com</email></address>
      </affiliation>
    </author>

    <author>
      <firstname>Bernd</firstname>
      <surname>Pol</surname>
      <affiliation>
        <address><email>bernd.pol@online.de</email></address>
      </affiliation>
    </author>
  </authorgroup>

  <copyright>
    <year>2002</year>
    <holder>Bernd Gehrmann</holder>
  </copyright>
  <copyright>
    <year>2002</year>
    <holder>Caleb Tennis</holder>
  </copyright>
  <copyright>
    <year>2004</year>
    <holder>Bernd Pol</holder>
  </copyright>

  <!--ROLES_OF_TRANSLATORS-->

  <legalnotice>&FDLNotice;</legalnotice>

  <abstract>
    <para>&kdevelop; is an Integrated Development Environment to be used for a wide variety of programming tasks.</para>
  </abstract>

  <keywordset>
    <keyword>KDE</keyword>
    <keyword>KDevelop</keyword>
    <keyword>IDE</keyword>
    <keyword>development</keyword>
    <keyword>programming</keyword>
  </keywordset>

</bookinfo>

<!-- ====================================================================== -->

<chapter id="survey-manual">
<title>About this Manual</title>

<para>
This user manual is intended to describe the contents and use of the &kdevelop; &kdevrelease; Integrated Development Environment (IDE) from a user's point of view. It is not a programming manual, nor does it describe the development process in detail. Its only aim is to guide you in the handling of the IDE.
</para>
<para>
Here you will find information on the following topics:
</para>
<itemizedlist>
  <listitem><para>
  <link linkend="nutshell">In a Nutshell &mdash; Tips and Tricks</link> &mdash; a quick reference to commonly used commands and actions. And a short guide to solve common problems when working with &kdevelop;.
  </para></listitem>

  <listitem><para>
  <link linkend="unixdev">Development on &UNIX;</link> &mdash; a historical overview of &UNIX; program development, the main tools necessary and why you need an IDE.
  </para></listitem>

  <listitem><para>
  <link linkend="kdevelop-install">Installing &kdevelop;</link> &mdash; tells you where to obtain &kdevelop; and how to get it up and running.
  </para></listitem>

  <listitem><para>
  <link linkend="kdevelop-survey">Overview of the Features of &kdevelop;</link> &mdash; is a kind of a warm-up, giving a short overall view of what is built-in within &kdevelop; and gets you acquainted with the look and feel of this IDE.
  </para></listitem>

  <listitem><para>
  <link linkend="app-menus">Menus and Toolbars Overview</link> &mdash; (in the appendix) provides you with a short overall view of the menu and toolbar selections available.
  </para></listitem>

  <listitem><para>
  <link linkend="app-shortcuts">Shortcut Keys</link> &mdash; (in the appendix) lists the key sequences you may use to quickly access specific &kdevelop; operations.
  </para></listitem>

  <listitem><para>
  <link linkend="setup">Configuring &kdevelop;</link> &mdash; shows how you can tailor the IDE to suit your needs.
  </para></listitem>

  <listitem><para>
  <link linkend="applicationwizard">Getting started: the &appwizard;</link> &mdash; describes the basics of how to set up a new project in &kdevelop; using the built-in &appwizard;.
  </para></listitem>

  <listitem><para>
  <link linkend="projects-advanced">Advanced Project Management</link> &mdash; shows how to load existing projects, convert projects from older &kdevelop; versions, and import other existing projects. Furthermore the configuration of a project's options to suit your needs is covered.
  </para></listitem>

  <listitem><para>
  <link linkend="editing">Editing tools</link> &mdash; all you need to write your source files: using the editor, searching for text both locally and project-wide, up to integrating new files and classes into the project.
  </para></listitem>

  <listitem><para>
  <link linkend="file-browsers">The File Browsers</link> &mdash; demonstrates various tools to look at the structure of your project and how to access the files you want to work with.
  </para></listitem>

  <listitem><para>
  <link linkend="class-browsers">The Class Browsers</link> &mdash; describes one of the most powerful tools of &kdevelop; which lets you navigate through class dependencies and allows you to easily create and access the classes and methods you need.
  </para></listitem>

  <listitem><para>
  <link linkend="documentation">Documentation</link> &mdash; shows how to access the rich built-in documentation &kdevelop; provides and tells you how to create documentation of your project, concise and powerful API documentation providing you an overall view of all your project sources as well as docbook-based user documentation.
  </para></listitem>
  <listitem><para>
  <link linkend="project-management">Building and Project Management</link> &mdash; deals with the creation and management of your project; describing the basics of autoconf and automake as well as how to set up custom make files and how to use compiler or make options to tailor your application to suit your needs.
  </para></listitem>

  <listitem><para>
  <link linkend="adv-build-management">Advanced Build Management</link> &mdash; looks at ways to keep multiple build configurations, to cross-compile for diverse platforms, or to make an embedded system using the <application>Qt/embedded</application> library.
  </para></listitem>

  <listitem><para>
  <link linkend="debugger">The Debugger Interface</link> &mdash; describes how to use the integrated <application>gdb</application> debugger interface so you can hunt down bugs without leaving &kdevelop;.
  </para></listitem>

<!-- ### Currently disabled. Probably too specialized programming stuff. Check later again.
  <listitem><para>
  <link linkend="python">Python</link> &mdash; an overview of how to create Python-based applications in &kdevelop;.
  </para></listitem>
  <listitem><para>
  <link linkend="php">PHP</link> &mdash;  an overview of how to create PHP-based HTML applications in &kdevelop;.
  </para></listitem>//-->

  <listitem><para>
  <link linkend="cvs">Using CVS</link> &mdash; tells you how you can maintain your project using the CVS versioning system; a must, especially if many developers work on the same project.
  </para></listitem>

  <listitem><para>
  <link linkend="external-progs">Leveraging External Programs</link> &mdash; shows how to access external programs and tools from within &kdevelop; thus greatly extending its capabilities.
  </para></listitem>

  <listitem><para>
  <link linkend="plugin-tools">Plugin tools</link> &mdash; provides you with an overview of the parts which make up &kdevelop; and how you can tailor it to suit your needs by only loading the parts that are necessary, both IDE and project-wide.
  </para></listitem>
</itemizedlist>
</chapter>

<!-- ====================================================================== -->

<chapter id="nutshell">
<title>In a Nutshell &mdash; Tips and Tricks</title>

<!-- Traditionally, most of this stuff will have been put into a FAQ section. It is more useful, however, to put it at the very start of a manual, as this is the place the (inexperienced) user first looks for.
This chapter is meant to provide short hints and tips together with (mandatory) navigation links.
There should be an additional FAQ section near the end nevertheless which contains more general stuff not directly related to navigating the manual. -->

<para>
The information in this chapter is meant as a quick reference for a head start or if you (momentarily) forgot about some basic concept. There are also short hints on how to solve some common problems when working with &kdevelop;.
</para>
<para>
If you want more information on a topic, just follow the link in the title starting that advice.
</para>
<para>
Information on these topics is availabe:
</para>
<simplelist>
  <member><link linkend="nutshellitem-look-and-feel">Look and Feel</link></member>
  <member><link linkend="nutshellitem-projects">Projects</link></member>
  <member><link linkend="nutshellitem-compilation">Compilation</link></member>
  <member><link linkend="nutshellitem-automake">&automanag;</link></member>
  <member><link linkend="nutshellitem-compilemake">Compile/Make Problems</link></member>
</simplelist>

<itemizedlist id="nutshellitem-look-and-feel">
  <title>Look and Feel</title>

  <listitem>
    <formalpara id="nutshell-IDEAl-tabs">
    <title><link linkend="setup-ui-toolview">Force Smaller Tool View Tabs in IDEAl Mode</link></title>
    <para>
      By default &kdevelop; starts with large text-based tool tip tabs around the work area. You may change this look to &eg; save space in the &kdevelop; configuration dialog (<menuchoice><guimenu>Settings</guimenu> <guimenuitem>Configure KDevelop...</guimenuitem> <guimenuitem>User Interface</guimenuitem></menuchoice>).
    </para>
    </formalpara>
    <para>
      If you use an older &kdevelop; 3 version, this configuration dialog may not be available. To change the toolview tabs display manually, place a <computeroutput>MDIStyle</computeroutput> entry under the <computeroutput>[UI]</computeroutput> tag in your <filename>$KDEHOME/share/config/kdeveloprc</filename> configuration file as follows:
    </para>
    <simplelist>
      <member><computeroutput>MDIStyle=0</computeroutput>: icons only</member>
      <member><computeroutput>MDIStyle=1</computeroutput>: text only (default)</member>
      <member><computeroutput>MDIStyle=2</computeroutput>: icons only on smaller tabs (not very useful)</member>
      <member><computeroutput>MDIStyle=3</computeroutput>: icons and text</member>
    </simplelist>
  </listitem>

  <!-- ### remove this entry when the bug is repaired -->
  <listitem>
    <formalpara id="nutshell-weird-style">
    <title>Weird Colored Characters and/or Display Style</title>
    <para>
    If you notice random colored letters everywhere (&ie; on tabs, on tool bars, etc.) and the &kdevelop; window seemingly uses a wrong display style, this may help:
    </para>
    </formalpara>
    <itemizedlist>
      <listitem><para>
      In your  <filename>$KDEHOME/share/config/kdeveloprc</filename> configuration file find the line containing <quote><computeroutput>Style=Checked</computeroutput></quote> and remove it. Then restart &kdevelop;.
      </para></listitem>
    </itemizedlist>
    <para>
    (This behaviour does sometimes occur after you left clicked a .ui file in one of the file navigators and &kdevelop; did load <application>KUIViewer</application> to show the &GUI; which was produced from this file.)
    </para>
  </listitem>

  <listitem>
    <formalpara id="nutshell-full-screen">
    <title><link linkend="maximize-workspace">Full Screen Mode</link></title>
    <para>
      Select <menuchoice> <guimenu>View</guimenu> <guimenuitem>Full-Screen Mode</guimenuitem> </menuchoice> from the menus or press <keycombo> <keycap>Ctrl</keycap> <keycap>Shift</keycap> <keycap>F</keycap> </keycombo>.
    </para>
    </formalpara>
  </listitem>

  <listitem>
    <formalpara id="nutshell-hide-menu">
    <title><link linkend="maximize-workspace">Hide/Unhide the Menubar</link></title>
    <para>
      To hide the menubar select <menuchoice> <guimenu>Settings</guimenu> <guimenuitem>Show Menubar</guimenuitem> </menuchoice> from the menus or press <keycombo> <keycap>Ctrl</keycap> <keycap>M</keycap> </keycombo>. To redisplay the menubar only <keycombo> <keycap>Ctrl</keycap> <keycap>M</keycap> </keycombo> is available.
    </para>
    </formalpara>
  </listitem>

</itemizedlist>

<itemizedlist id="nutshellitem-projects">
<title>Projects</title>

  <listitem>
    <formalpara id="nutshell-new-project">
    <title><link linkend="new-projects">Create New Project</link></title>
    <para>
    <menuchoice><guimenu>Project</guimenu> <guimenuitem>New Project...</guimenuitem></menuchoice> will start the <link linkend="applicationwizard">&appwizard;</link>.
    </para>
    </formalpara>
  </listitem>

  <listitem>
    <formalpara id="nutshell-new-custom-project">
      <title>Create a Custom Project</title>
      <para>
      There is no direct way to create a custom project (&ie; a project which does use its own makefiles). Use <menuchoice><guimenu>Project</guimenu> <guimenuitem>Import Existing Project</guimenuitem></menuchoice> instead. Remember to set the appropriate <guilabel>Project Type</guilabel>, labeled by an additional <quote>(Custom Makefiles)</quote>, in the dialog.
      </para>
    </formalpara>
  </listitem>

  <listitem>
    <formalpara id="nutshell-project-options">
    <title><link linkend="project-options">Use Project Options Early</link></title>
    <para>
    Whenever you start a new project do not forget to set the <menuchoice><guimenu>Project</guimenu> <guimenuitem>Project Options...</guimenuitem></menuchoice> to your needs.
    </para>
    </formalpara>
  </listitem>
</itemizedlist>

<itemizedlist id="nutshellitem-compilation">
<title>Compilation</title>
  <listitem>
    <formalpara id="nutshell-compilemsg-detail">
    <title><link linkend="setup-main-compile">Missing detail in compilation messages</link></title>
    <para>
    If during compilations you notice some valuable information is missing in the <guilabel>Messages Output View</guilabel> window, it may be that the level of message detail is set too low. Right-click in the window and select another detail level from the context menu.<!-- they are programmers, so they should know what a context menu is -->
    </para>
    </formalpara>
  </listitem>
</itemizedlist>

<itemizedlist id="nutshellitem-automake">
<title><link linkend="automake-manager">&automanag;</link></title>

    <listitem>
      <formalpara id="nutshell-new-project-file">
      <title>Create New Files in a Project</title>
      <para>
      Select the sub-project in the upper half of the &automanag;, then right-click in the lower half on the groups title you want to have the files added and select <guimenuitem>Create New File...</guimenuitem>.
      </para>
      </formalpara>
    </listitem>

    <listitem>
      <formalpara id="nutshell-add-project-file">
      <title>Add Existing Files to a Project</title>

      <para>
      Select the sub-project in the upper half of the &automanag;, then right click in the lower half on the groups title you want to have the files added and select <guimenuitem>Add Existing Files...</guimenuitem>.
      </para>
      </formalpara>
    </listitem>

    <listitem>
      <formalpara id="nutshell-del-project-file">
      <title>Remove a File from a Project</title>

      <para>
      Select the sub-project in the upper half of the &automanag;, then in the lower half open the groups list you want to have the file removed from, right click on the file in this list and select <guimenuitem>Remove</guimenuitem>.
      </para>
      </formalpara>
    </listitem>
  </itemizedlist>

<itemizedlist id="nutshellitem-compilemake">
  <title>Compile/Make Problems</title>

  <listitem>
    <formalpara id="nutshell-builddirproblems">
    <!-- ### Change the following link once a more comprehensive sourcedir != builddir description is available. -->
    <title><link linkend="defaultbuild-warning">Project does not build again after switching to/from default target</link></title>
    <para>
    There is a problem with the &automake;/&autoconf; machinery. If <menuchoice> <guimenu>Project</guimenu> <guimenuitem>Build Configuration</guimenuitem></menuchoice> provides to select from three build directories: <guimenuitem>default</guimenuitem>, <guimenuitem>optimized</guimenuitem>, and <guimenuitem>debug</guimenuitem>, by all means stick to <emphasis>either</emphasis> the default <emphasis>or</emphasis> the debug/optimized targets.
    </para>
    </formalpara>
    <itemizedlist>
      <listitem><para>
      Once you configured your project with default it will no longer build with debug or optimzed.
      </para></listitem>
      <listitem><para>Once you configured your project with debug or optimzed it will no longer build with default.</para></listitem>
     </itemizedlist>
  </listitem>

  <listitem>
    <formalpara id="nutshell-autoconf-problem">
    <title><quote>Wrong <command>autoconf</command> version</quote> &etc; Error</title>

    <para>
    There are several error messages concerning too old versions of <application>autoconf</application> &etc; prohibiting <command>configure</command> to work properly. Run <command>autoreconf</command> in the directory tree where the <filename>configure.in</filename> files in question are. This command will try to update the information in the &GNU; Build System files. See <command>man autoreconf</command> for more information.
    </para>
    </formalpara>
  </listitem>
</itemizedlist>

</chapter> <!-- nutshell -->

<!-- ====================================================================== -->

&unixdev;            <!-- "Development on &UNIX;"                           -->
&kdevelop-survey;    <!-- "Overview of &kdevelop; Features"                 -->
&kdevelop-install;   <!-- "Installing &kdevelop";                           -->
&setup;              <!-- "Configuring &kdevelop;"                          -->
&applicationwizard;  <!-- "Getting Started &mdash; the &appwizard;"         -->
&project-advanced;   <!-- "Advanced Project Management"                     -->

<!-- ====================================================================== -->

<chapter id="editing">
<title>Editing Tools</title>

<sect1 id="editing-snippets">
<title>Code Snippets</title>

<itemizedlist>
  <title>Features (preliminary overview)</title>
  <listitem><para>
  SnippetPart adds a tool-view which by default docks to the right
  </para></listitem>
  <listitem><para>
  Adding, editing and removing of snippets is available via a popup-menu
  </para></listitem>
  <listitem><para>
  Double-clicking a snippet form the list inserts it into to the active view at the current cursor position
  </para></listitem>
  <listitem><para>
  Tool tips show the content of a snippet
  </para></listitem>
  <listitem><para>
  Snippets are stored in the users home-directory, so every user can have his own snippets
  </para></listitem>
  <listitem><para>
  Snippets can contain variables in the style of $VARNAME$. On using the snippet the user is prompted to enter replacement value for the variables
  </para></listitem>
</itemizedlist>
</sect1> <!-- editing-snippets -->

<sect1 id="keyboardmapping">
<title>Keyboard Mapping</title>
<indexterm zone="keyboardmapping"><primary>keybindings</primary></indexterm>

<para>
In the following, we will list the default keybindings of the
default editor. You can configure them as you like (how?)
</para>

<informaltable>
<tgroup cols="2">
<tbody>

<row><entry><para><keycap>
  Left
</keycap></para></entry>
<entry><para>
  Moves one character left
</para></entry></row>

<row><entry><para><keycap>
  Right
</keycap></para></entry>
<entry><para>
  Moves one character right
</para></entry></row>

<row><entry><para><keycombo><keycap>
  Ctrl
</keycap><keycap>
  Left
</keycap></keycombo></para></entry>
<entry><para>
  Moves one word left
</para></entry></row>

<row><entry><para><keycombo><keycap>
  Ctrl
</keycap><keycap>
  Right
</keycap></keycombo></para></entry>
<entry><para>
  Moves one word right
</para></entry></row>

<row><entry><para><keycap>
  Up
</keycap></para></entry>
<entry><para>
  Moves up one line
</para></entry></row>

<row><entry><para><keycap>
  Down
</keycap></para></entry>
<entry><para>
  Moves down one line
</para></entry></row>

<row><entry><para><keycap>
  PgUp
</keycap></para></entry>
<entry><para>
  Moves up one page
</para></entry></row>

<row><entry><para><keycap>
    PgDn
</keycap></para></entry>
<entry><para>
  Moves down one page
</para></entry></row>

<row><entry><para><keycombo><keycap>
  Ctrl
</keycap><keycap>
  PgUp
</keycap></keycombo></para></entry>
<entry><para>
  Moves to the beginning of the file
</para></entry></row>

<row><entry><para><keycombo><keycap>
  Ctrl
</keycap><keycap>
  PgDn
</keycap></keycombo></para></entry>
<entry><para>
  Moves to the end of the file
</para></entry></row>

<row><entry><para><keycap>
    Home
</keycap></para></entry>
<entry><para>
  Moves to the beginning of the line
</para></entry></row>

<row><entry><para><keycap>
    End
</keycap></para></entry>
<entry><para>
  Moves to the end of the line
</para></entry></row>

</tbody>
</tgroup>
</informaltable>

<para>
For all the keys above, the Shift can be pressed additionally,
to mark from the current cursor position to the one afterwards.
</para>

<informaltable>
<tgroup cols="2">
<tbody>

<row><entry><para><keycap>
  Backspace
</keycap></para></entry>
<entry><para>
  Deletes one character left
</para></entry></row>

<row><entry><para><keycap>
  Delete
</keycap></para></entry>
<entry><para>
  Deletes the character under the cursor
</para></entry></row>

<row><entry><para><keycombo><keycap>
  Ctrl
</keycap><keycap>
  C
</keycap></keycombo></para></entry>
<entry><para>
  Copies the selected text to the clipboard
</para></entry></row>

<row><entry><para><keycombo><keycap>
  Ctrl
</keycap><keycap>
  V
</keycap></keycombo></para></entry>
<entry><para>
  Pastes the selected text from the clipboard
</para></entry></row>

<row><entry><para><keycombo><keycap>
  Ctrl
</keycap><keycap>
  X
</keycap></keycombo></para></entry>
<entry><para>
  Deletes the selected text and puts it into the clipboard
</para></entry></row>

<row><entry><para><keycombo><keycap>
  Ctrl
</keycap><keycap>
  Z
</keycap></keycombo></para></entry>
<entry><para>
  Undo
</para></entry></row>

<row><entry><para><keycombo><keycap>
  Shift
</keycap><keycap>
  Ctrl
</keycap><keycap>
  Z
</keycap></keycombo></para></entry>
<entry><para>
Redo
</para></entry></row>

</tbody>
</tgroup>
</informaltable>

</sect1> <!-- keyboardmapping -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="editing-reporter">
<title>The Problem Reporter</title>

<para>
(... to be written ...)
</para>
</sect1> <!-- editing-reporter -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="searchinggrepping">
<title>Searching and Grepping</title>
<indexterm zone="searchinggrepping"><primary>searching</primary></indexterm>
<indexterm zone="searchinggrepping"><primary>finding</primary></indexterm>

<sect2 id="searching">
<title>Searching for Text</title>

<para>
<keycombo><keycap>Ctrl</keycap><keycap>F</keycap></keycombo>- Find
<keycombo><keycap>Ctrl</keycap><keycap>R</keycap></keycombo>- Replace
</para>

</sect2> <!-- searching -->


<sect2 id="isearch">
<title>ISearch</title>
<indexterm zone="isearch"><primary>isearch</primary></indexterm>
<indexterm zone="isearch"><primary>incremental search</primary></indexterm>
<indexterm zone="isearch"><primary>search</primary><secondary>incremental</secondary></indexterm>

<para>
The conventional search with <menuchoice><guimenu>Edit</guimenu>
<guimenuitem>Find</guimenuitem></menuchoice> requires you to specify the full
search term before starting. Most of the time, it is much faster to search
incrementally. If you click into the edit field labeled
<guilabel>ISearch</guilabel> in the toolbar, the search is performed as you
type. You will find that often the desired term is already found after typing
in 3 or 4 letters.
</para>

</sect2> <!-- isearch -->


<sect2 id="grep">
<title>Grep</title>
<indexterm zone="grep"><primary>search</primary><secondary>in files</secondary></indexterm>

<para>
Both search mechanisms described above are restricted to searching within one
source file. An additional tool which allows you to search through a (possibly
large) number of files is available through the
<guimenuitem>Search in Files...</guimenuitem> item in the
<guimenu>Edit</guimenu> menu. It is basically a frontend for the
&grep;(1) program.
</para>

<para>
In the dialog, you can specify which files are searched. There is a number of
wildcard patterns available in a combobox. In this way, you can easily
restrict the find mechanism to header files. Furthermore, you specify a
directory where the search is started. If you check the
<guibutton>Recursive</guibutton> box, the search iterates through all
directories in the hierarchy below this one.
</para>

<para>
The search term is in general a regular expression following POSIX syntax.
For example, you can use the term <literal>"\&lt;K.*"</literal> if you want to
find all words which begin with the letter K. The following characters
are interpreted in a special way:
</para>

<informaltable>
<tgroup cols="2">
<tbody>

<row><entry>
  <literal>.</literal>
</entry><entry>
  Matches any character
</entry></row>
<row><entry>
  <literal>^</literal>
</entry><entry>
Matches the beginning of a line
</entry></row>
<row><entry>
  <literal>$</literal>
</entry><entry>
  Matches the end of a line
</entry></row>
<row><entry>
  <literal>\&lt;</literal>
</entry><entry>
  Matches the beginning of a word
</entry></row>
<row><entry>
  <literal>\&gt;</literal>
</entry><entry>
  Matches the end of a word
</entry></row>
<row><entry>
  <literal>?</literal>
</entry><entry>
  The preceding item matches less than once
</entry></row>
<row><entry>
  <literal>*</literal>
</entry><entry>
  The preceding item is matched zero or more times
</entry></row>
<row><entry>
  <literal>+</literal>
</entry><entry>
  The preceding item is matched once or more times
</entry></row>
<row><entry>
  <literal>{n}</literal>
</entry><entry>
  The preceding item is matched exactly n times
</entry></row>
<row><entry>
  <literal>{n,}</literal>
</entry><entry>
  The preceding item is matched n or more times
</entry></row>
<row><entry>
  <literal>{,n}</literal>
</entry><entry>
  The preceding item matches less than n times
</entry></row>
<row><entry>
  <literal>{n,m}</literal>
</entry><entry>
  The preceding item matches at least <literal>n</literal> times but less
than <literal>m</literal> times
</entry></row>

</tbody>
</tgroup>
</informaltable>

<para>
Backreferences to bracketed subexpressions are also available by the notation
<literal>\n</literal>.
</para>

<para>
For C++ programmers, as special bonus there are some search templates
available for typical patterns. These allow you to search for example
all calls of member functions of a certain object.
</para>

<para>
Once you start the search by clicking on the <guibutton>Search</guibutton>
button, it will be performed by an external, asynchronous process. All found
items will appear in the view called <guilabel>Grep</guilabel>. You can then
jump to the found items by clicking on them. Note that grep scans the files
as they stored in the file system. If you have modified versions of them in
your editor, you may get some mismatches in the line number, or some found
items will be invalid. You can avoid this by saving all files beforehand.
</para>

</sect2> <!-- grep -->

</sect1> <!-- searchinggrepping -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="code-completion">
<title>Code Completion</title>

<para>
(... to be written ...)
</para>
</sect1> <!-- code-completion -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="newfiles">
<title>Creating New Files and Classes</title>

<para>
(... to be written ...)
</para>

<sect2 id="newfiles-edittemplates">
<title>Editing the Templates</title>

<para>
(... to be written ...)
</para>
</sect2> <!-- newfiles-edittemplates -->

</sect1> <!-- newfiles -->

</chapter> <!-- editing -->

<!-- ====================================================================== -->

<chapter id="file-browsers">
<title>The File Browsers</title>

<para>
On the left side of the main window, &kdevelop; can display various kinds of
lists and trees for the selection of files:
</para>

<itemizedlist>
<listitem>
<formalpara>
<title>File Tree</title>
<para>
This shows a tree view of the file hierarchy below the project directory. If
you click on a file, it is loaded into the editor. For files which do not
contain text, KDevelop starts an application that can handle the respective
MIME type.
</para>
</formalpara>

<para>
The file tree is regularly updated whenever something changes in the file
system. For example, if you create new files or directories (even outside
&kdevelop;), this is immediately reflected in the file list. On Linux,
this feature makes use of the FAM library. On other operating systems or over
NFS, the directories shown are polled in small intervals.
</para>

<para>
The file tree hides files which are usually not interesting, like object
files. In the <guimenuitem>Project options</guimenuitem> under
<guibutton>File views</guibutton>, you can configure (as a comma separated
list of wildcards) which patterns are used to filter out irrelevant files.
</para>

<para>
Furthermore, you can decide to restrict the file tree to show only files which
belong to the currently loaded project. This can be toggled by clicking with
the right mouse button on the root item of the tree.
</para>

<figure id="screenshot-filetree" float="1">
<title>A Screenshot of the File Tree</title>
<mediaobject>
<imageobject><imagedata fileref="filetree.png"/></imageobject>
</mediaobject>
</figure>

</listitem>

<listitem>
<formalpara>
<title>File Groups</title>
<para>
This shows the files belonging to the project, grouped by their file name
extension. As in the file tree, you can edit a file by clicking on it
with the left mouse button.
</para>
</formalpara>

<para>
The groups shown in this view can be configured under
<guibutton>File views</guibutton> in the
<guimenuitem>Project options</guimenuitem> dialog. In order to customize the
view to your needs, it is helpful to understand how files are distributed on
the groups. For each file, &kdevelop; goes through all groups from top to
bottom. In each group, it looks whether the file name matches one of the
patterns. If there is a match, the file is shown in this group and the
iteration is aborted. This makes it clear that more general patterns should
be put below more specific ones. For example, an asterisk for the
<guilabel>Other</guilabel> group should  be the last pattern.
</para>

</listitem>

</itemizedlist>

</chapter> <!-- file-browsers -->

<!-- ====================================================================== -->

<chapter id="class-browsers">
<title>The Class Browsers</title>
<indexterm zone="class-browsers"><primary>class browser</primary></indexterm>

<para>
When working on a project in an object-oriented language, your emphasis when
working on a project is not on the source files and their names, but on the
classes and their relationships. In order to help you navigating in the space
of defined classes and symbols, &kdevelop; includes various class browsers
that visualize the class structure in different ways.
</para>

<sect1 id="classview">
<title>Class View</title>

<para>
This view is shown on the left side of the main window and contains a linear
list of all classes, variables and functions in your project. It is designed
as a tree view. If you open a class node by clicking on it, a list with all
methods and attributes of the respective class is shown.
</para>

<figure id="screenshot-classview" float="1">
<title>A Screenshot of the Class View</title>
<mediaobject>
<imageobject><imagedata fileref="classview.png"/></imageobject>
</mediaobject>
</figure>

<para>
The class view works in two different modes. By default, all symbols are
grouped into <quote>Classes</quote>, <quote>Structs</quote>, <quote>Functions</quote>, <quote>Variables</quote> and <quote>Namespaces</quote>.
In the context menu of the view, you can choose
<guimenuitem>List by Namespaces</guimenuitem>. In this mode, the namespace
hierarchy is shown and the symbols grouped into the respective namespace where
they are defined. This may be more useful in projects which make heavy use of
(nested) namespaces. It is less useful in projects without namespaces.
</para>

<para>
You can also change the way in which class names are displayed. Normally, the
names of the classes are shown, without the namespace in which they are defined.
This means, you cannot immediately distinguish classes with the same name in
different namespaces. If you rest for a while with the mouse over an item, the
full scoped name is shown as a tooltip though. You can decide to always
display the fully scoped class name by choosing
<guimenuitem>Full Identifier scopes</guimenuitem> from the context menu.
</para>

<para>
Clicking on a class or method in the class view brings you to its definition.
You can also jump to the declaration of a method by choosing
<guimenuitem>Go to declaration</guimenuitem> from the context menu. In the
context menu for classes are also the items
<guimenuitem>Add method..</guimenuitem> and
<guimenuitem>Add attribute...</guimenuitem>. This opens dialogs where you can
generate new method and variable declaration in the respective class, together
with an empty implementation.
</para>

</sect1> <!-- classview -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="classtools">
<title>Class Tools</title>

<para>
The class tool dialog is activated by right clicking on a class in the class
view and choosing <guimenuitem>Class tool...</guimenuitem>.
</para>

</sect1> <!-- classtools -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="classhierarchy">
<title>Class Hierarchy</title>

<para>
(... to be written ...)
</para>

</sect1> <!-- classhierarchy -->

</chapter> <!-- class-browsers -->

<!-- ====================================================================== -->

<chapter id="documentation">
<title>Documentation</title>

<para>
Documention unfortunately belongs to the most-overlooked programming issues. Yet, once properly set up and maintained internal and external documentation provides most valuable help.
</para>
<para>
Documentation has multiple facets. There is
<itemizedlist>
  <listitem><para>
  <emphasis>project internal documentation</emphasis>, mainly consisting of
  <itemizedlist>
    <listitem><para>
    <emphasis>comments</emphasis> in header/source files
    </para></listitem>
    <listitem><para>
    <emphasis>internal API documentation</emphasis> of your project generated from the program file by special tools, &eg; &doxygen;
    </para></listitem>
  </itemizedlist>
  </para></listitem>
  <listitem><para>
  <emphasis>project external documentation</emphasis>, comprising among others
  <itemizedlist>
    <listitem><para>
    <emphasis>external API documentation</emphasis> of &eg; common system libraries (<application>KDE</application>, <application>Qt</application>, &etc;)
    </para></listitem>
    <listitem><para>
    any other documentation (programming language manuals, general system information, how-to articles and the like)
    </para></listitem>
  </itemizedlist>
  </para></listitem>
</itemizedlist>
</para>
<para>
All this documentation should be easily maintainable and ready at hand whenever you need it. &kdevelop; has provisions for just this.
</para>

<!-- ### doc browser, notes on internal documentation, how to profit from Doxygen -->

<sect1 id="docbrowser">
<title>The Documentation Browser</title>


<figure id="screenshot-doctreeview" float="1">
<title>A Screenshot of the Documentation Tree</title>
<mediaobject>
<imageobject><imagedata fileref="doctreeview.png"/></imageobject>
</mediaobject>
</figure>

</sect1> <!-- docbrowser -->

</chapter> <!-- documentation -->

<!-- ====================================================================== -->

&project-management; <!-- "Building and Project Management"                 -->

<!-- ====================================================================== -->

<chapter id="adv-build-management">
<title>Advanced Build Management</title>
<indexterm zone="adv-build-management"><primary>&automake;</primary></indexterm>

<sect1 id="buildconfigurations">
<title>Multiple Build Configurations</title>
<indexterm zone="buildconfigurations"><primary>build configurations</primary><secondary>multiple</secondary></indexterm>

<para>
(... to be written ...)
</para>

</sect1> <!-- buildconfigurations -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="crosscompiling">
<title>Cross-Compiling</title>
<indexterm zone="crosscompiling"><primary>cross compiling</primary></indexterm>
<indexterm zone="crosscompiling"><primary>compiling</primary><secondary>cross</secondary></indexterm>
<indexterm zone="crosscompiling"><primary><option>--host</option></primary></indexterm>

<para>
When you have suitable cross compilers available, you can cross compile your
programs for processors and operating systems different from the system where
&kdevelop; and the compiler is running. The &GNU; compiler collection &gcc; can
be configured and compiled as a cross compiler if you compile it yourself.
Consult the <ulink url="info://gcc/Cross-Compiler">GCC info pages</ulink> for
more information. Some Linux distributions also provide binary packages.
</para>

<para>
An automake based package can easily be cross-compiled by specifying the
<option>--host</option> option to the configure script and setting the
<envar>CC</envar> and <envar>CXX</envar> environment variables to the
respective cross compiler binaries. Often you want to switch between a
the cross-compiled version of your application and one compiled for your
development system. For this, it is advantageous to use &kdevelop; capability
of creating multiple build configurations, as explained in
<xref linkend="buildconfigurations"/>. Once you have created a new build
configuration for cross-compiling in the
<menuchoice><guimenu>Project</guimenu>
<guimenuitem>Project Options...</guimenuitem></menuchoice> dialog, add
the option
</para>

<para><screen>
<option>--host=</option><replaceable>platform</replaceable>
</screen></para>

<para>
to the configure options. The <replaceable>platform</replaceable> name
is a tuple of the form
</para>

<programlisting>cpu-vendor-os</programlisting>
<para>or</para>
<programlisting>cpu-vendor-kernel-os</programlisting>

<para>
For many combinations, you can use a short form, for instance
<wordasword>i386-linux</wordasword> or <wordasword>arm-elf</wordasword>.
</para>

</sect1> <!-- crosscompiling -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="qtembedded">
<title>Qt/Embedded</title>
<indexterm zone="qtembedded"><primary>embedded</primary><secondary>Qt</secondary></indexterm>
<indexterm zone="qtembedded"><primary>Qt/Embedded</primary></indexterm>
<indexterm zone="qtembedded"><primary>Qtopia</primary></indexterm>
<indexterm zone="qtembedded"><primary>framebuffer</primary></indexterm>

<para>
&qte; is a version of the &Qt; library that does not use the X window
system, but draws directly to the framebuffer on Linux systems. It is
therefore interesting for embedded systems which have tight restrictions
on the memory usage of the whole system. Its API is fully compatible with
the one of the X11 version.
</para>

<para>
Developing an application for &qte; with &kdevelop; is not very different
from developing a program for the X11 version of &Qt;. In fact, you can use the
same codebase for both versions. If you use the autoproject project
management, you switch to the embedded version by passing the argument
<option>--enable-embedded</option> to the configure script. You can set
this in the <menuchoice><guimenu>Project</guimenu>
<guimenuitem>Project Options...</guimenuitem></menuchoice> dialog under
<guilabel>Configure Options</guilabel>. With the option
<option>--with-qt-dir=DIR</option> you set the directory in which &qte;
is installed.
</para>

<para>
After configuring and compiling your application with these options, it will
link with the <filename>libqpe.so</filename> library. This version of your
application will not normally run when you use X11. In order to test it,
run it under the control of the program <application>qvfb</application>
(Qt Virtual Frame Buffer). This is done by starting
<application>qvfb</application> and then starting your application with
</para>

<para><screen><command>
app <option>-qws</option> <option>-display QVFb:0</option>
</command></screen></para>

<para>
Naturally, when you have a working version of your application, you
will want to use it on the target processor. For this, it will probably
be convenient to create multiple build configurations, as explained above,
so that you can quickly switch between the version running on your development
system and the version running on the target system.
</para>

<para>
Applications for &qte; normally run as single applications on the
device they are designed for. Trolltech also supports Qtopia, which is a
collection of applications for PIM, web browsing and various other areas that
work together in a consistent manner. It is the standard environment for
instance on the Sharp Zaurus. You can write applications that integrate into
this environment by using the Qtopia SDK. This implies making your application
class a subclass of <classname>QPEApplication</classname> and linking to the
library <filename>libqpe.so</filename>. If you develop your application with
the autoproject project management, you have to add
<option>--enable-qtopia</option> to the configure options.
</para>

</sect1> <!-- qtembedded -->

</chapter> <!-- adv-build-management -->

<!-- ====================================================================== -->

<chapter id="debugger">
<title>The Debugger Interface</title>
<indexterm zone="debugger"><primary>debugger</primary></indexterm>

<para>
For C and C++, &kdevelop; contains an internal debugger that is directly
integrated with the editor. Technically, it is implemented as a frontend
that uses the portable &GNU; debugger <application>gdb</application> through
a pipe. The debugger can be started in several ways:
</para>

<itemizedlist>
<listitem>
<para>
With <menuchoice><guimenu>Debug</guimenu><guimenuitem>Start</guimenuitem></menuchoice>,
the main program of your project is loaded into the debugger.
</para>
</listitem>

<listitem>
<para>
Using <menuchoice><guimenu>Debug</guimenu>
<guimenuitem>Start (other)</guimenuitem>
<guimenuitem>Examine core file</guimenuitem></menuchoice> you load a core file
into memory, which is generated by the operating system kernel when the
program has crashed (The generation of core files may be switched off on your
system, see <application>ulimit(1)</application>). This is useful for a
post-mortem analysis of a program.
</para>
</listitem>

<listitem>
<para>
With <menuchoice><guimenu>Debug</guimenu>
<guimenuitem>Start (other)</guimenuitem>
<guimenuitem>Attach to process</guimenuitem></menuchoice> you invoke the
debugger on an already running program. You will be shown a
process list where you can select the process which the debugger
should take over.
</para>
</listitem>

<listitem>
<para>
Note that debugging is only possible if your project has been compiled with
debugging information enabled. It can be activated in the
<guibutton>Compiler options</guibutton> dialog. When this option is switched
on, the compiler generates additional data which allows the debugger to
associate file names and line numbers with addresses in the executable.
</para>
</listitem>
</itemizedlist>

<para>
The debugger frontend offers several views <quote>into</quote> the process:
</para>

<itemizedlist>
<listitem>
<formalpara>
<title>Variables</title>
<indexterm zone="debugger"><primary>watch variables</primary></indexterm>
<para>
This window lists the values of all local variables at the current execution
point of the program. It covers the variables in the complete call stack,
&ie;  the function where the process was interrupted, the function that called
this function, and so on up to <function>main()</function> function.
</para>
</formalpara>

<para>
Another branch in the variables contains watch variables. You can configure
yourself which variables are shown here. Both local and global variables can
be watched. You can add variables either by clicking on the
<guibutton>Add</guibutton> button or pressing <keycap>RETURN</keycap> while
the <guilabel>Watch</guilabel> item is selected. They can be removed again
via the context menu.
</para>
</listitem>

<listitem>
<formalpara>
<title>Breakpoints</title>
<indexterm zone="debugger"><primary>breakpoints</primary></indexterm>
<para>
(... to be written ...)
</para>
</formalpara>
</listitem>

<listitem>
<formalpara>
<title>Frame Stack</title>
<indexterm zone="debugger"><primary>frame stack</primary></indexterm>
<para>
(... to be written ...)
</para>
</formalpara>
</listitem>

<listitem>
<formalpara>
<title>Disassemble</title>
<indexterm zone="debugger"><primary>disassemble</primary></indexterm>
<para>
(... to be written ...)
</para>
</formalpara>
</listitem>

</itemizedlist>


<sect1 id="settingbreakpoints">
<title>Setting Breakpoints</title>

<para>
(... to be written ...)
</para>

</sect1> <!-- settingbreakpoints -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id ="debuggeroptions">
<title>Options</title>

<formalpara>
<title>Display Mangled Names</title>
<indexterm zone="debugger"><primary>name mangling</primary></indexterm>
<indexterm zone="debugger"><primary>mangling</primary><secondary>name</secondary></indexterm>

<para>
In C++, function names in the executable are <quote>mangled</quote>, &ie; the function
names include information about the argument types. This is necessary in
order to support overloading of functions. The mangling algorithm is not
standardized and differs even between different versions of the
&GNU; C++ compiler.
</para>
</formalpara>

<para>
In the disassembling window, normally unmangled names are displayed, so
function signatures appear in the similar way as in the source code, so
they are easily readable. Alternatively, you can decide to see mangled names.
</para>

<formalpara>
<title>Try Setting Breakpoints on Lib Load</title>
<indexterm zone="debugger"><primary>lazy breakpoints</primary></indexterm>
<indexterm zone="debugger"><primary>breakpoints</primary><secondary>lazy</secondary></indexterm>

<para>
The debugger backend <application>gdb</application> does not allow to set
breakpoints within code that is not currently loaded. In a highly modular
application, where often code is only loaded on demand as a plugin (using
the libc function <function>dlopen(3)</function>), this can be inconvenient.
Therefore, &kdevelop; rolls its own support for breakpoints in shared
libraries. If you set this option, it allows you to set breakpoints in
libraries which are not loaded. Then, whenever <application>gdb</application>
notifies that a library is loaded, &kdevelop; tries to set the pending
breakpoints.
</para>
</formalpara>

<formalpara>
<title>Enable Floating Toolbar</title>
<indexterm zone="debugger"><primary>debugger toolbar</primary></indexterm>
<indexterm zone="debugger"><primary>toolbar</primary><secondary>debugger</secondary></indexterm>

<para>
(... to be written ...)
</para>
</formalpara>

</sect1> <!-- debuggeroptions -->

</chapter> <!-- debugger -->

<!-- ====================================================================== -->
<!-- ### Questionable, probably not IDE-specific enough. Check later again.
<chapter id="python">
<title>Python</title>

<para>...
</para>

</chapter> --> <!-- python -->

<!-- ====================================================================== -->
<!-- ### Questionable, probably not IDE-specific enough. Check later again.
<chapter id="php">
<title>PHP</title>

<para>...
</para>
</chapter> --> <!-- php -->

<!-- ====================================================================== -->

<chapter id="cvs">
<title>Using CVS</title>
<indexterm zone="cvs"><primary>CVS</primary></indexterm>
<indexterm zone="cvs"><primary>revision control</primary></indexterm>

<sect1 id="cvs-basics">
<title>&CVS; Basics</title>

<para>
&CVS; is the revision control system which many open source projects -
including &kde; &mdash; are using. It stores all sources codes in a central place,
called the <emphasis>repository</emphasis>.  From the repository, developers
can check out a current version of the project or snapshots of it at arbitrary
points of time. In contrast to some other revision control systems, it is not
necessary to <emphasis>lock</emphasis> files one wants to work on. So
development can be highly parallelized.
</para>

<para>
Whenever a developer has finished a task, he <emphasis>commits</emphasis> his
code (accompanied by a log message). &CVS; takes the job to merge the changes
made by several developers. It can of course happen that developers work on
the same piece of code, resulting in a conflicting set of changes (in practice
this occurs seldom, and is often a sign of a lack of communication). In this
case &CVS; rejects a commit; only after all conflicts are resolved, a file can
be committed.
</para>

<para>
So far, this has been a description of the basic features of &CVS; one usually
has to cope with. But &CVS; can provide a lot more: One can  maintain several
branches of a project (e. g. &kde; 1.1.2 and &kde; 2 were branches in &kde;'s
development tree), merge changes from one branch to another, ask for
differences between revisions, the revision history of files &etc;
</para>

<para>
&CVS; is implemented as a client-server system. As a user, all communication
with the repository goes through the command line program &cvs;. A higher
level user interface is available through frontends like
<application>Cervisia</application> (<ulink url="http://cervisia.sf.net"/>)
or <application>TkCVS</application> (<ulink url="http://tkcvs.sf.net"/>).
In &kdevelop;, only a small part of the &cvs; functionality which is
important for your daily work can be used directly.
</para>

<para>
Basic knowledge of &CVS; usage is assumed. In particular, you should know
how to checkout a given project from the repository. We recommend the
book <quote>Open Source Development With CVS</quote> by Karl Fogel which is freely
distributed (except for the non-technical chapters). See
<ulink url="http://cvsbook.red-bean.com/cvsbook.html"/>.
</para>

</sect1> <!-- cvs-basics -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="cvs-commands">
<title>&CVS; Commands in &kdevelop;</title>

<para>
In the file views, the following context menu items are available:
</para>

<itemizedlist>

<listitem>
<formalpara>
<title>Add to Repository</title>
<para>Prepares the marked file for addition to the repository. The file
is transferred to the repository when you commit it (or the containing
directory) the next time.
</para>
</formalpara>
</listitem>

<listitem>
<formalpara>
<title>Remove from Repository</title>
<para>
Prepares a file for removal from the repository. This also deletes
the file on the local file system, so use this feature with care!
</para>
</formalpara>
</listitem>

<listitem>
<formalpara>
<title>Update</title>
<para>
Runs <command>cvs update</command> to merge any changes from other
users into your working directory. When you use this menu item over
a directory, the update normally happens recursively, except if you
have disabled this in the configuration file <filename>.cvsrc</filename>.
</para>
</formalpara>
</listitem>

<listitem>
<formalpara>
<title>Commit</title>
<para>
Runs <command>cvs commit</command> to upload any locally made changes
to the repository. Note that you should update before doing this.
Otherwise, when another user has committed his own changes before,
&CVS; may give you an error message.
</para>
</formalpara>
</listitem>

</itemizedlist>

<para>
All these commands are invoked as subprocesses by &kdevelop; without any
further command line options or environment variables. This may be a
problem when the connection with the &CVS; server goes through a
&ssh; connection and requires that you enter your password each time
you commit or update. This is for instance necessary when your project is
hosted on <filename>sourceforge.net</filename>. Workarounds for this
problem are described on the CVS/SSH FAQ which you can find in the
SourceForge documentation.
</para>

</sect1> <!-- cvs-basics -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="cvs-behind">
<title>Behind the Scenes</title>

<sect2 id="cvs-behind-workdir">
<title>What &CVS; Records in the Working Directory</title>

<para>
(... to be written ...)
</para>
</sect2> <!-- cvs-behind-workdir -->

</sect1> <!-- cvs-behind -->

</chapter> <!-- cvs -->

<!-- ====================================================================== -->

<chapter id="external-progs">
<title>Leveraging External Programs</title>
<indexterm zone="external-progs"><primary>programs</primary><secondary>external</secondary></indexterm>

<para>
Although &kdevelop; is a so-called <quote>Integrated</quote> development environment, it
will never contain all features that you may want to use, and the
capabilities of its editor will never suffice to perform often-used text
processing tasks. As a genuine &UNIX; program, &kdevelop; contains several
possibilities to start external programs, plugin external programs to work
on files, or use external filters to process the content of the editor.
</para>

<para>
The most general and simple feature of this kind is the tool menu, which you
can freely configure. This is done in the <menuchoice><guimenu>Settings</guimenu>
<guimenuitem>Configure KDevelop...</guimenuitem></menuchoice>.
dialog under <guibutton>External tools</guibutton>.
</para>

<para>
Other tools will be discussed in the chapter <xref linkend="plugin-tools"/>.
</para>

</chapter> <!-- external-progs -->


<!-- ====================================================================== -->

<chapter id="credits">
<title>Credits</title>

<sect1 id="credits-contributions">
<title>Contributions</title>

<para>
<itemizedlist>
  <listitem><para>
  The initial contents of this manual were witten by Bernd Gehrmann <email>bernd@kdevelop.org</email> and Caleb Tennis <email>caleb@aei-tech.com</email>.
  </para></listitem>
  <listitem><para>
  The <link linkend="automake-manager-summary">Summary of &automanag;</link> and <link linkend="automake-manager-operation">Automake Manager Operation</link> chapters were written by Ian Wadham, <email>ianw@netspace.net.au</email>).
  </para></listitem>
</itemizedlist>
</para>

</sect1> <!-- credits-contributions -->

<!--CREDITS_FOR_TRANSLATORS-->

</chapter> <!-- credits -->

<!-- ====================================================================== -->

<appendix id="app-menus">
<title>Menus and Toolbars Overview</title>

<para>
(... to be written ...)
</para>

</appendix> <!-- app-menus -->

<!-- ====================================================================== -->

<appendix id="app-shortcuts">
<title>Shortcut Keys</title>

<para>
(... to be written ...)
</para>

</appendix> <!-- app-shortcuts -->

<!-- ====================================================================== -->

<appendix id="plugin-tools">
<title>Plugin Tools</title>

<indexterm zone="plugin-tools">
  <primary>plugins</primary></indexterm>

<para>
&kdevelop; contains a large number of little tools that help you to perform
certain task. Most of them are realized as plugins. This means, if you do not
like one of them, you can simply  disable it in the
<guimenuitem>Project options</guimenuitem> dialog under
<guibutton>Plugins</guibutton> (for project-wide plugins) or under
<menuchoice><guimenu>Settings</guimenu>
<guimenuitem>Configure KDevelop...</guimenuitem></menuchoice>.
Plugins which are switched off do not clutter your menus and are not loaded
into memory.
</para>

<itemizedlist>
<listitem>
<formalpara>
<title>The <command>abbrev</command> Plugin</title>
<indexterm zone="plugin-tools"><primary><command>abbrev</command></primary></indexterm>

<para>
This plugin expands abbreviations into frequently used code snippets. It is
activated by pressing <keycombo><keycap>Ctrl</keycap>
<keycap>Space</keycap></keycombo>. For example, when you enter
<literal>"ife"</literal> into a C++ in the editor and press
<keycombo><keycap>Ctrl</keycap><keycap>Space</keycap></keycombo>, you obtain
an <literal>if-else</literal> code template and save some key strokes. The set
of supported abbreviations depends on the programming language of the edited
file. For example, for PHP you will obviously be interested in other code
templates than for &Java;.
</para>
</formalpara>

<para>
The set of code templates is configurable. You can see
which ones are available in the <menuchoice><guimenu>Settings</guimenu>
<guimenuitem>Configure KDevelop...</guimenuitem></menuchoice>
dialog under <guibutton>Abbreviations</guibutton>
</para>
</listitem>

<listitem>
<formalpara>
<title>The <command>filter</command> Plugin</title>
<indexterm zone="plugin-tools"><primary><command>filter</command></primary></indexterm>

<para>
This offers two features. If you select <menuchoice><guimenu>Tools</guimenu>
<guimenuitem>Execute command</guimenuitem></menuchoice>, you can enter a shell
command. The output of this command is inserted into the editor buffer when
you hit the <guibutton>Start</guibutton> button.
</para>
</formalpara>

<para>
A related feature is available under
<menuchoice><guimenu>Tools</guimenu><guimenuitem>Filter selection through
command...</guimenuitem></menuchoice>.  In order to use this, you must
select a text area in the editor. If you now enter a shell command and hit
the <guibutton>Start</guibutton> button, the command is started and the
selection used as the standard input for it. The standard output of the
command is then inserted into the editor.
</para>
</listitem>

<listitem>
<formalpara>
<title>The &doxygen; Plugin</title>
<indexterm zone="plugin-tools"><primary>&doxygen;</primary></indexterm>
<indexterm zone="plugin-tools"><primary>documentation tool</primary></indexterm>
<indexterm zone="plugin-tools"><primary>API documentation</primary></indexterm>

<para>
This one helps you to use the &doxygen; API documentation tool
(<ulink url="http://www.doxygen.org"/>). You can select
<menuchoice><guimenu>Project</guimenu>
<guimenuitem>Run Doxygen</guimenuitem></menuchoice> to generate API
documentation for your current project, based on the configuration given by
the file <filename>Doxyfile</filename> in your project directory.
</para>
</formalpara>

<para>
Furthermore, you can configure &doxygen; in the
<menuchoice><guimenu>Project</guimenu>
<guimenuitem>Project options...</guimenuitem></menuchoice> dialog. This dialog
is very similar to the &doxywizard; tool.
</para>
</listitem>

<listitem>
<formalpara>
<title>The &ctags; Plugin</title>
<indexterm zone="plugin-tools"><primary>&ctags;</primary></indexterm>

<para>
Although the class browser gives you extensive insight into the symbols and
classes of your project, you may also want to use the ctags tool. In particular,
this one supports a lot more language than the class browser.
</para>
</formalpara>

<para>
You activate this plugin under <menuchoice><guimenu>Tools</guimenu>
<guimenuitem>CTags...</guimenuitem></menuchoice>. When you start it the first
time, you will be asked to generate a search database first. When you accept
this, the &ctags; program will be started and will create a file named
<filename>tags</filename> in your project directory. This is a text file containing
all symbols of your source files.
</para>

<para>
You can search in the symbol database in two ways: when the
<guilabel>Regular expression match</guilabel> box is checked, the text you
enter will be interpreted as a regular expression (POSIX flavor) and matched
with the existing symbols. For example, the text <literal>.*Widget</literal>
will search for all symbols ending with <literal>Widget</literal>. If the
box is not checked, the search will be verbatim.
</para>

<para>
When searching, you will get a list of the matched symbols, accompanied with
the line numbers where they are defined. You jump to the respective point by
clicking on the list.
</para>

<para>
For some languages, &ctags; distinguishes different kinds of symbols. For
example, Python has classes and functions. You can selectively search only
for classes by checking the respecting kinds in the dialog.
</para>

<para>
The symbol database is normally not updated when your sources change.
Consequently, after a while the line numbers will not be correct anymore
and newly added classes and functions will be missing. Therefore you should
update the <filename>tags</filename> file in regular intervals by pressing
the button <guibutton>Regenerate</guibutton>.
</para>
</listitem>

<listitem>
<formalpara>
<title>The <command>astyle</command> Plugin</title>
<indexterm zone="plugin-tools"><primary><command>astyle</command></primary></indexterm>
<indexterm zone="plugin-tools"><primary><application>Artistic Style</application></primary></indexterm>
<indexterm zone="plugin-tools"><primary>indentation</primary></indexterm>

<para>
(... to be written ...)
</para>
</formalpara>
</listitem>

<listitem>
<formalpara>
<title>The <command>regexptest</command> Plugin</title>
<indexterm zone="plugin-tools"><primary><command>regexptest</command></primary></indexterm>
<indexterm zone="plugin-tools"><primary>debugging</primary><secondary>regular expressions</secondary></indexterm>
<indexterm zone="plugin-tools"><primary>regular expressions</primary><secondary>debugging</secondary></indexterm>

<para>
Designing with regular expressions can be hard work. Often the first try at an
expression matches too many strings. In particular, when working with a
compiled language, the turnaround times when debugging a regular expression
can be awkward. The regexptest plugin allows you to directly explore the
changes in a regular expression. It is activated by choosing
<menuchoice><guimenu>Tools</guimenu>
<guimenuitem>Debug Regular Expression...</guimenuitem></menuchoice>.
</para>
</formalpara>

<para>
In the flavor group box, you can choose the flavor of the regular expression
engine used. Currently supported is the flavor defined in the POSIX standard,
which is used by the &grep; program, and the extended POSIX syntax used by the
program &egrep;.
</para>

<para>
When you enter an expression, you get immediate feedback about any syntax
errors in it. By entering a text under <guilabel>Test string</guilabel>,
you can see whether the expression matches this string. In particular, if
your regular expression includes groups, such as <literal>([a-z])</literal>,
the content of the matched subgroups will be shown in a list box.
</para>
</listitem>

<listitem>
<formalpara>
<title>The <command>konsole</command> Plugin</title>
<indexterm zone="plugin-tools"><primary><command>konsole</command></primary></indexterm>
<indexterm zone="plugin-tools"><primary>terminal</primary><secondary>embedded</secondary></indexterm>

<para>
(... to be written ...)
</para>
</formalpara>
</listitem>

</itemizedlist>

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="parts-survey">
<title>Overview</title>

<para>
&kdevelop; offers extensible modules, or parts, to be loaded at runtime and on demand.  This allows developers to only turn on features that they need or want for their development.
</para>

<para>
Some of the parts are considered <link linkend="table-global-parts">global</link> &mdash; that is, they effect the entire operation of &kdevelop;. For example, the uimode part allows a developer to select which user interface they wish to use.
</para>

<para>
Other parts are <link linkend="table-project-parts">project specific</link>, and are only utilized when a project of that type is loaded.  The Automake Manager, for example, only needs to be active when an Automake based project is currently loaded.  Otherwise, this part will not be active.
</para>

<para>
Active parts can have many effects on &kdevelop;.  Depending on their function, they may add extra menus, extra menu items, extra tool buttons, &etc;
</para>

<table id="table-project-parts">
<title>Project Management Parts in &kdevelop;</title>

<tgroup cols="2"><tbody>
<row>
  <entry>antproject</entry>
  <entry>ANT Project Manager (&Java; applications)</entry>
</row>
<row>
  <entry>autoproject</entry>
  <entry>Automake Project Manager</entry>
</row>
<row>
  <entry>customproject</entry>
  <entry>Custom Project Manager</entry>
</row>
<row>
  <entry>trollproject</entry>
  <entry>QMake based Project Manager</entry>
</row>
</tbody></tgroup>
</table>

<table id="table-global-parts">
<title>Global Parts in &kdevelop;</title>

<tgroup cols="2"><tbody>
<row><entry>Part Name</entry><entry>Description</entry></row>
<row><entry>appwizard</entry><entry>New Project Wizard</entry></row>
<row><entry>history</entry><entry></entry></row>
<row><entry>konsole</entry><entry>Embedded Konsole</entry></row>
<row><entry>editor-chooser</entry><entry>Chooses an internal text editor</entry></row>
<row><entry>doctreeview</entry><entry>Documentation Viewer</entry></row>
<row><entry>openwith</entry><entry></entry></row>
<row><entry>fileselector</entry><entry>A file selection widget</entry></row>
<row><entry>uimode</entry><entry>Customize the UI mode</entry></row>
<row><entry>texttools</entry><entry>Additional text tools</entry></row>
<row><entry>tipofday</entry><entry>A tip of the day</entry></row>
<row><entry>grepview</entry><entry>A graphical grep utility</entry></row>
<row><entry>cvs</entry><entry>CVS Support</entry></row>
<row><entry>tools</entry><entry></entry></row>
<row><entry>regexptest</entry><entry>A regular expression tester</entry></row>
<row><entry>abbrev</entry><entry>Abbreviation Expansion</entry></row>
<row><entry>filter</entry><entry></entry></row>
<row><entry>valgrind</entry><entry>A graphical valgrind frontend</entry></row>
</tbody></tgroup>
</table>

<table>
<title>Language Support Parts in &kdevelop;</title>
<tgroup cols="2">
<tbody>
<row><entry>cppsupport</entry><entry>Support for C/C++</entry></row>
<row><entry>fortransupport</entry><entry>Support for Fortran</entry></row>
<row><entry>javasupport</entry><entry>Support for &Java;</entry></row>
<row><entry>perlsupport</entry><entry>Support for Perl</entry></row>
<row><entry>phpsupport</entry><entry>Support for PHP</entry></row>
<row><entry>pythonsupport</entry><entry>Support for Python</entry></row>
</tbody></tgroup>
</table>

<table>
<title>Project Specific Parts in &kdevelop;</title>
<tgroup cols="2"><tbody>
<row><entry>astyle</entry><entry></entry></row>
<row><entry>buglist</entry><entry></entry></row>
<row><entry>classview</entry><entry>Classview Manager</entry></row>
<row><entry>ctags</entry><entry></entry></row>
<row><entry>debugger</entry><entry>&GNU; Debugger Manager</entry></row>
<row><entry>diff</entry><entry></entry></row>
<row><entry>distpart</entry><entry></entry></row>
<row><entry>doxygen</entry><entry></entry></row>
<row><entry>fileview</entry><entry></entry></row>
<row><entry>javadebugger</entry><entry></entry></row>
<row><entry>manager</entry><entry></entry></row>
<row><entry>nedit</entry><entry></entry></row>
<row><entry>outputviews</entry><entry></entry></row>
<row><entry>perforce</entry><entry></entry></row>
<row><entry>qeditor</entry><entry></entry></row>
<row><entry>scripting</entry><entry></entry></row>
<row><entry>scriptproject</entry><entry></entry></row>
<row><entry>sourcenav</entry><entry></entry></row>
<row><entry>svn</entry><entry></entry></row>
<row><entry>visualboyadvance</entry><entry></entry></row>
<row><entry>windowmenu</entry><entry></entry></row>
</tbody></tgroup>
</table>

</sect1> <!-- parts-survey -->

</appendix> <!-- plugin-tools -->

<!-- ====================================================================== -->

<appendix id="app-uimodes-examples">
<title>&kdevelop; User Interface Mode Examples</title>

<sect1 id="ideal-desc">
<title>IDEAl Mode</title>

<para>
Click <link linkend="uimodes-survey">here</link> to return to the modes overview.
</para>

<screenshot>
  <mediaobject>
    <imageobject>
      <imagedata fileref="kdevelop-ideal-mode.png" format="PNG"/>
    </imageobject>
    <textobject><phrase>Screenshot</phrase></textobject>
    <caption><para>&kdevelop; IDEAl mode</para></caption>
  </mediaobject>
</screenshot>

<para>
Click <link linkend="uimodes-survey">here</link> to return to the modes overview.
</para>

<screenshot>
  <mediaobject>
    <imageobject>
      <imagedata fileref="kdevelop-ideal-mode-0.png" format="PNG"/>
    </imageobject>
    <textobject><phrase>Screenshot</phrase></textobject>
    <caption><para>&kdevelop; IDEAl mode, closed tabs</para></caption>
  </mediaobject>
</screenshot>

<para>
This example screenshot demonstrates one of the main virtues of IDEAl mode. There is a maximum workspace available. Yet any tool view is readily available by clicking on the according tab.
</para>
<para>
You will most probably need some time to get accustomed to the icons in the tab bar. If you got lost, just position the mouse over a tab and wait a few seconds. A short tool tip description will pop up. In this screenshot the <quote>Automake Manager</quote> tool tip is shown as an example. It describes the lower tab in the right tab bar.
</para>

<para>
Click <link linkend="uimodes-survey">here</link> to return to the modes overview.
</para>

</sect1> <!-- ideal-desc -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="mdi-desc">
<title>Child Frame Windows Mode</title>

<para>
Click <link linkend="uimodes-survey">here</link> to return to the modes overview.
</para>

<screenshot>
  <mediaobject>
    <imageobject>
    <imagedata fileref="kdevelop-mdi-mode.png" format="PNG"/>
    </imageobject>
    <textobject><phrase>Screenshot</phrase></textobject>
    <caption><para>&kdevelop; child frame windows mode</para></caption>
  </mediaobject>
</screenshot>

<para>
Click <link linkend="uimodes-survey">here</link> to return to the modes overview.
</para>

</sect1> <!-- mdi-desc -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="tabbed-desc">
<title>Tabbed Pages Mode</title>

<para>
Click <link linkend="uimodes-survey">here</link> to return to the modes overview.
</para>

<screenshot>
  <mediaobject>
    <imageobject>
      <imagedata fileref="kdevelop-tabbed-mode.png" format="PNG"/>
    </imageobject>
    <textobject><phrase>Screenshot</phrase></textobject>
    <caption><para>&kdevelop; tabbed pages mode</para></caption>
  </mediaobject>
</screenshot>

<para>
Click <link linkend="uimodes-survey">here</link> to return to the modes overview.
</para>

</sect1> <!-- tabbed-desc -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id="toplevel-desc">
<title>Toplevel Windows Mode</title>

<para>
Click <link linkend="uimodes-survey">here</link> to return to the modes overview.
</para>

<screenshot>
  <mediaobject>
    <imageobject>
      <imagedata fileref="kdevelop-toplevel-mode.png" format="PNG"/>
    </imageobject>
    <textobject><phrase>Screenshot</phrase></textobject>
    <caption><para>&kdevelop; toplevel windows mode</para></caption>
  </mediaobject>
</screenshot>

<para>
Click <link linkend="uimodes-survey">here</link> to return to the modes overview.
</para>

</sect1> <!-- toplevel-desc -->

</appendix> <!-- app-uimodes-examples -->

<!-- ====================================================================== -->

<appendix id="app-misc-info">
<title>Further Information</title>
<sect1 id="gettinginformation">
<title>Getting Information</title>
<para>
(... to be written ...)
</para>
</sect1> <!-- gettinginformation -->

<sect1 id="app-reporting-bugs">
<title>Reporting Bugs</title>
<para>
(... to be written ...)
</para>
</sect1> <!-- app-reporting-bugs -->

<sect1 id="app-licensing">
<title>Licensing</title>
&underFDL;
&underGPL;
</sect1> <!-- app-licensing -->
</appendix> <!-- app-misc-info -->

<!-- ====================================================================== -->

<appendix id="app-changelog">
<title>Changes</title>
<sect1 id="changes">
<title>Changes to This Document</title>
<para>
<itemizedlist>
<listitem><para>
2003-01-03 &mdash; Started this Changelog
</para></listitem>
</itemizedlist>
</para>
</sect1> <!-- changes -->
</appendix> <!-- app-changelog -->

<!-- ====================================================================== -->

<!--  Note (bp, 2003-09-04): <bibliography> should remain the last appendix section because of a (meinproc???) bug which sends the Next selection in circles back to it. -->

<appendix id="app-bibliography">
<title>Bibliography</title>

<para>(... to be written ...)</para>

<!-- ### temporarily disabled as the <bibliography> markup is not used by KDE Docbook
     (see: Lauri Watts: The KDE DocBook Authors guide, Revision 1.00.00: 2003,
                        Chapter 19. Tags we do not use) -->
<bibliography>

<biblioentry>
<title><ulink url="info://make/Top">GNU Make Manual</ulink></title>
<authorgroup>
<author><firstname>Richard M.</firstname><surname>Stallman</surname></author>
<author><firstname>Roland</firstname><surname>McGrath</surname></author>
</authorgroup>
</biblioentry>

<biblioentry>
<title><ulink url="info://automake/Top">GNU Automake</ulink></title>
<authorgroup>
<author><firstname>David</firstname><surname>MacKenzie</surname></author>
<author><firstname>Tom</firstname><surname>Tromey</surname></author>
</authorgroup>
</biblioentry>

<biblioentry>
<title><ulink url="info://autoconf/Top">GNU Autoconf</ulink></title>
<authorgroup>
<author><firstname>David</firstname><surname>MacKenzie</surname></author>
<author><firstname>Ben</firstname><surname>Elliston</surname></author>
</authorgroup>
</biblioentry>

<biblioentry>
<title><ulink url="info://gcc/Top">Using the GNU Compiler Collection</ulink></title>
<author><firstname>Richard M.</firstname><surname>Stallman</surname></author>
</biblioentry>

<biblioentry>
<title><ulink url="info://libtool/Top">GNU Libtool</ulink></title>
<authorgroup>
<author><firstname>Gordon</firstname><surname>Matzigkeit</surname></author>
<author><firstname>Alexandre</firstname><surname>Oliva</surname></author>
<author><firstname>Thomas</firstname><surname>Tanner</surname></author>
<author><firstname>Gary V.</firstname><surname>Vaughan</surname></author>
</authorgroup>
</biblioentry>

<biblioentry>
<title>GNU Autoconf, Automake, and Libtool</title>
<edition>1st edition</edition>
<pubdate>October 2000</pubdate>
<authorgroup>
<author><firstname>Gary V.</firstname><surname>Vaughan</surname></author>
<author><firstname>Ben</firstname><surname>Elliston</surname></author>
<author><firstname>Tom</firstname><surname>Tromey</surname></author>
<author><firstname>Ian Lance</firstname><surname>Taylor</surname></author>
</authorgroup>
<publisher><publishername>New Riders Publishing</publishername></publisher>
<isbn>ISBN 1578701902</isbn>
</biblioentry>


<biblioentry>
<title>Advanced Programming in the &UNIX; Environment</title>
<edition>1st edition</edition>
<pubdate>June 1992</pubdate>
<author><firstname>W. Richard</firstname><surname>Stevens</surname></author>
<publisher><publishername>Addison-Wesley Pub Co</publishername></publisher>
<isbn>ISBN 0201563177</isbn>
</biblioentry>

<biblioentry>
<title>Thinking in C++, Volume 1: Introduction to Standard C++</title>
<edition>2nd Edition</edition>
<pubdate>April 15, 2000</pubdate>
<author><firstname>Bruce</firstname><surname>Eckel</surname></author>
<publisher><publishername>Prentice Hall</publishername></publisher>
<isbn>ISBN 0139798099</isbn>
</biblioentry>

<biblioentry>
<title>Open Source Development with CVS</title>
<edition>2nd Edition</edition>
<pubdate>October 12, 2001</pubdate>
<authorgroup>
<author><firstname>Karl</firstname><surname>Fogel</surname></author>
<author><firstname>Moshe</firstname><surname>Bar</surname></author>
</authorgroup>
<publisher><publishername>The Coriolis Group</publishername></publisher>
<isbn>ISBN 158880173X</isbn>
</biblioentry>

<biblioentry>
<title>Programming PHP</title>
<edition>1st edition</edition>
<pubdate>March 2002</pubdate>
<authorgroup>
<author><firstname>Rasmus</firstname><surname>Lerdorf</surname></author>
<author><firstname>Kevin</firstname><surname>Tatroe</surname></author>
</authorgroup>
<publisher><publishername>O'Reilly &amp; Associates</publishername></publisher>
<isbn>ISBN 1565926102</isbn>
</biblioentry>

<biblioentry>
<title>Programming Python</title>
<edition>2nd Edition</edition>
<pubdate>March 2001</pubdate>
<author><firstname>Mark</firstname><surname>Lutz</surname></author>
<publisher><publishername>O'Reilly &amp; Associates</publishername></publisher>
<isbn>ISBN 0596000855</isbn>
</biblioentry>

<biblioentry>
<title>Gui Programming With Python : Using the Qt Toolkit</title>
<edition>Bk&amp;Cd-r edition</edition>
<pubdate>January 2002</pubdate>
<author><firstname>Boudewijn</firstname><surname>Rempt</surname></author>
<publisher><publishername>Opendocs Llc</publishername></publisher>
<isbn>ISBN 0970033044</isbn>
</biblioentry>

<biblioentry>
<title>Programming Perl</title>
<subtitle>The Camel book</subtitle>
<edition>3rd Edition</edition>
<pubdate>July 2000</pubdate>
<authorgroup>
<author><firstname>Larry</firstname><surname>Wall</surname></author>
<author><firstname>Tom</firstname><surname>Christiansen</surname></author>
<author><firstname>Jon</firstname><surname>Orwant</surname></author>
</authorgroup>
<publisher><publishername>O'Reilly &amp; Associates</publishername></publisher>
<isbn>ISBN 0596000278</isbn>
</biblioentry>

<biblioentry>
<title>Learning Perl</title>
<subtitle>The Lama book</subtitle>
<edition>3rd Edition</edition>
<pubdate>July 15, 2001</pubdate>
<authorgroup>
<author><firstname>Randal L.</firstname><surname>Schwartz</surname></author>
<author><firstname>Tom</firstname><surname>Phoenix</surname></author>
</authorgroup>
<publisher><publishername>O'Reilly &amp; Associates</publishername></publisher>
<isbn>ISBN 0596001320</isbn>
</biblioentry>

</bibliography>
<!-- -->

</appendix> <!-- app-bibliography -->

<!-- ====================================================================== -->

&documentation.index;

</book>
