Création d’un nouveau billet depuis emacs

Rédigé par Fred - - 7 commentaires

J’écris toujours mes billets sous emacs. Mais depuis que je suis passé à PluXml et jusqu’à il n’y a pas si longtemps, je devais exporter l’article (le fichier ou la sous-arborescence) en html (où plutôt dans ma version), puis copier et coller le contenu dans la partie administration du blog, en renseignant date, catégorie et mots clés (je ne me sers pas vraiment des autres options pour le moment), qui étaient ensuite transformés en fichier xml.

Quand on a eu l’habitude d’utiliser org-publish, c’est fastidieux… J’ai donc écrit quelques lignes d’elisp pour pouvoir créer directement ce fichier xml. Comme d’habitude, c’est disponible sur bitbucket.

Avec le passage à PluXml, j’en ai profité pour revoir un peu ma façon d’écrire des articles :

  • Soit je trouve quelque chose sur le net, et dans ce cas là je récupère le lien via org-protocol ;
  • Soit je veux faire un article plus conséquent, ou qui ne vient pas d’un lien, et je crée un nouveau fichier .org dans un dossier /chemin/qui/va/bien/année/mois/jour/ (avant, tous mes articles étaient sous cette forme).

J’ai maintenant un fichier dans lequel je me note plusieurs choses concernant ce site, et en particulier, j’ai l’arborescence suivante en ce qui concerne les articles que je pense faire pour ce blog :

#+TODO: TODO(t) WAITING(w) | DONE(d) CANCELED(c)
#+TODO: À_ÉCRIRE(à) COMMENCÉ(o) EN_ATTENTE(e@) FINI(f) | ANNULÉ(a) PUBLIÉ(p)

