%%
%% Cours ResEl sur les outils Linux
%%
%%
%% Copyright (C) 2005 Association ResEl <gestion@resel.enst-bretagne.fr>
%% Ce document est un document libre ; vous pouvez le redistribuer et/ou
%% le modifier au titre des clauses de la Licence Publique Générale GNU,
%% telle que publiée par la Free Software Foundation ; soit la version 2
%% de la Licence, ou (à votre discrétion) une version ultérieure
%% quelconque. Ce docuement est distribué dans l'espoir qu'il sera utile,
%% mais SANS AUCUNE GARANTIE ; sans même une garantie implicite de
%% COMMERCIABILITE ou DE CONFORMITE A UNE UTILISATION PARTICULIERE. Voir
%% la Licence Publique Générale GNU pour plus de détails. Vous devriez
%% avoir reçu un exemplaire de la Licence Publique Générale GNU avec ce
%% programme ; si ce n'est pas le cas, écrivez à la Free Software
%% Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA
%% 02110-1301, USA.
%%
%% prérequis : installer dvips-fontdate-n2bk et tetex-extra, et enregistrer le fichier en ISO-8859-15
%%
\documentclass[11pt,a4paper]{article}
\setlength{\voffset}{-1.5cm}
\setlength{\hoffset}{-1.5cm}
\setlength{\textwidth}{17cm}	% Largeur de la zone de texte
\setlength{\oddsidemargin}{1cm}	% Marge gauche sur pages impaires
\setlength{\evensidemargin}{1cm}% Marge gauche sur pages paires
\setlength{\marginparwidth}{0.5cm}% Largeur de note dans la marge
\setlength{\textheight}{24cm}	% Hauteur de la zone de texte
\setlength{\topmargin}{0cm}	% Pas de marge en haut
\setlength{\headsep}{0.4cm}	% Entre le haut de page et le texte
\setlength{\headheight}{1cm}	% Haut de page
%\setlength{\footskip}{}
%EXTENSIONS
     	\usepackage[latin1]{inputenc}
	\usepackage[LGR,T1]{fontenc} %une ligne qui fait des erreurs, mais qui améliore un peu l'aspect
	\usepackage[francais]{babel}
 	\usepackage[francais]{layout}
	\usepackage{pifont}     % pour dingline
	\usepackage{wasysym}    % pour les smileys
	\usepackage[dvips]{graphics} %deux paquetages pour insérer des images, ça peut toujours servir (on ne peut qu'insérer des postScript encapsulés
	\usepackage{graphicx}
	\usepackage[cyr]{aeguill} %pour l'encodage des fonts et les guillemets
 	\usepackage{fancybox} 	%pour les hauts et bas de page
 	\usepackage{fancyhdr}	%pareil
	\usepackage{xspace} 	%pour de beaux espaces
	\usepackage{url}	%pour faire du café (ou pour les url, je confond tout le temps)
	\usepackage[official]{eurosym} %bon, idem, je vais pas refaire la même blague


\widowpenalty=10000 % empeche au maximum la coupure avant la derniere ligne
\clubpenalty=10000  % empeche au maximum la coupure apres la premiere ligne
\raggedbottom       % empeche l'etirement des ressorts verticaux


\title{ResEl 101 : Cours sur les outils Linux}
\date{septembre 2005}
\author{Association ResEl}

\begin{document}

\maketitle
\newpage
\tableofcontents

\newpage

\setlength{\parskip}{0.5\baselineskip} %pour l'espacement des paragraphes, ça sert à rien d'espacer les lignes de la table des matières


\section{Introduction}
%expliquer ce qu'est ce poly
Ce cours a pour objectif de décrire les outils de base de Linux, qui
sont très souvent utilisés, mais parfois dificilles à comprendre. Le
chapitres décrivent les fonctionnalités les plus souvent utilisées de
ces outils, d'un point de vue pratique, sans entrer dans le détail de
leur fonctionnement ; le but est triple :
\begin{itemize}
\item donner une vue d'ensemble des possibilités offertes par les
outils en ligne de commande ;
\item une introduction aux outils plus simple que le man ;
\item une utilisation comme un pense-bête auquel on peut souvent faire
référence.
\end{itemize}

\vspace{0.3cm} 
Il est supposé que vous connaissiez déjà les commandes
de base comme \texttt{cd}, \texttt{ls}, \texttt{mkdir}, etc.



\section{Fonctionnalités de base}
\subsection{sudo}

sudo est un outil de gestion des droits : grâce à sudo on peut donner
certains droits à un utilisateur, on peut par exemple lui donner les
droits d'un autre utilisateur (appelé toto). Cet utilisateur n'aura
qu'à taper \texttt{sudo -u toto commande} (\texttt{-u} comme user)
pour exécuter \emph{commande} en tant que toto. L'utilisateur aura
alors à taper \emph{son} mot de passe, et non celui de toto.

L'utilisateur peut même passer \og dans la peau\fg d'un autre
utilisateur (encore toto), en faisant \texttt{sudo su toto}. Il aura
dés cet instant un shell en tant que toto. Pour sortir de ce sudo il
suffit de taper \texttt{exit}.

Lorsqu'on ne fait pas référence à un utilisateur particulier, sudo va
faire comme si c'était les droits superutilisateur qui étaient
demandés. Le célèbre \texttt{sudo su} fait en effet passer en root
ceux qui en ont le droit.

Certaines commandes nécessitant des droits plus hauts que ceux de
l'utilisateur peuvement également être exécutées par lui. Par exemple
on peut paramétrer sudo pour qu'un utilisateur puisse utiliser
\texttt{halt} (commande nécessitant des droits superutilisateur) alors
qu'il n'a pas les droits superutilisateur.

Le paramétrage de sudo peut être fait de façon très fine
(cf. \texttt{man sudoers}), il se fait en éditant le fichier
\texttt{/etc/sudoers} ; dans la distribution Debian, on ne peut pas
éditer ce fichier directement, il faut passer par la commande
\texttt{visudo}. Ce fichier est constitué de lignes de ce type (on ne
s'intéresse qu'aux configurations simples) :

\texttt{uid hosts=(utilisateur) commandes}

\begin{itemize}
\item \texttt{uid} représente le login de l'utilisateur ;
\item \texttt{hosts} les machines à partir de laquelle l'utilisateur
peut utiliser sudo (voir la section sur ssh pour comprendre l'intérêt
de ce paramètre), hosts est en général à ALL ;
\item \texttt{utilisateur} est le nom d'utilisateur duquel
l'utilisateur (celui défini par \texttt{uid}) peut prendre les
droits. Lorsque ce paramètre est à ALL, l'utilisateur (uid) peut
prendre les droits de tous les autres utilisateurs, y compris le
superutilisateur ;
\item \texttt{commandes} est la liste des commandes que l'utilisateur
peut utiliser en prenant les droits d'autres utilisateurs.
\end{itemize}

\newpage

Par exemple un \texttt{/etc/sudoers} contenant la ligne 

\texttt{riri riri.maisel=(fifi) moo}

\texttt{toto ALL=(ALL) ALL}

va permettre :
\begin{itemize}
\item à l'utilisateur riri d'executer la commande \texttt{moo} avec
les droits de fifi, en faisant \texttt{sudo -u fifi moo}, mais
uniquement s'il se connecte depuis la machine riri.maisel ;
\item à toto de faire ce qu'il veut.
\end{itemize}


\subsection{Les archives}

Les archives les plus souvent utilisées sont les archives tar, ce sont
des fichiers qui contiennent plusieurs fichiers, ou même toute une
arborescence de répertoires, le tout non-compressé.

Pour créer l'archive toto.tar contenant le fichier toto.fichier et le
répertoire repertoto, il suffit de taper \texttt{tar cvf toto.tar
toto.fichier repertoto} et pour extraire cette archive \texttt{tar xvf
toto.tar} (c comme create, x comme extract).

Deux niveaux de compression sont ensuite possibles : gzip et bzip2. Le
premier est rapide, le second très performant.

Pour compresser un fichier avec gzip, il suffit de faire \texttt{gzip
lefichier}, on obtient alors \texttt{lefichier.gz}, que l'on peut
décompresser avec un \texttt{gunzip lefichier.gz}.

bzip2 fonctionne de la même façon : \texttt{bzip2 lefichier} pour
obtenir \texttt{lefichier.bz2}, et \texttt{bunzip2 lefichier.bz2} pour
le décompresser.

Ces outils peuvent être combinés pour faire des archives compressées
directement :

\texttt{tar czf toto.tgz toto.fichier repertoto} créé directement le
.tar compressé, \texttt{.tar.gz} est souvent \og abrégé\fg en
\texttt{.tgz}. Il suffit de remplacer le c par le x dans les options
de tar pour le décompresser.

\texttt{tar xjf toto.tar.bz2 toto.fichier repertoto} fait la même
chose avec bzip2 (une fois encore le x sert à décompresser).

\subsection{grep}

\texttt{grep} est une commande extrêmement utile, beaucoup plus que ce
que l'on pourrait croire au premier abord, vous serez très souvent
amené à l'utiliser, c'est pourquoi elle apparaît dans ce poly.

La fonction de cette commande est de chercher un mot dans un ou
plusieurs fichiers.

L'utilisation de base est \texttt{grep chaîne fichier}, où chaîne est
la chaîne recherchée et fichier le fichier (texte) dans lequel on veut
la chercher. \texttt{grep} renvoie alors la ou les lignes de
\texttt{fichier} contenant \emph{chaîne}.

On peut également rechercher une chaîne dans plusieurs fichiers, et
même dans les dossiers, récursivement :

\texttt{grep -R chaîne *} 

va renvoyer toutes les lignes contenant \emph{chaîne} dans tous les
fichiers et tous les sous-répertoires, en affichant les noms des
fichiers dans lesquels la chaîne a été trouvée).

