Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ouverture de fichier en mode Markdown

5 réponses
Avatar
Jean-Yves Baudais
Bonjour,
J'ouvre les fichiers .md automatiquement en mode Markdown
(markdown-mode.el version 2.3 de 2017). Par défaut les fichiers
s'ouvrent en mode "SHOW ALL" qui correspond Í 
"markdown-cycle-global-status 1". Et le changement de mode se fait avec
"shifttab".
Je souhaiterais une ouverture directement dans un autre mode, genre
"OVERVIEW" ou "CONTENT", et lÍ , ça dépasse largement mes compétences...
Auriez-vous une idée de code pour changer le mode d'affichage
automatiquement Í  l'ouverture des fichiers ?

-- Jean-Yves

5 réponses

Avatar
Damien Wyart
Bonjour,
* Jean-Yves Baudais in fr.comp.applications.emacs:
J'ouvre les fichiers .md automatiquement en mode Markdown
(markdown-mode.el version 2.3 de 2017). Par défaut les fichiers
s'ouvrent en mode "SHOW ALL" qui correspond Í 
"markdown-cycle-global-status 1". Et le changement de mode se fait
avec "shifttab".
Je souhaiterais une ouverture directement dans un autre mode, genre
"OVERVIEW" ou "CONTENT", et lÍ , ça dépasse largement mes
compétences...
Auriez-vous une idée de code pour changer le mode d'affichage
automatiquement Í  l'ouverture des fichiers ?

J'ai testé quelques approches, et finalement, je propose ceci :
(add-hook 'markdown-mode-hook
(lambda () (markdown-cycle t)))
Pour passer en mode CONTENTS directement, il faut appeler la fonction 2 fois :
(add-hook 'markdown-mode-hook
(lambda () (progn
(markdown-cycle t)
(markdown-cycle t))))
Cela va s'appliquer globalement, donc si on veut ce comportement
seulement sur certains fichiers, ça serait plus complexe...
--
DW
Avatar
Jean-Yves Baudais
Bonjour,
Le 08/12/2020 Í  07:57, Damien Wyart a écrit :
[...]
Pour passer en mode CONTENTS directement, il faut appeler la fonction 2 fois :
(add-hook 'markdown-mode-hook
(lambda () (progn
(markdown-cycle t)
(markdown-cycle t))))
Cela va s'appliquer globalement, donc si on veut ce comportement
seulement sur certains fichiers, ça serait plus complexe...

Non, non, je souhaite la même chose pour tous les fichiers *.md. Merci
pour le code, c'est exactement ce que je souhaitais :-)
--Jean-Yves
Avatar
Jean-Yves Baudais
Bonjour,
Le 08/12/2020 Í  07:57, Damien Wyart a écrit :
Pour passer en mode CONTENTS directement, il faut appeler la fonction 2 fois :
(add-hook 'markdown-mode-hook
(lambda () (progn
(markdown-cycle t)
(markdown-cycle t))))

J'ai quand même réussi un truc malgré mon ignorance :
"markdown-shifttab" Í  la place de "markdown-cycle t". Dans les deux cas,
ça fonctionne si j'ouvre le fichier au lancement d'Emacs (sous un shell
: "emacs monfichier.md").
Par contre si j'ouvre un fichier markdown Í  partir d'Emacs avec CTRL-X
CTRL-F, il s'ouvre en mode OVERVIEW et pas CONTENTS. (Sans le hook, ça
s'ouvre toujours en mode SHOW ALL.) Dans le buffer *Messages*, j'ai
OVERVIEW [2 times]
Í  la place de
OVERVIEW
CONTENTS
Une idée pour corriger ça ?
--Jean-Yves
Avatar
Damien Wyart
Bonjour,
* Jean-Yves Baudais in fr.comp.applications.emacs:
J'ai quand même réussi un truc malgré mon ignorance :
"markdown-shifttab" Í  la place de "markdown-cycle t".