* Ce fichier…
* TODO [#A] Blog
** Catégories
*** diatribes
*** paremboles…
*** guides…
*** snippet…
*** lab…
*** blog…
*** projets…
*** raccourcis…
*** trouvailles…
*** memos
**** PUBLIÉ Encoder avec mencoder                             :mettre_à_jour:
**** PUBLIÉ Quelques notes SoapUI                             :mettre_à_jour:
**** PUBLIÉ Python Module of the Week                           :python:info:
Note pour moi-même.

Les modules des « module python de la semaine » : https://pymotw.com/2/contents.html

Par ordre alphabétique : https://pymotw.com/2/py-modindex.html

Pour info, pymotw est/était la présentation par Doug Hellmann d’un
module python avec des exemples de codes. Les sources sont disponibles
sur bitbucket.

Pour python 3 : https://pymotw.com/3/
**** PUBLIÉ Besoin de se dégourdir les doigts ?               :mettre_à_jour:
**** COMMENCÉ org-protocol                                    :emacs:orgmode:
*** non classé…
*** Snippets…
** Statiques…
*** Cheatsheet…
*** lab…

* TODO Site…

Sous le header Blog puis Catégories, j’ai toutes les catégories de mon blog. Et dans chaque catégorie, j’ai ensuite mes articles :

  • Soit en clair dans le fichier (ce qui est par exemple le cas pour l’article pymotw)
  • Soit un lien dans le dossier année/mois/jour (comme pour l’article Encoder avec mencoder).

Création d’un nouvel article

Pour créer un nouvel article, j’utilise un raccourci qui me demande un titre, puis crée le nom de fichier à partir de ce titre et de la date 1, le met dans le bon dossier (/chemin/qui/va/bien/aaaa/mm/jj/), et renseigne l’entête (avec quelques valeurs par défaut, configurables).

Pour cet article, voilà l’entête qui a été créé :

#+TITLE: Création d’un nouveau billet depuis emacs
#+DATE: <2016-04-10 11:09:42>
#+AUTHOR: Fred 
#+PLX_CAT: 
#+PLX_DRAFT: t
#+PLX_WAITING_VALIDATION: 
#+PLX_ALLOW_COM: 1
#+PLX_TEMPLATE: article.php
#+PLX_TAGS: 
#+PLX_META_DESCR: 
#+PLX_META_KEYWORDS: 
#+PLX_ARTICLE_ID: 0053

Je peux ainsi renseigner la catégorie, des mots clés, le passer en brouillon ou non, etc.

Les catégories sont à renseigner telles qu’elles ont été définies dans le fichier categories.xml au niveau de l’=url= et pas du CDATA (ici par exemple, j’ai renseigné directement blog et non Blog ou 001).

Lorsque j’exporte, ça crée le fichier avec le bon nom (merci à Stéphane), puis ça remplit le fichier xml (avec encore un merci à Stéphane) en renseignant les balises correctement à partir de l’entête de mon fichier, et ça le met dans le bon dossier. Si un fichier avec le même id existe déjà, il demande si on veut l’écraser.

Création d’un billet light

Si j’ai utilisé org-protocol, j’ai une nouvelle section dans une des catégories du blog dans le fichier principal. Dans ce cas, le titre correspondra au header de la section et la catégorie, à la section parente et j’utilise C-c C-c pour ajouter des tags. Un raccourci plus tard, le fichier est correctement nommé, rempli (avec les mêmes valeurs par défaut) et déposé dans le bon dossier.

Enfin, dans les deux cas, le fichier tags.xml est mis à jour correctement (l’ancienne ligne est supprimée si l’article est mis à jour).

Par défaut je dépose/modifie les fichiers sur une copie locale du blog, mais il est possible d’utiliser tramp pour passer via ssh sur le serveur directement.

Reste à faire

Même si mon processus est maintenant plus fluide, il reste dans l’idéal des améliorations à apporter :

  • créer la catégorie dans le fichier si elle n’existe pas
  • créer un lien dans l’arborescence Blog/catégorie du fichier principal lors de la création d’un nouveau billet
  • utiliser un drawer dans les articles créés dans le fichier pour pouvoir réutiliser le même id
  • utiliser le processus d’=org-export-dispatch= pour pouvoir exporter et publier

Rien de bien méchant, mais l’utilisation n’en serait que plus agréable.

Liens vers les autres articles

Petit aparté pour finir. Si je souhaite faire un lien vers un autre article, j’utilise les abréviations d’org-mode. Sous l’entête je rajoute

#+LINK: article http://fredtantini.free.fr/blog/index.php?article%s

(Ne pas oublier de C-c C-c si on veut pouvoir cliquer dessus de suite.)

Ensuite, dans le texte, un lien de la forme

[[article:42][blabla]]

remplacera le %s par 42, et la réécriture d’url de pluxml prend ensuite le relais !

Footnotes:

1

Le titre est un peu mieux transformé qu’avant. Les signes diacritiques et les caractères non-ascii/alphanum sont supprimés (en adaptant et simplifiant http://ergoemacs.org/emacs/emacs_zap_gremlins.html), le nom de fichier est préfixé avec la date, puis mis dans le bon dossier YEAR/MONTH/YearMonthDay_title_with_underscore.org

org-protocol

Rédigé par Fred - - Aucun commentaire

J’avais déjà vu passer l’info, sur irreal.org puis chez Sacha Chua, et ailleurs encore, et à chaque fois, je m’étais dit, faut que je m’y mette. C'est chose faite depuis quelques temps. org-protocol permet d’utiliser org-capture depuis firefox, chrome, acrobat reader, etc.

Ce qui m’intéresse, c’est d’utiliser les bookmarklets de firefox, et plus particulièrement les mots-clés des marque-pages : je tape dans la barre d’adresse ot, or ou on, et ça me rajoute une note au bon endroit dans le bon fichier org-mode.

Je note ici comment j’ai fait. Selon que vous utilisiez windows, ou GNU/Linux, c’est légèrement différent.

Pour windows :

Dans le dossier bin d’emacs, j'ai ajouté le fichier em.cmd contenant :

@echo off
"%~dp0emacsclientw.exe" -na "%~dp0runemacs.exe" -c "%1"

Dans le fichier d’initialisation, init.el, il faut :

;; pour emacs client
(server-start) 

;;; où se situe org-protocol
(add-to-list 'load-path "c:/Users/ftantini/AppData/Roaming/.emacs.d/elpa/org-20150622/")
(require 'org-protocol)

;;; un template
(setq org-protocol-default-template-key "l")
(setq org-capture-templates
 '(("l" "Link" entry (file+olp "C:\\Users\\ftantini\\Documents\\Divers\\orgnotes.org" "Web Links")
        "* %a\n %?\n %i")))

Si on veut plusieurs bookmarks :

(setq org-protocol-default-template-key "l")
(setq org-capture-templates
 '(("t" "Todo" entry (file+headline "C:\\Users\\ftantini\\Documents\\Divers\\orgnotes.org" "Tasks")
        "* TODO %?\n  %i\n  %a")
   ("l" "Link" entry (file+olp "C:\\Users\\ftantini\\Documents\\Divers\\orgnotes.org" "Web Links")
        "* %a\n %?\n %i")
   ("j" "Journal" entry (file+datetree "C:\\Users\\ftantini\\Documents\\Divers\\orgnotes.org")
        "* %?\nEntered on %U\n  %i\n  %a")))