À l'inverse, si on ne veut voir aucune ligne contenant la chaîne
donnée, on utilise \texttt{grep} avec le commutateur \texttt{-v} :
\texttt{grep -v chaîne *}.

Mais l'utilisation la plus courante de \texttt{grep} est celle
consistant à rediriger la sortie d'une commande vers grep pour n'avoir
que les résultats intéressants. Par exemple si on veut avoir la liste
des \texttt{.tex} dans un répertoire, il suffit de faire \texttt{ls |
grep .tex}. En effet grep ne va séléctionner que les lignes contenant
la chaîne \emph{.tex} dans la sortie de \texttt{ls}.

\subsection{ssh}

\texttt{ssh} (Secured SHell) est un outil magique qui permet de se
connecter sur une machine distante. Il faut pour cela que la machine
distante aie un sshd installé (disponible uniquement sur les systèmes
GNU). Cet outil permet d'avoir un shell sur une machine sur laquelle
on a un compte. La commande de base est la suivante :

\texttt{ssh toto@titi.maisel.enst-bretagne.fr}

\texttt{titi.maisel.enst-bretagne.fr} est ici le nom de la machine sur
laquelle on veut se connecter, et \texttt{toto} le login d'un
utilisateur qui a un compte sur la machine. Le mot de passe de
\texttt{toto} est alors demandé. On obtient alors un prompt comme si
on était sur la machine \texttt{titi}, en ligne de commande.