Je préfère ma version :)
En effet, j'avais bien vu que S-TAB est mappé sur markdown-shifttab,
mais sa définition est la suivante :
,----
| (defun markdown-shifttab ()
| "Handle S-TAB keybinding based on context.
| When in a table, move backward one cell.
| Otherwise, cycle global heading visibility by calling
| `markdown-cycle' with argument t."
| (interactive)
| (cond ((markdown-table-at-point-p)
| (call-interactively #'markdown-table-backward-cell))
| (t (markdown-cycle t))))
`----
donc quand on est Í  l'intérieur d'un tableau, on se déplace Í  la cellule
précédente. Vu que la demande initiale était de changer le mode
d'affichage inconditionnellement, j'ai repris directement
(markdown-cycle t) dans mon hook.
Dans les deux cas, ça fonctionne si j'ouvre le fichier au lancement
d'Emacs (sous un shell : "emacs monfichier.md"). Par contre si j'ouvre
un fichier markdown Í  partir d'Emacs avec CTRL-X CTRL-F, il s'ouvre en
mode OVERVIEW et pas CONTENTS.
(Sans le hook, ça s'ouvre toujours en mode SHOW ALL.) Dans le buffer
*Messages*, j'ai OVERVIEW [2 times]
Í  la place de
OVERVIEW
CONTENTS

Effectivement, je reproduis bien le problème. La partie de la fonction
markdown-cycle qui nous intéresse fait ceci :
,----
| (cond
| ;; Move from overview to contents
| ((and (eq last-command this-command)
| (eq markdown-cycle-global-status 2))
| (outline-hide-sublevels 1)
| (message "CONTENTS")
| (setq markdown-cycle-global-status 3)
| (markdown-outline-fix-visibility))
| ;; Move from contents to all
| ((and (eq last-command this-command)
| (eq markdown-cycle-global-status 3))
| (outline-show-all)
| (message "SHOW ALL")
| (setq markdown-cycle-global-status 1))
| ;; Defaults to overview
| (t
| (outline-hide-body)
| (message "OVERVIEW")
| (setq markdown-cycle-global-status 2)
| (markdown-outline-fix-visibility))))
`----
et donc j'ai l'impression que dans le cas C-x C-f la condition
(eq last-command this-command) n'est pas vérifiée. Je n'ai pas
d'explication et j'avoue que je suis pas enthousiaste pour
débugguer ça :)
Une idée pour corriger ça ?

Je propose donc ceci, moins élégant car on duplique du code, mais qui
fonctionne dans tous les cas (j'avoue que pour ma première version, je
n'avais testé que le chargement initial).
(add-hook 'markdown-mode-hook
(lambda () (progn
(outline-hide-sublevels 1)
(message "CONTENTS")
(setq markdown-cycle-global-status 3)
(markdown-outline-fix-visibility))))
(on peut éventuellement supprimer la ligne message si on n'en a pas l'utilité)
En espérant que cela fonctionnera bien aussi de votre cÍ´té :)
--
DW
Avatar
Jean-Yves Baudais
Bonjour,
Le 11/12/2020 Í  17:30, Damien Wyart a écrit :
* Jean-Yves Baudais in fr.comp.applications.emacs:
J'ai quand même réussi un truc malgré mon ignorance :
"markdown-shifttab" Í  la place de "markdown-cycle t".

Je préfère ma version :)

J'abdique :-)
[...]
Je propose donc ceci, moins élégant car on duplique du code, mais qui
fonctionne dans tous les cas (j'avoue que pour ma première version, je
n'avais testé que le chargement initial).
(add-hook 'markdown-mode-hook
(lambda () (progn
(outline-hide-sublevels 1)
(message "CONTENTS")
(setq markdown-cycle-global-status 3)
(markdown-outline-fix-visibility))))
(on peut éventuellement supprimer la ligne message si on n'en a pas l'utilité)
En espérant que cela fonctionnera bien aussi de votre cÍ´té :)

Ben non ça ne fonctionne pas. Le message d'erreur Í  l'ouverture d'un
fichier .md (ouverture sous emacs ou au lancement d'emacs) est
| File mode specification error: (void-function outline-hide-sublevels)
... mais j'ai débuggé ! Si, si ! J'ai donc recherché la fonction fautive
dans mon markdown-mode.el et il y a
| ;; Use new names for outline-mode functions in Emacs 25 and later.
| (eval-and-compile
| (defalias 'markdown-hide-sublevels
| (if (fboundp 'outline-hide-sublevels)
| 'outline-hide-sublevels
| 'hide-sublevels))
| ...
et c'est markdown-hide-sublevels qui est utilisé dans la définition de
la fonction markdown-cycle. J'ai donc remplacé outline-hide-sublevels
par markdown-hide-sublevels dans le hook et tout-y-l'est-nickel.
Merci,
--Jean-Yves