Attention, il a fallu que Web Links soit déjà un header du fichier.

Enfin, il faut également modifier le registre :

REGEDIT4

[HKEY_CLASSES_ROOT\org-protocol]
"URL Protocol"=""
@="URL:Org Protocol"

[HKEY_CLASSES_ROOT\org-protocol\shell]

[HKEY_CLASSES_ROOT\org-protocol\shell\open]

[HKEY_CLASSES_ROOT\org-protocol\shell\open\command]
@="\"c:\\Users\\ftantini\\Progs\\emacs-24.5\\bin\\emacsclientw.exe\" \"%1\""

Côté firefox, on ajoute le bookmarklet suivant :

javascript:location.href='org-protocol://org-capture://l/'+encodeURIComponent(location.href)+'/'+encodeURIComponent(document.title)+'/'+encodeURIComponent(window.getSelection());

où le l qui suit org-capture correspond au template qu’on veut utiliser.

Le sous-protocole n’est, pour moi, pas capture, mais bien org-capture (trouvé grâce à C-h v org-protocol-protocol-alist-default pour voir les protocoles par défaut).

La première fois que le bookmarklet est lancé, il demande avec quoi ouvrir, on renseigne em.cmd.

Pour linux :

C’est très clair ici : http://tech.memoryimprintstudio.com/org-capture-from-external-applications/, les solutions 2, et 3 ont marché pour moi, je vous laisse aller voir et je recopie ce qui marche pour moi (le plugin ne permet d’utiliser qu’un template) :

  • Enregistrer un fichier org-protocol.desktop

dans ~/.local/share/applications avec :

[Desktop Entry]
Name=org-protocol
Exec=emacsclient -c %u
Type=Application
Terminal=false
Categories=System;
MimeType=x-scheme-handler/org-protocol;
  • Ajouter dans ~/.local/share/applications/mimeapps.list
[Added Associations]
x-scheme-handler/org-protocol=org-protocol.desktop

puis mettre à jour :

update-desktop-database ~/.local/share/applications/

(le paquet pour debian est desktop-file-utils)

Côté Emacs, dans le fichier d’initialisation, init.el, on ajoute (si ce n’est pas déjà présent) :

;; pour emacs client
(server-start) 

;;; org-protocol
(require 'org-protocol)

(setq org-protocol-default-template-key "l")
(setq org-capture-templates
 '(("l" "Link"                entry (file+headline "/home/fred/Data/Donnees/Org/Notes/orgnotes.org" "trouvailles")
        "* %a\n %?\n %i")))

Et si on veut plusieurs bookmarks :

(setq org-protocol-default-template-key "l")
(setq org-capture-templates
 '(("t" "Todo" entry (file+headline "/home/fred/Data/Donnees/Org/Notes/orgnotes.org" "Tasks")
        "* TODO %?\n  %i\n  %a")
   ("l" "Link" entry (file+olp "/home/fred/Data/Donnees/Org/Notes/orgnotes.org" "Web Links")
        "* %a\n %?\n %i")
   ("j" "Journal" entry (file+datetree "/home/fred/Data/Donnees/Org/Notes/orgnotes.org")
        "* %?\nEntered on %U\n  %i\n  %a")))

Comme pour windows, le header (Tasks, Web Links) doit déjà être présent.

Le bookmarklet qui va bien à ajouter dans firefox :

javascript:location.href='org-protocol://capture://l/'+encodeURIComponent(location.href)+'/'+encodeURIComponent(document.title)+'/'+encodeURIComponent(window.getSelection());

où le l qui suit org-capture correspond au template qu’on veut utiliser.

Par contre, cette fois le sous-protocole est bien capture, et pas org-capture, et je n’ai pas chercher à comprendre pourquoi… (org-protocol-protocol-alist-default est pourtant le même.)

Pour tester, on peut, en ligne de commande, lancer

emacsclient org-protocol://capture://x/toto/tata/titi

si ça ne marche pas correctement, par exemple, si le buffer s’ouvre avec comme nom le dernier argument (ici titi), c’est sûrement un souci de sous-protocole.

Mes templates

Voilà les trois templates qui sont chez moi associés à un bookmarklet :

