diff --git a/Tutoriel.org b/Tutoriel.org index 088b7e5ecc864218509aaee98f6d02e0b28e8ad3..ce2801bf25f2043001af778f7b55de71015c0287 100644 --- a/Tutoriel.org +++ b/Tutoriel.org @@ -1,6 +1,9 @@ #+STARTUP: org-pretty-entities entitiespretty #+PROPERTY: header-args :comments yes :results silent -#+options: h:3 num:t toc:3 +#+OPTIONS: h:3 num:t toc:3 +#+TITLE:Un court tutoriel pour Emacs +#+OPTIONS: author:nil date:nil +#+LATEX_HEADER: \usepackage[hmargin=2.5cm,vmargin=1.5cm]{geometry} #+LATEX_HEADER_EXTRA: \usepackage{mdframed} #+LATEX_HEADER_EXTRA: \BeforeBeginEnvironment{minted}{\begin{mdframed}} @@ -43,9 +46,10 @@ Emacs sans utiliser la configuration locale. * Prise en main La prise en main d'Emacs n'est pas difficile pour une utilisation -basic. En mode graphique Emacs dispose de menus qui permettent les -opérations classiques. Néanmoins, pour l'utiliser plus efficacement, -il convient de comprendre un peu son fonctionnement. +basique. En mode graphique Emacs dispose de menus qui permettent +d'accéder à toutes les opérations classiques. Néanmoins, pour +l'utiliser plus efficacement, il convient de comprendre un peu son +fonctionnement. Comme on l'a dit, Emacs a vu le jour comme un ensemble de *macros*, c'est-à-dire des enchaînements de commandes simples ou d'autres @@ -91,7 +95,7 @@ fenêtres et il peut être modifié dans n'importe laquelle de ses vues. *** <<sec:frames>> Cadre (/frames/) Lorsqu'il est exécuté en mode graphique, un même instance d'Emacs peut -proposer plusieurs /frames/ (cadres). Il s'agit en fait de +proposer plusieurs cadres (/frames/). Il s'agit en fait de plusieurs fenêtres du gestionnaire graphique. Dans l'exemple de la figure [[fig:deux-frames]], il s'agit bien de la même @@ -117,16 +121,16 @@ enfin, on travaille sur la branche ~develop~. #+NAME: fig:emacs-modeline [[file:emacs-modeline.png]] -*** /mini-buffer/ -Le /mini-buffer/ est un /buffer/ spécial d'Emacs. C'est la zone +*** /Minibuffer/ +Le /minibuffer/ est un /buffer/ spécial d'Emacs. C'est la zone d'interaction avec l'utilisateur. C'est là qu'on doit répondre aux éventuelles questions d'Emacs et c'est là qu'on tape les commandes. Il faut donc le garder constamment à l'oeil. Voir la figure [[fig:emacs-minibuffer]] (ici une exécution de ~grep~ dans Emacs en -préparation). Pour exécuter une commande dans le /mini-buffer/ il faut +préparation). Pour exécuter une commande dans le /minibuffer/ il faut taper ~M-x~. -#+CAPTION: Le /mini-buffer/ en action. Préparation de l'exécution d'une commande ~grep~ dans Emacs. +#+CAPTION: Le /minibuffer/ en action. Préparation de l'exécution d'une commande ~grep~ dans Emacs. #+NAME: fig:emacs-minibuffer [[file:emacs-minibuffer.png]] @@ -167,9 +171,9 @@ On ne liste ici que quelques unes des commandes (et raccourcis), seulement une liste de celles qu'on juge importantes. Noter que cette configuration utilise le mode ~which-key~, dont l'une -des fonctionnalités est de fournir une aide dans le /mini-buffer/ lors +des fonctionnalités est de fournir une aide dans le /minibuffer/ lors de la saisie de commandes. Par exemple, si on tape ~C-x~, au bout d'un -instant ~which-key~ affiche dans le /mini-buffer/ la liste des +instant ~which-key~ affiche dans le /minibuffer/ la liste des commandes qui commencent par ~C-x~. C'est donc un excellent moyens de retrouver les raccourcis et d'en apprendre de nouveaux. Cette aide est évidemment contextuelle. @@ -180,47 +184,130 @@ retrouver les raccourcis et d'en apprendre de nouveaux. Cette aide est | ~C-x C-c~ | Sort d'Emacs | | ~C-g~ | Interrompt la commande en cours | | ~C-S-g~ | Force l'interruption de la commande | -| ~M-x~ | Lance une commande (dans le /mini-buffer/) | -| ~C-_~ ou ~C-/~ ou ~C-x u~ | Annule la dernière saisie/commande | +| ~M-x~ | Lance une commande (dans le /minibuffer/) | + +** /minibuffer/ +Lors d'une interaction avec le /minibuffer/, on a accès à certains +raccourcis qui facilitent son utilisation. +| Raccourci | Description | +|---------------+--------------------------------------------------| +| ~M-x~ | Lance une interaction dans le /minibuffer/ | +| ~C-x ESC ESC~ | Édite la dernière commande dans le /minibuffer/ | +| ~TAB~ | Complète l'entrée autant que possible | +Cette configuration utilise ~swiper~, donc toutes les interactions +effectuées dans le /minibuffer/ proposent la liste des commandes +disponibles qui correspondent à la chaîne entrée (~SPC~ faisant office +de n'importe quelle liste de caractères). Il est alors possible de +naviguer dans cette liste (en utilisant les flèches du clavier pas +exemple) ** Obtenir de l'aide On peut lancer l'aide en tapant ~C-h~ et en suivant les indications du -/mini-buffer/. - +/minibuffer/. | Raccourci | Description | |-----------+------------------------------------------------| | ~C-h t~ | Lance le tutoriel intégré | | ~C-h m~ | Informations sur le mode courant | -| ~C-h a~ | *à propos* (interaction dans le /mini-buffer/) | +| ~C-h a~ | *à propos* (interaction dans le /minibuffer/) | ** Naviguer dans un /buffer/ Au delà des flèches et autres touches usuelles du clavier, Emacs propose d'autres moyens de se déplacer dans un /buffer/. - -| Raccourci | Description | -|-----------+------------------------------------| -| ~C-b~ | Recule d'un caractère | -| ~C-f~ | Avance d'un caractère | -|-----------+------------------------------------| -| ~M-b~ | Recule d'un mot | -| ~M-f~ | Avance d'un mot | -|-----------+------------------------------------| -| ~C-p~ | Ligne précédente | -| ~C-n~ | Ligne suivante | -|-----------+------------------------------------| -| ~C-a~ | Début de ligne | -| ~C-e~ | Fin de ligne | -|-----------+------------------------------------| -| ~M-a~ | Début de la phrase | -| ~M-e~ | Fin de la phrase | -| ~M-m~ | Début de l'indentation | -|-----------+------------------------------------| -| ~M-g g~ | Aller à la ligne d'un numéro donné | +| Raccourci | Description | +|------------------+--------------------------------------------------| +| ~C-b~ | Recule d'un caractère | +| ~C-f~ | Avance d'un caractère | +|------------------+--------------------------------------------------| +| ~M-b~ | Recule d'un mot | +| ~M-f~ | Avance d'un mot | +|------------------+--------------------------------------------------| +| ~C-p~ | Ligne précédente | +| ~C-n~ | Ligne suivante | +|------------------+--------------------------------------------------| +| ~C-a~ | Début de ligne | +| ~C-e~ | Fin de ligne | +|------------------+--------------------------------------------------| +| ~M-a~ | Début de la phrase | +| ~M-e~ | Fin de la phrase | +| ~M-m~ | Début de l'indentation | +|------------------+--------------------------------------------------| +| ~M-g g~ /numéro/ | Positionne le curseur à la ligne numéro /numéro/ | +| | | Noter qu'on peut généralement utiliser des combinaisons de ~Ctrl~, ~Meta~,... avec les touches de déplacement du clavier (comme les flèches). +** Marquer une zone d'un /buffer/ +Une zone est délimitée par une une *marque* (position de départ) et la +position courante du curseur Créer une zone consiste donc à poser une +*marque*, puis à déplacer le curseur pour la délimiter. Tous les +caractères compris entre ces deux positions font partie de la zone. +| Raccourci | Description | +|------------------+------------------------------------------| +| ~C-SPC~ ou ~C-@~ | Pose une *marque* | +| ~C-g~ | Supprime la *marque* | +| ~C-x C-x~ | Inverse la *marque* et le curseur | +| ~C-=~ | Sélectionne un mot ou étend la sélection | +Noter qu'un enchaînement de ~C-=~ permet d'étendre rapidement la zone +aux entités faisant sens. En effet, ~C-=~ s'arrête aux guillemets +encadrant une chaîne de caractères, aux paramètres ou au corps d'une +fonction par exemple, ce qui permet de facilement les sélectionner. + +** Éditer le contenu d'un /buffer/ +Le commandes citées ici concernent essentiellement les *modes* +d'édition classiques. Il est possible que pour certains modes les +raccourcis ne fonctionnent pas ou n'aient simplement pas de sens. +Dans ces modes d'édition (modes de saisie par exemple), le clavier +fonctionne normalement. On précise simplement ici quelques commandes +usuelles. + +L'action des commandes d'édition décrites ci-dessous est effectuée +relativement à la position courante du curseur. +| Raccourci | Description | +|---------------------------+---------------------------------------| +| ~DEL~ | *Efface* un caractère vers la gauche | +| ~C-d~ ou ~SUPR~ | *Efface* le caractère sous le curseur | +|---------------------------+---------------------------------------| +| ~DEL~ ou ~SUPR~ | *Efface* une zone sélectionnée | +|---------------------------+---------------------------------------| +| ~C-DEL~, ~M-DEL~ ou ~C-w~ | *Coupe* le mot vers la gauche | +| ~M-d~ | *Coupe* le mot vers la droite | +|---------------------------+---------------------------------------| +| ~M-0 C-k~ | *Coupe* jusqu'au début de la ligne | +| ~C-k~ | *Coupe* jusqu'à la fin de la ligne | +|---------------------------+---------------------------------------| +| ~C-w~ | *Coupe* une zone sélectionnée | +| ~M-w~ | *Copie* une zone sélectionnée | +| ~M-z~ /caractère/ | *Coupe* jusqu'au /caractère/ | +|---------------------------+---------------------------------------| +| ~C-_~ ou ~C-/~ ou ~C-x u~ | Annule la dernière saisie/commande | +Noter que pour cette configuration d'Emacs, si le caractère à effacer +est un caractère blanc, tous les blancs suivants dans la direction +d'effacement sont supprimés. + +Puisqu'on vient d'aborder comment *couper* une zone du texte, nous +allons aborder maintenant le *coller*. La encore, le vocable Emacs +n'est pas standard. L'action *couper* dans Emacs se nomme */kill/* et +*coller*, */yank/*. On comprend ainsi mieux les choix de lettres ~k~ +et ~y~ dans ce contexte. +| Raccourci | Description | +|-----------+-------------------------------------------------| +| ~C-y~ | *Colle* la dernière sélection *copiée* | +| ~M-y~ | Remplace le texte collé par la copie précédente | +En fait, Emacs conserve toutes les copies en mémoire (/kill-ring/) et +on peut donc les utiliser à tout moment. Dans sa version de base, +parcourir le /kill-ring/ nécessite d'abord un *coller*. C'est-à-dire +qu'il faut effectuer ~C-y~ and de taper ~M-y~ pour le parcourir. + +Cette configuration d'Emacs utilise ~swiper~ et le parcours du +/kill-ring/ est amélioré. En effet, ~swiper~ propose l'utilisation +directe de ~M-y~ et plutôt que de remplacer le texte /en ligne/ comme +le fait la version de base, on y accède dans le /minibuffer/. On peut +alors le parcourir, soit en continuant à presser ~M-y~, soit en +utilisant les flèches du clavier, soit même en entrant les une partie +du texte comme pour les [[tab:recherche][recherches]]. + ** Gestion des /buffers/, fenêtres et cadres *** /buffers/ Dans cette configuration, on utilise le paquet ~IBuffer~ à la place du @@ -234,7 +321,7 @@ de base. | ~C-x k~ | Choisit un /buffer/ à fermer | | ~C-x k RET~ | Ferme le /buffer/ courant | -Lorsqu'on ferme un buffer, si les données n'ont pas été sauvegardées +Lorsqu'on ferme un /buffer/, si les données n'ont pas été sauvegardées Emacs invite l'utilisateur à le faire. *** Fenêtres @@ -298,7 +385,7 @@ travailler dans son environnement usuel. Il suffit de pouvoir s'y connecter par ~ssh~. Pour ouvrir un fichier distant, il suffit d'utiliser le raccourci -~C-x C-f~, puis d'écrire dans le ~mini-buffer~ +~C-x C-f~, puis d'écrire dans le ~minibuffer~ #+BEGIN_SRC bash /sshx:username@hostname: #+END_SRC @@ -306,25 +393,26 @@ Pour ouvrir un fichier distant, il suffit d'utiliser le raccourci (c'est à dire un buffer permettant de manipuler les fichiers du répertoire ~HOME~ de l'utilisateur sur la machine distante. On peut aussi utiliser ~TAB~ pour voir alors la liste des fichiers accessibles -dans le /mini-buffer/, la complétion fonctionnant comme en local. +dans le /minibuffer/, la complétion fonctionnant comme en local. Une fois un fichier ouvert, il est manipulé classiquement dans le /buffer/ et seule la sauvegarde du fichier nécessite la connexion. ** Recherche -| Raccourci | Description | -|-----------+------------------------------------------------------| -| ~C-s~ | Recherche une chaîne dans le /buffer/ vers le *bas* | -| ~C-r~ | Recherche une chaîne dans le /buffer/ vers le *haut* | -|-----------+------------------------------------------------------| -| ~C-M-s~ | Recherche une expression régulière vers le *bas* | -| ~C-M-r~ | Recherche une expression régulière vers le *haut* | - +#+NAME: tab:recherche +| Raccourci | Description | +|-------------+------------------------------------------------------| +| ~C-s~ | Recherche une chaîne dans le /buffer/ vers le *bas* | +| ~C-r~ | Recherche une chaîne dans le /buffer/ vers le *haut* | +| ~C-S-s C-w~ | Complète la chaîne à chercher avec le mot courant | +|-------------+------------------------------------------------------| +| ~C-M-s~ | Recherche une expression régulière vers le *bas* | +| ~C-M-r~ | Recherche une expression régulière vers le *haut* | Une fois une occurrence trouvée, on peut poursuivre la recherche vers le bas ou vers le haut, en faisant respectivement ~C-s~ ou ~C-r~. Puisqu'on utilise pas le mode standard de recherche d'Emacs, mais le mode ~swiper~, il est possible de naviguer dans le -/mini-buffer/ avec les flèches pour se déplacer d'une occurrence à +/minibuffer/ avec les flèches pour se déplacer d'une occurrence à l'autre. Quand la recherche est terminée, @@ -336,7 +424,7 @@ Quand la recherche est terminée, Une autre particularité intéressante de ~swiper~ est son utilisation de ~SPC~ qui sert de joker pendant les saisies. Voir par exemple, la figure [[fig:recherche-swiper]], où on a lancé une recherche puis tapé -~y t x(~ dans le /mini-buffer/, les lignes correspondantes y sont +~y t x(~ dans le /minibuffer/, les lignes correspondantes y sont affichées. On peut parcourir cette liste à l'aide des flèches du clavier, le /buffer/ de recherche suit l'occurrence sélectionnée. @@ -344,6 +432,11 @@ clavier, le /buffer/ de recherche suit l'occurrence sélectionnée. #+NAME: fig:recherche-swiper [[file:emacs-swiper-search.png]] +Attention si on utilise ~C-S-s C-w~, on n'utilise pas ~swiper~ pour la +recherche, mais l'outil recherche incrémentale classique d'Emacs. Il +est possible d'ajouter des mots à la recherche en faisant à nouveau +~C-w~. + ** Remplacement de texte | Raccourci | Description | |-----------+------------------------------------------------------| @@ -360,7 +453,7 @@ remplacer, Emacs attend une validation. Noter que le mode de remplacement est /intelligent/ au sens où il respecte la case si possible. -Si on demande le remplacement de ~foo~ par ~bar~= on obtient les résultats suivants +Si on demande le remplacement de ~foo~ par ~bar~ on obtient les résultats suivants | Chaîne initiale | Résultat | |-----------------+----------------| | ~foobar~ | ~barbar~ |