zap-up-to-char

Rédigé par Fred - - Aucun commentaire

Dans vi, on peut supprimer jusqu’à un caractère c avec dtc pour garder le caractère, et dfc pour supprimer le caractère.

Dans emacs, on utilise M-z pour appeler zap-to-char. Et je viens de trouver que zap-up-to-char existe…

Sur rubikitch.com, sorte de irreal.org, mais en japonais avec beaucoup de présentation de thèmes, Rubikitch vient de présenter zzz-to-char (github), un zap-to-char à la sauce avy (github), utilisé par ace-jump. Dans sa description on peut lire : « which work like built-ins zap-to-char and zap-up-to-char ». Et effectivement, zap-up-to-char existe par défaut, mais n’est pas autoloadé. Il est caché dans misc.el (avec butterfly). Du coup, soit on modifie le fichier pour rajouter un autoload, soit on s’ajoute dans son init.el :

(require 'misc)
(global-set-key (kbd "M-Z") 'zap-up-to-char)

Différence entre <code>eval-after-load</code> et <code>add-hook</code>

Rédigé par Fred - - Aucun commentaire

J’expliquais dans le billet sur le démarrage d’Emacs que

le code de eval-after-load sera exécuté seulement une fois […]

Les nomdumode-mode-hooks, eux, sont exécutés pour chaque buffer dans lequel le mode sera activé.

Pour illustrer mes propos, voici un code à mettre dans un nouveau buffer (C-x b auie) :

(setq auie 0)
(setq nrst 0)
(eval-after-load "python" ;puisque dans python.el
  '(progn
     (setq auie (1+ auie))
     ))


(add-hook 'python-mode-hook
          (lambda ()
            (setq nrst (1+ nrst))
            ))
(progn
  (python-mode)
  (message (concat "auie vaut :" (number-to-string auie) ", nrst : " (number-to-string nrst))))

Passez en mode elisp (M-x emacs-lisp-mode), puis évaluez le buffer (M-x eval-buffer). Un petit message devrait s’afficher. Allez à la fin du buffer (M->) et évaluez la dernière sexp (C-x C-e). Évaluez plusieurs fois ; constatez que auie n’augmente pas, nrst si.

Autrement dit, si l’on veut exécuter du code lorsque l’on passe dans le mode foo, et que l’on ne veut pas charger le fichier foo.el ni faire un (require 'foo) dans son fichier init.el, on a deux possibilités :

  1. Utiliser eval-after-load pour exécuter du code une fois.
  2. Utiliser add-hook pour exécuter du code plusieurs fois.

En fait, eval-after-load va exécuter le code à chaque fois que la bibliothèque est chargée. Mais généralement, on fait un (autoload 'foo-mode "foo" "docstring") ; au premier appel de foo-mode (avec un M-x ou avec un add-to-list 'auto-mode-alist), foo.el est chargé et le code du eval-after-load est exécuté. Aux prochains appels de foo-mode, foo.el est déjà chargé, le code n’est plus exécuté.

eval-after-load est donc approprié si l’on veut changer des valeurs par défaut :

(eval-after-load "ace-jump-mode"
  '(ace-jump-mode-enable-mark-sync)) ;par défaut, c’est à disable

(eval-after-load "foo-mode"
  '(my-init-foo-mode)) ; on charge des choses en plus

(eval-after-load "org"
  '(require 'ox-md nil t)) ;l’export markdown n’est pas chargé automatiquement

(eval-after-load 'foo-mode
  '(define-key foo-mode-map (kbd "C-à") 'my-useful-fonction)) ; un raccourci utilisé seulement pour ce mode

Le add-hook lui est utilisé à chaque fois que foo-mode est lancé (et non pas à chaque fois que foo.el est chargé). C’est ce choix que l’on fera si l’on veut activer un minor mode pour un major mode ou si on veut changer des valeurs de variables changées par le major mode.

; à chaque fois que l’on passe en elisp mode, on met les parenthèses en couleur
(add-hook 'emacs-lisp-mode 'rainbow-delimiters-mode)

;avant de sauver, on lance un nettoyage
(add-hook 'before-save-hook 'whitespace-cleanup)

;le mode foo redéfinit à chaque fois C-> et je ne veux pas
(add-hook 'foo-mode-hook '(lambda ()
  (define-key foo-mode-map "\C->" 'foobar))) 

;on met c-basic-offset à 4
(add-hook 'c-mode-common-hook
  '(lambda () 
     (setq c-basic-offset 4)))

;si on veut différentes valeurs selon que l’on soit en foo ou en bar
(add-hook foo-mode-hook
  '(lambda () 
    (setq spam 42)) nil t)

(add-hook bar-mode-hook
  '(lambda () 
    (setq spam 3.14)) nil t)

En espérant avoir été clair.

Le démarrage d’Emacs

Rédigé par Fred - - Aucun commentaire

Introduction

Il y a quelques temps de cela (je viens de me rendre compte que cela fait plus de 10 ans déjà…), je commençais à utiliser Emacs. Et, comme beaucoup je suppose, pour configurer, je copiais/collais des bouts de code dans mon .emacs sans chercher à comprendre ce que ça faisait (comment ça c’est encore le cas ‽). Typiquement, j’avais plein de :

(autoload 'php-mode "php-mode" "Major mode for editing php code." t)
(add-to-list 'auto-mode-alist '("\\.php$" . php-mode))

plutôt obscurs.

Et au fil du temps, les lignes s’accumulaient, et Emacs n’était plus aussi rapide à charger.

Je me suis alors intéressé à comment le rendre plus rapide au démarrage. Bien que je me sois rendu compte que la meilleure solution pour moi serait d’utiliser emacsclient1, j’ai d’abord fait du nettoyage, en utilisant le plus possible customize et en regroupant ça dans un seul fichier avec :

(setq custom-file "~/.emacs.d/config/custom.el") (load custom-file)

Puis j’ai supprimé tout ce dont je ne me servais en fait pas, et je me suis penché sur ce qu’il se passe au démarrage d’Emacs, pour savoir si je ne lui faisais pas faire des choses inutiles. Et, avec les différentes versions d’Emacs certainement, j’ai bien vu que la plupart de ces lignes étaient (devenues ?) inutiles.

tl;dr

Que fait autoload ? Qu’y a-t-il dans auto-mode-alist ? Le bout de code précédent pour avoir le mode python est-il nécessaire ? suffisant ? Peut-on faire autrement ? C’est à ça que je vais m’intéresser par la suite. Pour cela, je me suis penché dans le code et le manuel d’Emacs et je vous partage ce que j’en ai retenu et laisse des informations pas forcément pertinentes, mais fortement en relation et toujours instructives.

Lire la suite de Le démarrage d’Emacs

Un peu de typographie et marquer les raccourcis clavier dans org-mode

Rédigé par Fred - - Aucun commentaire

Utilisant la disposition de clavier bépo, et soucieux d’écrire le plus correctement possible, j’ai pris l’habitude de mettre des espaces insécables lorsque c’est nécessaire (même si, je l’avoue, je n’utilise pas les espaces fines… désolé). Depuis plusieurs jours, j’utilise également les apostrophes courbes (!wfr) et plus celles qui se trouve sur la touche 4 des claviers azerty, des droites : l’apostrophe courbe vs l'apostrophe droite.

Lire la suite de Un peu de typographie et marquer les raccourcis clavier dans org-mode

Fil RSS des articles de ce mot clé