URL: https://linuxfr.org/news/gnu-emacs-quelques-extensions-premiere-partie Title: GNU Emacs : quelques extensions (première partie) Authors: ptitjano Benoît Sibaud, Nils Ratusznik et palm123 Date: 2014年10月14日T08:46:44+02:00 License: CC By-SA Tags: emacs et extension Score: 40 Pour son premier journal, ptitjano a décidé de nous parler de GNU Emacs, et nous on a décidé d'en faire une dépêche : au menu de cette première liste d'extensions, un gestionnaire de paquets, une meilleure navigation parmi les buffers, un M-x amélioré, la liste des derniers fichiers ouverts, l'insertion simple de templates, la complétion visuelle, le classement des buffers en catégories et la recherche dans les buffers ouverts. ---- [Journal à l'origine de la dépêche](http://linuxfr.org/users/ptitjano/journaux/gnu-emacs-quelques-extensions-premiere-partie) ---- GNU Emacs 24.4 devrait sortir [le 20 octobre 2014](https://lists.gnu.org/archive/html/emacs-devel/2014-10/msg00376.html) mais j'ai l'impression qu'on en parle trop peu sur ces pages (on peut tout de même trouver quelques journaux récents, notamment [« des prompteurs pour Emacs »](//linuxfr.org/users/saltimbanque/journaux/des-prompteurs-pour-emacs), [« peigner la girafe, BPM »](//linuxfr.org/users/philippemc/journaux/peigner-la-girafe-bpm) ou [« Emacs 24 toute résistance est inutile](//linuxfr.org/users/philippemc/journaux/emacs-24-toute-resistance-est-inutile)). J'ai donc décidé d'apporter ma pierre à l'édifice. (Certains éléments reprennent d'ailleurs des astuces ou des commentaires des journaux précédemment cités). Conventions ========== On utilisera dans ce journal la même convention que celle de [xaccrocheur](//linuxfr.org/users/philippemc/journaux/emacs-24-toute-resistance-est-inutile) : * `C` : (Control) la touche Ctrl ; * `M` : (Meta) la touche ALT ; * `S` : (Shift) la touche Maj ; * `s` : (Super) la touche WIN ; * `SPC` : (Space) la touche Espace ; * `buffer` : Un... heu... buffer. Package.el : un gestionnaire de packages ========== Emacs 24 a introduit un gestionnaire de packages. On peut maintenant installer des packages automatiquement pour ajouter de nouvelles fonctionnalités sans quitter son Emacs chéri. Ajout de dépôts et initialisation ----------- Il suffit de rajouter ces quelques lignes à son .emacs : ```commonlisp (require 'package) (package-initialize) ;; initialisation de package (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t) ;; ajout du dépôt "melpa" (add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/") t) ;; ajout du dépôt "marmalade" ``` Installer des packages ----------- * lister tous les packages : `M-x list-packages` ; * installer un package : `M-x package-install` `Entrée` `` `Entrée`. Un article très complet sur le sujet est disponible chez [Xah Lee](http://ergoemacs.org/emacs/emacs_package_system.html). Ido : une meilleure navigation parmi les buffers =========== **Ido** pour "Interactively DO things" est un mode qui permet de naviguer entre les fichiers et les buffers d'Emacs de manière beaucoup plus rapide en surchargeant ces différentes opérations. Il est disponible par défaut depuis Emacs 22 (soit juin 2007). Activer ido ----------- À ajouter dans son .emacs : ```commonlisp (require 'ido) (setq ido-enable-flex-matching t) ;; activer le fuzzy matching pour trier les résultats (setq ido-everywhere t) ;; activer ido pour find-files et les buffers (ido-mode 1) ;; activer ido ``` Ido en pratique ----------- * changer de buffer : `C-x b ` puis `Entrée` pour sélectionner le candidat courant ; * on peut naviguer entre les différents candidats avec `C-s` (suivant) et `C-r` (précédent) ; * `Tab` affiche la liste des candidats dans un nouveau buffer ; * ouvrir un nouveau fichier : `C-x C-f` ; * `Retour arrière` pour aller au répertoire parent ; * afficher un buffer **dired** dans le répertoire courant : `C-d` ; * créer un nouveau sous-répertoire : `M-m` ; * forcer la création d'un nouveau fichier avec le nom entré : `C-j`. Il suffit de l'essayer pour comprendre immédiatement son utilité. Un article complet de présentation et quelques astuces sont disponibles chez [masteringemacs](http://www.masteringemacs.org/articles/2010/10/10/introduction-to-ido-mode/). Ido-ubiquitous : obtenir ido partout ----------- Le mécanisme d'**ido** n'est disponible que pour find-files et la navigation entre les buffers. On aimerait pourtant l'utiliser partout. Heureusement, **ido-ubiquitous** ajoute cette possibilité. Il va remplacer le système de complétion natif d'Emacs dès que possible. Il sera donc disponible pour tous les packages utilisant ce mécanisme. Pour l'installer, on passe par **package.el** : `M-x package-install` `Entrée` ido-ubiquitous `Entrée` On rajoute ensuite dans son .emacs : ```commonlisp (require 'ido-ubiquitous) (ido-ubiquitous-mode t) ``` D'après certains [gourous d'Emacs](http://whattheemacsd.com/setup-ido.el-01.html) il est nécessaire de rajouter quelques lignes pour assurer le bon fonctionnement d'ido-ubiquitous avec les versions les plus récentes de certains packages. Faisons leur confiance : ```commonlisp ;; Fix ido-ubiquitous for newer packages (defmacro ido-ubiquitous-use-new-completing-read (cmd package) `(eval-after-load ,package '(defadvice ,cmd (around ido-ubiquitous-new activate) (let ((ido-ubiquitous-enable-compatibility nil)) ad-do-it)))) (ido-ubiquitous-use-new-completing-read webjump 'webjump) (ido-ubiquitous-use-new-completing-read yas/expand 'yasnippet) (ido-ubiquitous-use-new-completing-read yas/visit-snippet-file 'yasnippet) ``` Smex ou M-x amélioré à la sauce ido =========== **Smex** est une extension fort utile d'**ido**. En effet, ce dernier est très pratique mais on aimerait bien pouvoir l'utiliser lors de l'appel de fonctions (`M-x`). C'est ici que **smex** entre en jeu : il surcharge la commande `M-x` N'étant pas disponible par défaut, il est nécessaire de l'installer. Heureusement, on dispose d'un gestionnaire de packages pour automatiser la tâche : `M-x package-install` `Entrée` smex `Entrée` Les sources de **smex** sont disponibles chez [Github](https://github.com/nonsequitur/smex/). Installation et activation ----------- Rajouter dans son .emacs : ```commonlisp (require 'smex) ; Not needed if you use package.el (smex-initialize) (global-set-key "\M-x" 'smex) (global-set-key (kbd "M-X") 'smex-major-mode-commands) ``` Smex en pratique ----------- ![Smex](http://www.emacswiki.org/pics/static/SmexScreenshotImage.png) Recentf : obtenir la liste des derniers fichiers ouverts =========== Principe et utilisation ----------- Il est possible de demander à Emacs de garder la trace des derniers fichiers ouverts en utilisant **recentf** (intégré depuis Emacs 21). Il suffit de quelques lignes dans son .emacs : ```commonlisp (require 'recentf) (setq recentf-max-saved-items 50) ;; fixer le nombre d'enregistrements à 50 (recentf-mode 1) ;; l'activer ``` la fonction `ido-recentf-open` permet d'obtenir une liste de ces fichiers : `M-x ido-recentf-open`. On peut bien entendu lui assigner un raccourci clavier : ```commonlisp (global-set-key (kbd "C-x C-r") 'ido-recentf-open) ``` Combiner recentf et ido : ----------- [masteringemacs.org](http://www.masteringemacs.org/articles/2011/01/27/find-files-faster-recent-files-package/) propose une intégration élégante de **recentf** et **ido** : ```commonlisp (require 'recentf) ;; get rid of `find-file-read-only' and replace it with something ;; more useful. (global-set-key (kbd "C-x C-r") 'ido-recentf-open) ;; enable recent files mode. (recentf-mode t) ; 50 files ought to be enough. (setq recentf-max-saved-items 50) (defun ido-recentf-open () "Use `ido-completing-read' to \[find-file] a recent file" (interactive) (if (find-file (ido-completing-read "Find recent file: " recentf-list)) (message "Opening file...") (message "Aborting"))) ``` Yasnippet : insérer des templates simplement =========== [Yasnippet](http://capitaomorte.github.io/yasnippet/) est un système de gestion de templates. Il permet d'insérer un morceau de texte en tapant une abréviation. Ces abréviations dépendent du mode du buffer actif. Installation et activation ----------- Pour l'installation, il suffit de faire confiance à **package.el** : `M-x package-install` `Entrée` yasnippet `Entrée` Pour l'activer, comme toujours, quelques lignes sont nécessaires dans son .emacs : ```commonlisp (require 'yasnippet) ;; not needed if you use package.el (yas-global-mode 1) ``` Utilisation et personnalisation ----------- Pour insérer un template : `Tab` (pour yas/expand) De nombreux templates sont définis par défaut pour la plupart des modes (C/C++, HTML, Perl, Python, latex, Markdown, Ruby, SQL, CSS, etc.) Bien entendu, il est possible d'ajouter ses propres templates (des explications complètes [ici](http://ergoemacs.org/emacs/yasnippet_templates_howto.html)). On peut également trouver un nombre incalculable de templates sur le web. Il peut être utile de les rajouter dans un sous-répertoire de son emacs.d . On les chargera ensuite depuis son .emacs : ```commonlisp (add-to-list 'load-path "~/.emacs.d/mes-supers-snippets") ``` Auto-complete : une complétion visuelle =========== [Auto-complete](http://auto-complete.org/) est un mode qui permet d'afficher et de trier des candidats à la complétion de la saisie courante. L'un de ces points forts est qu'il est possible de fournir et trier les candidats à la sélection. ![Auto-complete en action](https://raw.githubusercontent.com/auto-complete/auto-complete/master/doc/ac.png) Installation et activation ----------- Rien de bien extraordinaire avec **package.el** : `M-x package-install` `Entrée` auto-complete `Entrée` Pour l'activer, il suffit d'ajouter deux lignes à son .emacs : ```commonlisp (require 'auto-complete-config) (ac-config-default) ``` Pour naviguer plus facilement entre les candidats : ```commonlisp (define-key ac-completing-map (kbd "C-n") 'ac-next) (define-key ac-completing-map (kbd "C-p") 'ac-previous) ``` Il est par ailleurs possible d'étendre la liste des candidats pour un mode donné avec d'autres packages (par exemple **auto-complete-octave** pour le mode octave). Utiliser ido et auto-complete ensemble ----------- Il est nécessaire d'activer **ido** avant **auto-complete** dans son .emacs . Pour que les deux cohabitent harmonieusement, on ajoutera ces quelques lignes à la configuration d'**auto-complete** : ```commonlisp (add-to-list 'ac-sources 'ac-source-yasnippet) ;; Let's have snippets in the auto-complete dropdown ;;; set the trigger key so that it can work together with yasnippet on tab key, ;;; if the word exists in yasnippet, pressing tab will cause yasnippet to ;;; activate, otherwise, auto-complete will (ac-set-trigger-key "TAB") (ac-set-trigger-key "") ``` Ibuffer : gérer ses buffers intelligemment =========== **Ibuffer** permet d'afficher et manipuler la liste de tous les buffers ouverts de la même manière que **dired** pour les répertoires. Il est partie intégrante d'Emacs depuis la version 22. Il n'y a donc rien à installer. La configuration est fort simple. Comme toujours, cela se passe dans son .emacs : ```commonlisp (require 'ibuffer) (global-set-key (kbd "C-x C-b") 'ibuffer) ;; remplace buffermenu ``` Classer ses buffers en catégories ----------- L'une des fonctionnalités les plus intéressantes de **ibuffer** est la possibilité de trier les buffers ouverts suivant différentes catégories que l'on peut personnaliser. Par exemple, (code tiré de [emacs-fu](http://emacs-fu.blogspot.fr/2010/02/dealing-with-many-buffers-ibuffer.html)) : ```commonlisp (setq ibuffer-saved-filter-groups (quote (("default" ("Org" ;; all org-related buffers (mode . org-mode)) ("Mail" (or ;; mail-related buffers (mode . message-mode) (mode . mail-mode) ;; etc.; all your mail related modes )) ("MyProject1" (filename . "src/myproject1/")) ("MyProject2" (filename . "src/myproject2/")) ("Programming" ;; prog stuff not already in MyProjectX (or (mode . c-mode) (mode . perl-mode) (mode . python-mode) (mode . emacs-lisp-mode) ;; etc )) ("ERC" (mode . erc-mode)))))) (add-hook 'ibuffer-mode-hook (lambda () (ibuffer-switch-to-saved-filter-groups "default"))) ``` Occur : faire un grep sur les buffers ouverts =========== Introduction ----------- Le mode **occur** permet d'obtenir la liste de toutes les lignes contenant une expression régulière. Cette liste s'affiche dans un nouveau buffer (\*Occur\*) et la recherche se limite au buffer actif. Pour l'appeler, rien de plus simple : `M-x occur` `Entrée` expression-a-chercher `Entrée` Pour chercher une occurrence dans plusieurs buffers, on peut utiliser la commande `M-x mutli-occur`. Multi-occur sur un mode donné ----------- [masteringemacs](http://www.masteringemacs.org/articles/2011/07/20/searching-buffers-occur-mode/) propose une personnalisation permettant de rechercher l'expression régulière parmi tous les buffers ouverts du même mode que le buffer actif. Son code est le suivant : ```commonlisp (eval-when-compile (require 'cl)) (defun get-buffers-matching-mode (mode) "Returns a list of buffers where their major-mode is equal to MODE" (let ((buffer-mode-matches '())) (dolist (buf (buffer-list)) (with-current-buffer buf (if (eq mode major-mode) (add-to-list 'buffer-mode-matches buf)))) buffer-mode-matches)) (defun multi-occur-in-this-mode () "Show all lines matching REGEXP in buffers with this major mode." (interactive) (multi-occur (get-buffers-matching-mode major-mode) (car (occur-read-primary-args)))) ;; global key for `multi-occur-in-this-mode' - you should change this. (global-set-key (kbd "C-") 'multi-occur-in-this-mode) ``` La suite ========== Il est temps de s'arrêter pour cette première partie. Au prochain épisode, on présentera notamment **uniquify**, **iedit**, **flycheck**, **jedi** (pas le chevalier), **org-mode** et **ace-window**.

AltStyle によって変換されたページ (->オリジナル) /