Emacs en vrac - 3
Rédigé par Fred - - Aucun commentaireQuelques liens emacs dans le désordre, parce que ça faisait longtemps.
Quelques liens emacs dans le désordre, parce que ça faisait longtemps.
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 :
.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 :
pymotw
)année/mois/jour
(comme pour l’article
Encoder avec mencoder
).
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.
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.
Même si mon processus est maintenant plus fluide, il reste dans l’idéal des améliorations à apporter :
drawer
dans les articles créés dans le fichier pour
pouvoir réutiliser le même idRien de bien méchant, mais l’utilisation n’en serait que plus agréable.
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 !
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
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.
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
.
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) :
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;
~/.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.
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.
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)
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.
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.
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.
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).
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 :
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).
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).
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).
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.
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…) :
C-x C-k C-f %02d
C-x C-k C-c 0
|
, on va aller à la ligne, et insèrer le compteur :
F3 Cs | Enter Space F3 F4
M-99 F4
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)
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
.
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 :Þ
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)
voir http://www.ludism.org/mentat/MajorSystem et http://mnemotechnics.org/wiki/Major_System (en anglais tous les deux)
voir http://www.ludism.org/mentat/DominicSystem et http://mnemotechnics.org/wiki/Dominic_System (en anglais tous les deux)
#+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 |
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.
Si des gens sont tentés par l’aventure, mais sans les thèmes, j’ai mis quelques anciennes tentatives là 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).
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.
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]]
.
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.
Inutile, mais fun, highlight-tail est un mode qui change la couleur de fond des dernières lettres tapées pour donner ça.
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.
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
Une alternative à ace-jump, pour passer d’une fenêtre à l’autre quand on fait un C-x o : switch-window
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
Emacs permet de jouer à tetris avec M-x tetris. autotetris-mode permet de faire jouer une IA.
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)
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)
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>"
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 :
eval-after-load
pour exécuter du code une fois.
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.