(setq org-capture-templates
      '(("t" "notes-info/travail"
               entry (file+headline "/home/fred/Data/Donnees/Org/Notes/notes-info.org" "trouvailles")
               "** COMMENCÉ %:description\n%i\n%?\nSource : %a\n\n" :immediate-finish)
        ("r" "notes-info/raccourcis"
               entry (file+headline "/home/fred/Data/Donnees/Org/Notes/notes-info.org" "raccourcis")
               "** COMMENCÉ %:description\n%i\n%?\nSource : %a\n\n" :immediate-finish)
        ("l" "notes/à lire"
               entry (file+headline "/home/fred/Data/Donnees/Org/Notes/notes.org" "à lire")
;              "* %^{Title}\n\n  Source: %u, %c\n\n  %i"))))
               "** %a\n%i\n%?\n\n" :immediate-finish)
        ))
                                        ;%:description : titre de la page
                                        ;%i : sélection de la page web
                                        ;%? : curseur pour continuer de remplir la note
                                        ;%a : [[lien][titre de la page]]

Je rappelle les liens de l’intro : chez Sacha Chua, qui explique comment elle a fait pour chrome, et le site d’orgmode, en particulier, les templates : http://orgmode.org/manual/Capture-templates.html pour avoir d’autres variables (%T, %k, %^{Title}, %^C… sur Template-expansion), et la page de départ : http://orgmode.org/worg/org-contrib/org-protocol.html.

Ajouter des curseurs multiples avec Ace Jump

Rédigé par Fred - - Aucun commentaire

Pour ceux qui utilisent à la fois multiple-cursors.el et ace-jump, ace-mc permet d’ajouter (et d’enlever) des curseurs à la manière d’ace-jump. Ça se base sur ace-jump, et peut-être que ce sera adapté à avy qui a un peu plus le vent en poupe.

Dans la même veine, ace-jump-zap permet de faire un zap-to-char (C-h k M-z) sans besoin de compter jusqu’à la combientième lettre on veut killer (avec avy : avy-zap).

D’autres commandes plus ou moins utiles ont été implémentées à la sauce ace-jump/avy, notamment par Junpeng Qiu, Oleh Krehel (abo-abo) et d’autres encore : ace-flyspell, ace-jump-helm-line, ace-link

Source : Add Multiple Cursors using Ace Jump : emacs (r/emacs)

Retenir plus facilement - ma version du systeme PAO

Rédigé par Fred - - Aucun commentaire

Au hasard de mes parcours sur la toile — bon, en fait, je sais plus comment c’est venu, du coup, on va dire que c’est par hasard1 —2 je suis tombé sur cette page. Et j’ai découvert que le commun des mortels pouvait faire des choses incroyables (et pas forcément utiles, donc indispensables) comme mémoriser l’ordre des cartes d’un paquet de 54 cartes mélangées, retenir une liste de nombres pendant plusieurs semaines, résoudre le rubik’s cube en aveugle (je ne parle pas du temps de mémorisation ni de résolution ça c’est pour les mortels moins communs3), se rappeler de moults numéros de téléphone etc.

Il y a plusieurs techniques, qui ont l’air de se valoir, pour arriver à ce but (certaines étant plus adaptées à des tâches en particulier). Je ne vais pas les présenter, elles sont bien mieux détaillées que ce que je pourrais faire dans les différents liens qui viendront. Je vais décrire celle que j’utilise, qui est une adaptation de ce qui se fait.

Memory palace

Le « palais de la mémoire » (ou la méthode des lieux) est une façon de se rappeler les choses. Pour cela, on se crée un parcours, dans sa maison, dans sa ville, avec des endroits bien spécifiques, et on utilisera toujours le même parcours. Par exemple, on commence par la chambre, on va aux toilettes, dans la cuisine, puis dans la salle de bains. Ensuite, pour se souvenir des légumes à prendre aux marchés, on place un légume par endroit quand on fait sa liste, en inventant une petite histoire : les poireaux sont en train de dormir au chaud sous la couette, la carotte lutte pour ne pas tomber au fond du trou, le brocoli se fait attaquer par les céréales qui veulent le noyer dans le bol, et le pâtisson prend sa douche. Et arrivé au marché, on refait le parcours en cherchant qui faisait la grasse mat’ puis celui qui était aux toilettes, etc.

Il est donc important, à mon avis, d’avoir plusieurs palais, et d’en changer fréquemment pour ne pas se mélanger avec la liste de la semaine dernière…