Il est également possible de lancer des programmes en mode graphique :
la sortie graphique des programmes que l'on lancera sera redirigée
vers la sortie graphique de la machine sur laquelle on est. Il faut
pour cela activer l'option \texttt{-X} dans ssh, ce qui donnera une
ligne comme \texttt{ssh -X toto@titi.maisel.enst-bretagne.fr}.

Pour terminer une connexion ssh, il suffit de taper \texttt{exit}.

\subsection{scp}

Pour faire des transferts de fichiers d'une machine à une autre
simplement, ce n'est en général pas simple (installer un serveur ftp
n'est pas immédiat), surtout lorsque ces fichiers sont
critiques. Heureusement la commande scp est là ! Cette commande permet
le transfert de fichiers entre des machines sur lesquelles vous avez
un compte.

Son utilisation de base est très simple :

\texttt{scp fichier1 fichier2 fichier3
toto@titi.maisel.enst-bretagne.fr\url{:}repertoire}

va copier les fichiers \texttt{fichier1}, \texttt{fichier2} et
\texttt{fichier3}, sur la machine titi dans le répertoire
\texttt{repertoire}.

\texttt{repertoire} peut être soit : 
\begin{itemize}
\item le chemin absolu d'un répertoire, par exemple
\texttt{/usr/src/linux} ;
\item $\sim$ , ce qui mènera vers le répertoire de l'utilisateur, ici
\texttt{/home/toto} ;
\item le chemin relatif d'un répertoire, par exemple
\texttt{public\_html}, qui mènera vers
\texttt{/home/toto/public\_html}.
\end{itemize}

