Journal GNU Emacs : quelques extensions (première partie)

Posté par . Licence CC by-sa
51
14
oct.
2014
Ce journal a été promu en dépêche : GNU Emacs : quelques extensions (première partie).

Sommaire

Cher journal,

C'est la première fois que je t'écris et j'espère que tout va bien se passer.
GNU Emacs 24.4 devrait sortir lundi prochain 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 ici, ici ou par ici). 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 :

  • 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 :

(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 <package> Entrée

Un article très complet est disponible chez Xah Lee

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 :

(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 <premières lettre> 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

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 :

(require 'ido-ubiquitous)
(ido-ubiquitous-mode t)

D'après certains gourous d'Emacs 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 :

;; 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 forte utile d'ido. En effet, ce dernier est fort 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.

Installation et activation

Rajouter dans son .emacs :

(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

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 :

(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 :

(global-set-key (kbd "C-x C-r") 'ido-recentf-open)

Combiner recentf et ido :

masteringemacs.org propose une intégration élégante de recentf et ido :

(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 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 :

(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).
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 :

(add-to-list 'load-path "~/.emacs.d/mes-supers-snippets")

Auto-complete : une complétion visuelle

Auto-complete 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

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 :

(require 'auto-complete-config)
(ac-config-default)

Pour naviguer plus facilement entre les candidats :

(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 :

(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 "<tab>")

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 :

(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) :

(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 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 :

(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-<f2>") '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.
À bientôt cher journal.

  • # Bonne idée !

    Posté par . Évalué à 7.

    C'est une liste utile pour commencer. Je me suis vraiment converti à Emacs avec ce "Starter Kit".

    Il est vraiment complet. Il est fait pour Mac, mais en remplaçant Skim par Evince (par exemple), et quelques chemins (comme celui vers le fichier bibtex), cela devrait le faire. Dans tous les cas, les fichiers de configuration dans .emacs.d/ sont bien commentés.

    Deux sites pleins de ressources aussi : celui de Bozhidar Batsov et celui de Sacha Chua.

  • # Syncer l'bazar

    Posté par (page perso) . Évalué à 3. Dernière modification le 14/10/14 à 20:32.

    Tout ça est très bien, mais refaire tout ça à chaque fois que tu installes une bécane, voire se retrouver avec des configs différentes partout, ça va pas le faire. Pour éviter ça, il faut synchroniser ses fichiers de config. Dés que je change un truc à mon .emacs, ou mon .zshrc je sais qu'il sera répercuté sur mes autres installs.

    Mon .emacs (qui doit ressembler pas mal à celui de ptijano<) peut être considéré comme un "starter kit" aussi (Raccourcis humains, installation à la volée des extensions qui vont bien, onglets, aide en ligne, etc) pour le tester:

    • cd
    • cp .emacs .emacs.tmp
    • wget https://github.com/xaccrocheur/kituu/blob/master/.emacs
    • emacs&

    Pour cloner tout mon environnement (RTFM)

    • cd
    • git clone https://github.com/xaccrocheur/kituu.git .kituu && .kituu/bin/kituu-setup.sh

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.