On peut également placer plusieurs objets dans une même pièce, voire dans un même endroit (si l’ordre n’a pas d’importance par exemple). Dans ce billet (mnemotechnics.org), l’auteur décrit (et illustre) comment il place 10 objets dans une même pièce.

Bon, tout ça c’est bien beau, mais on ne va pas mettre nos cartes et nos faces de rubik’s cube dans toute la maison. Ça ne nous aiderait pas mieux à retenir.

Des nombres aux mots

Pour retenir la liste des courses, la méthode du dessus est suffisante. Il suffit de créer des histoires les plus extraordinaires possibles, pour mieux les retenir. Mais pour retenir un numéro de téléphone ? les décimales de pi ? les cartes du paquet ?

Ben pour ça, il va falloir transformer ce que l’on veut retenir en une suite de chiffres, associer chaque chiffre à une lettre, chaque lettre à un mot, et placer ces mots aux quatre coins de la maison.

Des chiffres aux lettres

Non, pas des chiffres et des lettres. C’est autre chose ça.

Pour transformer les chiffres en lettre, il y a plusieurs méthodes, les plus connues étant le code chiffres-sons (!wfr) (ou Major System4, qui utilise toutes les consonnes (donc plusieurs pour un même chiffre) et rien que des consonnes) et le système Dominic (!wen) (ou Dominic System5, qui utilise voyelle et consonne).

Table 1: Chiffre -> lettre
  0 1 2 3 4 5 6 7 8 9
Major S,Z,Ce T,D N M R L CH,J,Ge K,G,Q F,V P,B
Dominic A B C D E S G H N O

L’avantage du premier est qu’il permet de transformer n’importe quel mot en suite de chiffre, et inversement.

Avec ces systèmes, on associe généralement un mot ou un nom (souvent les initiales Prénom Nom) à un nombre sur deux chiffres (de 00 à 99). Par exemple pour le code chiffres-sons, on peut associer PoPeye pour 99, le Père Noël pour 92, NeiGe pour 26, etc (on associe les sons, pas les lettres, donc NeiGe, c’est 26 et pas 27). Pour le système Dominic, on utilise quasiment que des initiales : Albert Einstein pour 04, George Bush pour 61 ou encore Barack Obama pour 19.

J’étais donc parti sur ce système, et étais passé à l’étape suivante, quand quelqu’un qui se reconnaîtra m’a dit que c’était pourri (uu) ; il valait mieux une seule lettre par chiffre.

Un coup de ddg.gg plus tard, me voilà avec les 10 consonnes les plus fréquentes en français, que j’organise comme je peux :

Table 2: Mon système chiffre -> lettre
Chiffres Mon système Mnémotechnique
0 C un 0 pas fermé
1 l 1 barre
2 n 2 barres
3 m 3 barres
4 R quasiment le miroir
5 S même forme
6 d miroir
7 t même forme
8 V 8 japonais à l’envers ?
9 p miroir

Et si je veux, je peux ajouter les consonnes restantes dans les cases pour retomber sur un semblant de code chiffres-sons6 (j’ai pas encore eu l’utilité, mais sait-on jamais).

Système PAO

J’étais parti pour me faire ma liste de 100 mots7, lorsque je suis tombé sur le système PAO, pour « Personne-Action-Objet8 ». Au lieu d’avoir un seul mot pour un nombre à deux chiffres, on en a trois ! Un nombre peut correspondre à une personne, une action, et un objet. Donc dans notre Memory Palace, on peut stocker trois fois plus d’informations, et éviter trop de répétitions !

Par exemple, avec le code chiffres-sons, on peut avoir Michaël Jackson, ManGer et MaGie qui sont codés avec 36, PoPeye, PaPouiller et PouPée qui sont codés avec 99, etc.

Lorsque l’on veut retenir une suite de nombre comme 99, 36, 99… on n’associe plus PoPeye, Michaël Jackson, PoPeye dans trois pièces de la maison, mais PoPeye qui ManGe une PouPée dans une seule pièce.

Là aussi, les approches Major/Dominic diffèrent : pour le premier cas, on va plutôt essayer de trouver des actions/objets de deux syllabes avec les consonnes correspondants aux chiffres (comme dans mon exemple : ManGer, PouPée). Dans le second, on va associer un verbe (et un objet, mais souvent le système, c’est juste PA, pas PAO) sans rapport avec le codage. Enfin pas tout à fait sans rapport. Le rapport, c’est que c’est relatif à la personne qui est codée : Albert Einstein (04) va écrire au tableau E=mc², Bill Gates (16) programme sur son PC… Pour retrouver 1604, on pensera alors à Bill Gates qui écrit sur un tableau noir.