\section{Installation et compilation}
\subsection{L'outil apt}

L'installation en ligne de commande se fait très simplement grâce à
l'outil \texttt{apt} : en effet, il permet de rechercher, d'avoir la
description et d'installer les paquets.

Pour rechercher un paquet à partir d'un mot clé, il suffit de faire
\texttt{apt-cache search monpaquet} où \emph{monpaquet} est une partie
du nom du paquet recherché ou un mot clé le caractérisant.

Lorsque l'on n'est pas certain du paquet que l'on veut installer, on
peut avoir la description d'un paquet grâce à la commande
\texttt{apt-cache show monpaquet}.

Pour installer un paquet, il faut utiliser \texttt{apt-get install
monpaquet}, où \emph{monpaquet} est le nom exact du paquet que l'on
veut installer.

Les mises à jour du système se font en deux étapes : \texttt{apt-get
update} met à jour la base de données, et \texttt{apt-get upgrade} met
à jour les paquets dont la version est plus ancienne que leur entrée
dans la base de données.

Il est important de configurer les sources sur lesquelles \texttt{apt}
va chercher les paquets, afin de ne pas trop prendre de bande passante
inutilement sur le net, il faut pour cela modifier le fichier
\texttt{/etc/apt/sources.list} (c'est le même fichier que pour
configurer les sources de synaptics). La page
\url{http://miroir.maisel.enst-bretagne.fr/Bienvenue.php} explique
comment bien faire ces changements.


\subsection{Compilation à partir des sources}

La compilation à partir des sources est quelquechose à savoir faire
car c'est très souvent utile, et ce n'est pas aussi monstrueux que ça
en a l'air.

Les sources d'un paquetage se présentent souvent sous la forme d'un
fichier \texttt{.tar.gz}. On peut trouver ce fichier sur Internet ou
on peut l'obtenir par la commande \texttt{apt-get source monpaquet},
qui va télécharger les sources du paquet actuel de la distribution
sous laquelle vous êtes. La plupart du temps, les sources obtenues
avec apt contiennent les sources du paquet standard plus un patch
spécifique à la distrib, qu'il faut appliquer. %cf une hypothétique
partie sur les patch et les diff

Un problème de la compilation est la gestion des dépendances. En effet
pour être compilés, certains paquetages nécessitent les sources de
certaines librairies, et nécessitent également d'autres paquetages
pour fonctionner. Les dépendances peuvent être résolues
automatiquement par apt, grâce à la commande \texttt{apt-get buid-dep
monpaquet}.

La première étape pour compiler est de se rendre dans le repertoire et
de taper \texttt{./configure}. Cela appelle un script qui vérifie si
le paquet peut compiler, si les dépendances son bonnes, etc. Ce script
peut avoir plusieurs options qui dépendent des paquets, mais la plus
importante est l'option \texttt{--prefix}, puisqu'elle permet de
paramétrer dans quel répertoire le fichier exécutable va être mis. Il
faut le mettre dans \texttt{/usr/bin} la plupart du temps, il faut
donc taper \texttt{./configure --prefix=/usr} pour configurer un
paquet correctement (le \texttt{/bin} est ajouté automatiquement).

Une fois que \texttt{./configure} ne rapporte plus d'erreur, on peut
passer à l'étape de compilation proprement dite en tapant simplement
\texttt{make}.

La troisième étape doit se faire avec les droits superutilisateur (les
deux autres non) : \texttt{sudo make install} va mettre les
exécutables dans les bons répertoires et va finir l'installation.

\newpage

\section{Appendice A : tutoriel d'introduction à Vim}

\subsection{Présentation}

Cette partie est une Introduction à Vim (Vi iMproved, le successeur de
Vi), un éditeur de texte utilisable en mode graphique, mais surtout
très simple à utiliser en mode texte, ce qui en fait un bon outil pour
l'édition de fichiers sur des serveurs distants, lorsque ceux-ci n'ont
pas de serveurs graphiques.

Cette introduction présente les fonctionalités de Vim les plus
utilisées, dans l'ordre croissant de difficulté.

\subsection{Les commandes de base}

\subsubsection{Ouvrir et créer un fichier}
Commençons donc par le commencement : comment ouvrir un fichier ?

Eh bien c'est très simple, il suffit de taper dans son shell préféré
\texttt{vim fichier} où \emph{fichier} est un nom de fichier.

Sur les distributions Linux récentes, Vi est remplacé par Vim, ce qui
fait que lorsque l'on tape \texttt{vi}, c'est en fait Vim qui se lance
(c'est un alias). On tape donc la plupart du temps \texttt{vi
fichier}, mais il reste des dinosaures sur lesquels ce n'est pas le
cas, méfiance donc.

Si vous voulez créer un fichier c'est exactement pareil : \texttt{vi
toto} (ou \texttt{vim toto} sur les vieux OS) vous ouvrira un fichier
vide et dès que vous l'enregistrerez il s'appellera \texttt{toto}.

\subsubsection{Les différents modes de Vim}

Maintenant que vous avez ouvert un fichier, vous avez certainement
remarqué que lorsque vous tapez sur les lettre de votre clavier, cela
donne des résultats étranges ou même des "biiip".  Cela est dû au fait
que Vim peut tourner sous plusieurs modes, et vous êtes dans le mode
pour entrer des commandes, nous allons donc arranger cela.

Vim possède en fait (pour simplifier) trois modes : le mode
\emph{insertion}, qui permet d'insérer des caractères dans un texte
(le mode "normal" si on veut), le mode \emph{remplacement}, qui fait
sensiblement la même chose mais en remplaçant les caractères, et enfin
le mode \emph{commande} qui permet d'effectuer toutes les commandes.

Pour passer au mode \emph{commande} il suffit d'appuyer sur
\texttt{Echap}. La touche \texttt{Inser} permet de passer au mode 
\emph{insertion} depuis le mode \texttt{commande}, puis de switcher
entre le mode \emph{insertion} et le mode \emph{remplacement}. Pour
taper du texte quand vous venez d'arriver dans Vim il faut donc
appuyer sur \texttt{Inser}.

\subsubsection{Quitter et enregistrer} 

Vous savez désormais taper du texte, mais il va falloir l'enregistrer,
quitter, etc. Pour cela il faut être en mode \emph{commande} et taper
une de ces commandes (il y a presque toujours des \texttt{:} avant les
commandes, il ne faut pas les oublier)
\begin{itemize}
\item \texttt{:q} pour quitter ;
\item \texttt{:w} pour enregistrer (vous pouvez enregistrer dans un
autre fichier en tapant \texttt{:w le nom du fichier} ;
\item \texttt{:x} (ou \texttt{:wq})
pour les deux à la fois.
\end{itemize}


Lorsque vous voulez quitter sans enregistrer (vous ne pouvez pas par
défaut si vous avez fait des modifications), il faut forcer la sortie,
pour cela rajoutez un \texttt{!} à la fin de votre commande : (pour
forcer la sortie par exemple faites \texttt{:q!}, \texttt{:w!} sert
également souvent).

\subsubsection{La coloration syntaxique} 

La coloration syntaxique est un outil extrêmement pratique puisqu'il
permet de se repérer très vite dans un code, de quel type qu'il soit
(Vim reconnaît plus d'une centaine de syntaxes). Vous verrez que très
rapidement vous ne pourrez plus vous en passer !

La commande pour ce truc magique est \texttt{:syn on} (\emph{syn} ou
\emph{syntax}). Si vraiment enfin vous avez mal au crâne avec toutes
ces couleurs, un petit \texttt{:syn off} et tout redevient gris.

Une commande qui peut parfois servir sur les portables (ou quand les
gens qui ont des portables mettent ça par défaut et qu'il faut
l'enlever) : pour régler la luminosité (ou plutôt l'épaisseur) du
texte, il suffit de taper \texttt{:set bg=dark} (ou \texttt{:set
bg=light} pour l'autre sens).


\subsection{Les copier-coller}

\subsubsection{Le mode visuel}

Pour faire des copier-coller, une première étape est de pouvoir
séléctionner un morceau de texte. Pour cela vous avez deux modes
visuels : le mode \emph{visual} et le mode
\emph{visual\_line}. Vous pouvez y accéder en mode
\emph{command} en appuyant simplement sur
\texttt{v} pour le mode \emph{visual} et sur
\texttt{V} pour le mode
\emph{visual\_line}. Une fois dans un de ces modes vous
pouvez déplacer le curseur pour sélectionner des caractère ou des
lignes.

Pour sortir de ce mode appuyez simplement sur
\texttt{Echap}. 


\subsubsection{Copier-coller} 

Pour copier ce que vous avez sélectionné il suffit de taper sur
\texttt{y}, pour couper \texttt{d} et pour coller \texttt{p}
(\texttt{P}~pour coller avant le curseur).

Notez que vous pouvez directement copier (ou couper) une ligne sans la
sélectionner en appyant deux fois sur \texttt{y} (ou \texttt{d}).

Enfin, quelque chose de très pratique est le copier-coller à la souris
: sélectionnez quelque chose avec votre souris (enfin sous linux
hein\ldots ), ça copie, puis sous Vim mettez-vous en mode
\emph{insertion}, placez le curseur là où vous voulez insérer ce que
vous avez copié et faites un coller avec votre souris (bouton du
milieu, ou bouton droite + bouton gauche).

Par contre cette méthode fait souvent n'importe quoi au niveau de
l'indentation. Pour régler ce problème regardez la partie sur
l'indentation.


\subsubsection{Gérer plusieurs fichiers}

Bon, tout ça c'est bien beau, mais comment on fait pour faire des
copier-coller d'un fichier à l'autre ? Parce que ça n'a pas l'air
super pratique ce mode texte là...

Eh bien là encore tout est prévu : vous pouvez ouvrir plusieurs
fichiers dans le même écran, en séparant votre écran en 2 (ou plus),
il suffit pour cela de taper \texttt{:sp fichier} (\emph{sp} ou
\emph{split}) où \emph{fichier} est le chemin relatif du fichier que
vous voulez ouvrir par rapport au répertoire courant. Par exemple si
vous voulez ouvrir un autre fichier qui est dans le même répertoire,
donnez juste le nom du fichier, pour un fichier qui est dans le
répertoire père, tapez \texttt{:sp ../fichier}, etc.

Pour ceux qui ne se rappellent plus bien quel fichier ils veulent
ouvrir, un \texttt{:E} ouvre un petit menu ou vous pouvez vous balader
dans les répertoires pour rechercher le fichier à  ouvrir (très
pratique).

Pour passer d'un fichier à l'autre, faites (en mode \emph{commande},
est-il besoin de le préciser ?) un \texttt{C-w} puis une direction
(haut ou bas), et vous allez éditer le fichier situé dans cette
direction sur votre écran. Vous pourrez traiter ce fichier totalement
indépendemment de l'autre (si vous faites un \texttt{:q} seul celui
sur lequel vous êtes sera fermé, etc.).


\subsection{Quelques astuces très pratiques}

\subsubsection{Le fichier \texttt{.vimrc}} 

Si vous voulez sauvegarder votre configuration de Vim (par exemple
pour mettre la coloration syntaxique par défaut). Ce fichier est
contenu dans le dossier home de chaque utilisateur (donc la
configuration peut être différente en fonction de l'utilisateur), mais
il n'est pas forcément présent. Dans ce fichier vous pouvez mettre
tout ce que vous taperiez dans Vim : par exemple pour mettre la
coloration syntaxique par défaut, vous pouvez faire un fichier
\texttt{.vimrc} contenant la ligne

\texttt{:syn enable}


\subsubsection{Recherche et substitution}

Pour rechercher une chaîne dans un texte rien de plus simple il suffit
de taper \texttt{/chaîne} où \emph{chaîne} est la chaîne que vous
voulez rechercher dans le texte. Pour aller au résultat suivant,
faites \texttt{n} (comme \emph{next}) et le résultat précédent
\texttt{N}.

Pour substituer une chaîne par une autre, il y a énormément de
possibilités qui ne seront pas détaillées ici, mais voici tout de même
la méthode pour remplacer une chaîne par une autre : pour le faire
dans tout le document faites \texttt{:\%s/chaîne1/chaîne2/g} ; si vous
enlevez le \texttt{g} de la fin, vous ne substituerez que la première
occurence de chaque ligne de la \emph{chaîne1} par la \emph{chaîne2}.

Faites attention aux caractères d'échappement : faites un \texttt{\/}
plutôt qu'un \texttt{/} (qui serait interprété) dans vos chaînes. Et
il fait faire la distinction entre vos chaînes qui commencent par
\texttt{/} et celles qui ne commencent pas par \texttt{/} (en xhtml
par exemple).

Pour plus d'infos sur les énormes possibilités de Vim, vous pouvez
regarder l'URL documentant les regexp Vim indiquée dans la section
Url.

Enfin quelque chose d'extrêmement pratique pour le debug de programme
est d'aller directement à une ligne. Pour cela il suffit de taper
\texttt{:x} où \emph{x} est le numéro de la ligne à laquelle vous
voulez aller.



\subsubsection{Undo - redo}

S'il y a bien quelque chose de pratique c'est d'annuler la boulette
que l'on vient de faire. C'est très simple : il vous suffit de faire
\texttt{u} (comme \emph{undo}) pour annuler (on peut remonter assez
loin tant qu'on n'a pas fermé le fichier). Pour annuler son annulation
la commande est \texttt{C-r}.

Une fonction pratique également est celle consistant à répéter la
dernière action, pour cela faites \texttt{.} et le tour est joué.

Pour rappeler une commande que vous avez tapé, il vous suffit de taper
\texttt{:} puis de naviguer avec la flèche du haut et celle du bas
entre les commandes, comme dans un shell.


\subsubsection{L'aide}

Dans Vim pour connaître toutes les options et possibilités d'une
commande rien de plus simple tapez \texttt{:h commande} (\emph{h} ou
\emph{help}) où \emph{commande} est la commande sur laquelle vous
voulez vous documenter.


\subsection{Aller plus loin}

\subsubsection{Les formats de fichier} 

Il y a plusieurs types de formats de fichier texte, surtout dépendant
des OS (c'est pour ça que par exemple dans notepad vous voyez tout un
fichier qui ne fait qu'une seule ligne quand il vient de Linux). Et
c'est pas super la classe d'avoir un script en format Windows sur un
serveur Linux. Vim peut convertir des fichiers d'un type à l'autre,
simplement en tapant \texttt{:set ff=truc}, où \emph{truc} est
\emph{dos}, \emph{unix} ou \emph{mac}. Vim ouvre automatiquement les
fichiers avec le bon type.

\subsubsection{Éxecuter des commandes}

Pour éxecuter des commandes shell il suffit la plupart du temps de
faire \texttt{:!commande} où \emph{commande} est ce que vous auriez
tapé dans un terminal. Une fois la commande terminée, vous pourrez
appuyer sur entrée pour revenir à Vim.

Pour avoir carrément un shell vous pouvez taper \texttt{:sh}. Pour
revenir à Vim, faites un \texttt{C-d}.


\subsubsection{L'encodage des caractères}

Vim peut ouvrir et encoder des fichiers dans plusieurs charsets. Pour
changer il suffit de taper \texttt{:set~encoding=truc} où \emph{truc}
peut être \emph{utf8} ou \emph{latin1} couramment.


Pour afficher correctement un fichier encodé dans un charset qui ne
convient pas (par exemple si vous voyez des choses bizarres du style
\emph{Ä©} ), il faut redéfinir l'encodage d'affichage en faisant un
\texttt{:set~termencoding=truc} avec les mêmes possibilités qu'avant.

\subsubsection{La taille des lignes} 
Quelque chose d'assez énervant dans Vim est de devoir parcourir
caractère par caractère une longue ligne pour arriver à un endroit
précis, et l'autre problème est que quand vous envoyez ça par mail qui
doivent être formatés à 80 caractères par ligne.

Le mieux est alors de formater le text bien en tapant \texttt{gqgq}
(sans les \texttt{:} habituels, donc vous ne verrez pas \texttt{gqgq}
à l'écran, mais ça marche quand même) lorsque vous avez sélectionné du
texte.

Vous pouvez également dire à Vim de formater automatiquement les
lignes à 80 (ou 72 par exemple) caractères en tapant
\texttt{:set~textwidth=80} en début d'édition. Vous pouvez aussi
pourquoi pas le mettre dans votre \texttt{.vimrc} .

\subsubsection{Les problèmes d'indentation}

Lorsque vous faites un copier-coller à la souris il est fort probable
que l'indentation soit foireuse. Pour supprimer ce problème, faites un
\texttt{:set noautoindent} avant de copier avec la souris, et un
\texttt{:set autoindent} après (pour retrouver l'autoindentation, qui
est tout de même pratique).

L'autre solution, moins élégante consiste à sélectionner les lignes en
mode visuel et à taper \texttt{=}, cela supprimera complètement
l'indentation. Pour faire ça sur tout le fichier faites \texttt{gg=G}
(les \texttt{g} et \texttt{G} sont pour la sélection, leur
fonctionnement n'est pas détaillé ici).


\subsection{URL intéressantes}
\begin{itemize}
\item \url{http://www.geocities.com/volontir/}pour les regexp sous Vim
;

\item \url{http://vimdoc.sourceforge.net/htmldoc/mbyte.html} : la
documentation de Vim (ce que vous avez en tapant \texttt{:h}) ;

\item \url{http://www.vi-improved.org/tutorial.php} pour apprendre à
Socrate à utiliser Vim : tutoriel simple mais complet, en anglais ;

\item \url{http://tnerual.eriogerg.free.fr/vimqrc-fr.pdf} : un tableau
des commandes de Vim, très utile ;

\item \url{http://en.wikipedia.org/wiki/Editor\_war} : une comparaison
objective de Vim et Emacs.
\end{itemize}

\newpage

\section{Appendice B : tutoriel d'introduction à Screen}
\subsection{Présentation de Screen}

Screen est un outil magique pour tout le monde et encore plus pour le
travail en commun, sur des serveurs par exemple. Il permet de lancer
des consoles (avec des commandes actives dedans) sur une machine, de
les laisser sur la machine et de pouvoir les récupérer plus tard, même
à distance. Plusieurs personnes peuvent également être sur une même
console en screen, ce qui est pratique pour faire des démonstrations
sur des serveurs distants par exemple. Bref, l'essayer c'est
l'adopter.


\subsection{Les sessions}

Lorsque l'on utilise screen, on utilise en premier des
sessions. Une session, pour l'instant est une console. Cette console
est similaire à une console ordinaire, et peut être détachée, c'est à
dire "laissée" sur la machine, pour être récupérée plus tard.

Pour lancer une session de screen, rien de plus simple : tapez
simplement \texttt{screen} dans votre shell préféré. La seule chose à
vérifier est l'utilisateur avec lequel vous lancez le screen : en
effet une session screen root ne pourra pas être récupérée par des
utilisateurs non-root (et attention, le sudo pose des problèmes dans
ce cas).

Une fois que vous êtes dans cette session, vous aurez l'impresssion
d'être dans une console tout à fait normale. Pour la détacher, faites
simplement \texttt{C-a} \texttt{C-d}. Votre session est détachée, vous
pourrez la récupérer plus tard.

Vous verrez que \texttt{C-a} est la combinaison de touche pour
dialoguer avec le screen.

Pour récupérer une session, il suffit de faire \texttt{screen -r}, et
le tour est joué (en faisant bien attention à l'utilisateur).

Dans le cas où plusieurs personnes veulent accéder à la même session,
il faut pouvoir entrer dans une session qui n'est pas détachée, pour
cela les utilisateurs devront taper \texttt{screen -x} au lieu de
\texttt{screen -r}. Ce fonctionnement peut être détourné pour faire
office de messagerie instantanée entre des personnes sur une même
machine ;)



\subsection{Avoir plusieurs sessions}

Le problème lorsque vous utilisez \texttt{screen -r} est quand vous
voulez faire plusieurs sessions, en effet, avec seulement
\texttt{screen -r}, on ne peut pas décider quelle session reprendre
lorsqu'on en a plusieurs. Pour cela vous avez \texttt{screen -ls}, qui
liste les sessions actives, dans un ordre qui semble être l'ordre
chronologique de leur création (vous obtenez le même résultat avec un
\texttt{screen -r} lorsque vous avez plusieurs sessions). Dans cette
liste vous pouvez voir le pid des sessions de screen. Pour revenir à
une session particulière il faut faire \texttt{screen -r x}, où
\emph{x} est le pid de la session en question.

Une autre solution infiniment plus élégante consiste à donner un nom à
une session, pour cela lorsque vous la lancez faites \texttt{screen -S
nom}, où \emph{nom} sera le nom de la session. Pour la récupérer
faites simplement \texttt{screen -r nom}.



\subsection{À l'intérieur d'une session}

Il a été dit au début qu'une session était une console, mais en fait
une session de screen peut contenir jusqu'à 10 fenêtres ! À
l'intérieur d'une session, pour créer une fenêtre il suffit de faire
\texttt{C-a} \texttt{C-c} (\emph{c} comme \emph{create}). La
navigation entre les fenêtres peut se faire grâce à \texttt{C-a n}
(comme \emph{next}) et \texttt{C-a p} (comme \emph{previous}) ; ou
plus simplement \texttt{C-a "} pour avoir une liste des fenêtres et de
leur action et choisir. La multiplicité des fenêtres est plus souvent
utilisée que celle des sessions, étant plus simple.

Pour avoir une liste complète des nombreuses commandes possibles pour
les fenêtres, regardez la section \emph{DEFAULT KEY BINDINGS} du
manuel de screen (\texttt{man screen}).

Dernière astuce : l'option \texttt{-U} qui permet d'avoir un screen en
UTF-8.

\end{document}