J’ai commencé les deux méthodes, mais suis finalement resté sur la Major. Et puis, en lisant des commentaires sur le système Dominic, celui de RussellP (du 2012-11-26 09:37 UTC) a retenu mon attention. L’idée : utiliser des thèmes. Je me suis dit que ce serait sympa de faire ça, choisir un thème avec comme initiale la lettre correspondant aux dizaines. Pour les personnes, les actions, et les objets. Ça n’a pas été facile… Je ne suis pas encore totalement satisfait de tous mes thèmes et de leur contenu, mais rien que pour l’exercice, c’était sympa de le faire. Vous pouvez voir le résultat ici9 (version fontifyed).

Table 3: Les trois premiers thèmes pour les personnes
Thème Combat Lyrique aNimateur
  c (0.) l (1.) n (2.)
c (.0) Ken Cabrel Capello
l (.1) Li Long Lio Lagaf
n (.2) Nina NTM Nagui
m (.3) Mitrurugi Mc hammer Maïté
r (.4) Raphael Renaud Ruquier
s (.5) Cervantes Souchon Sébastien
d (.6) Dahlsim Dalida Damidot
t (.7) Taki Tupac Toesca/tex
v (.8) Voldo Voulzy Vandel
p (.9) Paul Piaf Ppda

Voilà, si vous lisez l’anglais, je vous conseille vivement les sites dans les notes de fin page, les wikis, fora, commentaires, etc. pour en apprendre un peu plus, et pourquoi pas pour vous y mettre et faire votre tableau :]

Et si vous connaissez déjà, si vous avez des suggestions, des commentaires, n'hésitez pas à m'envoyer un mail (sur free, on change le pénultième point par un @ (celui avant « free.fr ») et on a l'adresse mail qui correspond au site).

Bonus

Jetez également un coup d’œil à http://www.ludism.org/mentat/BrainTrainingGames pour entraîner votre mémoire. Le dual n-back est franchement pas facile, mais les études ont l’air de montrer que c’est efficace.

org-drill

Tout est expliqué sur worg : org-drill fonctionne comme les « flashcards » question d’un côté, réponse de l’autre. Pour réviser mes associations chiffre-mot, je me suis donc préparé un fichier pao-drill.org qui ressemble à :

* Personnes
** Item :drill:
   :PROPERTIES: 
   P-00
*** the answer
    Ken
** Item :drill:
   :PROPERTIES: 
   P-10
*** the answer
    Cabrel

Pour ça, je pars du fichier pao.org, et pour chaque tableau, je supprime les lignes et colonnes servant de repères. Puis je supprime le dernier caractère de chaque ligne (avec un C-x r k).

Et c’est parti pour deux macros (qui pourraient être regroupées en une seule, mais bon…) :

Mettre un couple nombre-mot par ligne

  • On prépare pour mettre le compteur sur deux chiffres : C-x C-k C-f %02d
  • On initialise le compteur à 00 : C-x C-k C-c 0
  • Pour chaque caractère |, on va aller à la ligne, et insèrer le compteur : F3 Cs | Enter Space F3 F4
  • On le fait pour tous les autres mots : M-99 F4

Mettre les items org-drill

Tiré de C-h l (sans les espaces) :

<f3> C-s | <return> <backspace> <return> ** Item :drill: <return> P - <delete> M-f <return> *** the answer <return> <delete> <f4> J’ai ajouté P- pour les personnes, A- et O- pour actions et objets pour être interrogé sur les trois tableaux à la fois.

Et là on se rend compte qu’on a oublié de faire M-x org-table-transpose-table-at-point sur les tableaux. Du coup, un petit C-M-%, on remplace ^\(.\)-\([0-9]\)\([0-9]\) par \1-\3\2 et le tour est joué.

Voilà, notre fichier est tout beau tout prêt. Pour s’en servir, M-x org-drill et c’est parti.

Comme je veux m’entraîner fréquemment, je me suis rajouté dans mon .emacs

(defun pao () "reviser son pao" (interactive) (find-file
  "~/.emacs.d/pao-drill.org") (org-drill) ) (global-set-key (kbd
  "<f11>") ’pao)

Raccourcis et fonctions

J’ai découvert C-u C-c C-x f S pour réorganiser les footnotes. Et j’utilise de plus en plus C-c C-x C-f pour mettre en gras, italique… C-c C-l pour insérer/éditer un lien, et le magique C-c C-c pour aller d’une note à sa définition et inversement. Et en essayant de voir si on pouvait augmenter le nombre de caractères stockés par C-h l, j’ai découvert open-dribble-file.

Footnotes:

1

En fait, j’avais déjà commencé à m’y intéresser, mais que vaguement. J’avais dans l’idée d’apprendre les départements avec leur numéro, et j’étais tombé sur ce site : http://villemin.gerard.free.fr/Wwwgvmm/MnemoTe/Departem.htm (que je connaissais déjà pour ses « curiosités » mathématiques, comme http://villemin.gerard.free.fr/Wwwgvmm/Decompos/Amiable.htm par exemple). Je m’étais également déjà renseigné sur le « palais de la mémoire » (en anglais memory palace cité dans des films ou des séries comme Sherlock ou The Mentalist). J’avais regardé comment font les gens qui font le rubik’s cube en aveugle. Et puis il y a eu quelque chose qui a fait que je me suis un peu plus penché sur la question. Mais… pas moyen de m’en souvenir :Þ

3

Qui font des choses encore plus incroyables, comme mémoriser 1000 chiffres en une heure, 10 paquets de cartes en une heure (Grand Master Memory (!wen), http://www.recordholders.org/en/list/memory.html), ou 44 nombres binaires en 1 secondes ! (http://blog.mnemotechnics.org/ramon-campayo-memorizing-binary-1333.html)

6

#+CAPTION: Mon système chiffre -> lettre avec toutes les lettres/sons

chiffres 0 1 2 3 4 5 6 7 8 9
lettres c l n m r s d t v p
ajouts k, q, g, x   gn     j, z, ch     w, f, b  
7

Si c’est ce que vous souhaitez faire, je conseille de prendre le plus possible 1 seule voyelle pour tous les mots (et d’utiliser toujours la même voyelle exception), comme expliqué ici. J’étais plutôt parti sur le son é lorsque j’ai commencé à essayer de faire ce tableau.

9

Si des gens sont tentés par l’aventure, mais sans les thèmes, j’ai mis quelques anciennes tentatives pour les systèmes classiques, et « mon » système, avec des liens divers (version fontifyed) et également dans ce fichier (fontifyed, intégré au blog) qui me sert de référence. J’y ai par exemple noté comment je retiens pi et les départements (ou plutôt comment je suis sensé m’en souvenir).

Emacs en vrac - 2

Rédigé par Fred - - Aucun commentaire

Montrer les raccourcis non terminés plus tôt, et leurs suites possibles

En mettant la variable echo-keystrokes à 0.1 (source : endlessparentheses), les raccourcis non terminés (C-x r par exemple) s’affichent plus tôt.

Dans un autre genre, mais toujours pour les raccourcis which-key est un mode mineur qui permet d’afficher les suites possibles à un raccourci, tout comme guide-key.

Questionnaire avec org-mode

Sacha Chua apprend le latin et a codé un questionnaire plutôt sympa. À mettre en relation avec [[http://orgmode.org/worg/org-contrib/org-drill.html][org-drill]].

Marquer seulement une partie d’un mot

Si on veut marquer un mot avec org-mode (par exemple pour une mise en *gras*), on est obligé de marquer le mot en entier. Une solution de contournement est d’insérer une espace de largeur zéro en unicode.

highlight-tail

Inutile, mais fun, highlight-tail est un mode qui change la couleur de fond des dernières lettres tapées pour donner ça.

Emacs en vrac - 1

Rédigé par Fred - - Aucun commentaire

buffer-flip, une sorte de alt-tab pour buffer

Un mode mineur qui permet de faire passer les buffers à la manière d'un Alt+Tab : https://github.com/killdash9/buffer-flip.el

Ça utilise key-chord.

(Via http://rubikitch.com/2015/11/19/buffer-flip/)

Python profiling

Julien Danjou explique comment mesurer et analyser le temps d’exécution d’un programme python grâce à cProfile et KCacheGrind.

https://julien.danjou.info/blog/2015/guide-to-python-profiling-cprofile-concrete-case-carbonara

Prendre des notes avec PDF-tools

PDF Tools permet de voir des PDF dans un buffer, de faire des recherches, suivre un lien, mettre des annotations, et plein d’autres choses. Matt Price en parle dans son blog, et montre comment exporter les annotations pour org-mode.

Via http://irreal.org/blog/?p=4727

Changer de fenêtres, de façon visuelle

Une alternative à ace-jump, pour passer d’une fenêtre à l’autre quand on fait un C-x o : switch-window

Changer les caractères utilisés pour l’ellipse par org-mode

Artur Malabarba explique que le ... à la fin des headlines est personnalisable grâce à la variable org-ellipsis. J'ai donc changé ... par

http://endlessparentheses.com/changing-the-org-mode-ellipsis.html

autotetris-mode

Emacs permet de jouer à tetris avec M-x tetris. autotetris-mode permet de faire jouer une IA.

Indiquer la fin du buffer

La variable toggle-indicate-empty-lines permet de mettre dans la marge un symbole pour indiquer la fin du fichier. Voir aussi Fringe-Bitmaps (emacs lisp manual)

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)

Récupérer les images d’une galerie en python

Rédigé par Fred - - Aucun commentaire

Quand je veux récupérer plusieurs pages, je le fais souvent avec wget. L’utilisation des options --load-cookies, --save-cookies et --keep-session-cookies avec --post-data étant plus que pratique. Pour parser, ensuite, c’est souvent pénible, même si awk est là pour aider.

man wget donne :

# Log in to the server.  This can be done only once.
 wget --save-cookies cookies.txt \
      --post-data 'user=foo&password=bar' \
      http://server.com/auth.php

 # Now grab the page or pages we care about.
 wget --load-cookies cookies.txt \
      -p http://server.com/interesting/article.php

Pour parser, j’aime bien python ; je trouve ça plus lisible. Par contre, ce que j’utilisais jusqu’à présent pour me logguer sur une page était moins glop :

import urllib, urllib2, cookielib

username = 'foo'
password = 'bar'

cj = cookielib.CookieJar()
handle = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'username' : username, 'pwd' : password})
handle.open('http://www.example.com/login.php', login_data)
res = handle.open('http://www.example.com/my_account.php')
print res.read()

Mais ça, c’était avant. Depuis, j’ai découvert Requests. Pour faire un POST, c’est aussi simple que :

import requests

url= 'http://www.example.com/login.php'
login_data = {username = 'myuser', password = 'mypassword'}

req = requests.post(url, login_data)
page = req.content

Si on a besoin de gérer les cookies, on peut passer par une Session :

import requests

url= 'http://www.example.com'
login_data = {username = 'myuser', password = 'mypassword'}

s = requests.Session()
req = s.post(url + '/login.php', login_data)
req = s.get(url + '/my_account.php')

C’est quand même plus lisible, non ?

En fait, récemment, je voulais parcourir les images de la galerie d’un site. Mais cette galerie contenait 10 images seulement par page, pour 40 pages. J’ai donc fait un script pour mettre toutes les images sur une seule page.

Les images sont encapsulées par une balise a class="foo" et donc j’utilise BeautifulSoup pour toutes les lister (soup.findAll("a","foo")).

Comme j’ai « besoin » de consulter les images plusieurs fois, j’ai préféré enregistrer les images en local plutôt que de laisser un lien sur le site. Pour ça j’ai utilisé stream=True de la méthode .get (cf ce lien sur SO).

J’ai pas fait très propre puisque j’affiche la page sur stdout que je pipe avec tee pour mettre dans un fichier. Mais au moins, je vois si ça marche :þ

# -*- coding: utf-8 -*-
from BeautifulSoup import BeautifulSoup
from requests import session

login_data = { 'login': 'fredtantini', 
               'password': 'toto1234',
               'action': 1 }

urlToVisit = 'http://www.example.com'

#on ouvre une session
with session() as s:
    #on se connecte
    req = s.post(urlToVisit + '/login.php', data=login_data)
    print "<html><body>"
    #comme je sais qu’il y a 40 pages
    for nPage in xrange(1,41):
        #on récupère la page
        request = s.get(urlToVisit + '/some_page.php?p='+str(nPage))
        #que l’on passe à BS
        soup = BeautifulSoup(request.text)    
        print "<h1> Page - ",nPage,"</h1>"
        #Pour tous les liens
        for i in soup.findAll("a","foo"):
            #on récupère l’image
            r = s.get(urlToVisit + '/' + i.img['src'], stream=True)
            #on la télécharge par parties (cf lien SO plus haut)
            if r.status_code == 200:
                with open(i.img['alt'] + ".jpg", 'wb') as f:
                    for chunk in r.iter_content():
                        f.write(chunk)
            print str(i).replace('./images/', './')

print "</body></html>"

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.

Fil RSS des articles de ce mot clé