Enregistrer une capture d'écran GIF d'Emacs

35

Je vois beaucoup de gens poster des GIF animés présentant les fonctionnalités d'Emacs, mais je n'ai pas vu une belle promenade pour en créer une. Existe-t-il un code qui tente de lier les images clés du gif aux touches utilisées dans Emacs? Existe-t-il des packages ou des fonctions elisp pour automatiser le processus? J'adorerais pouvoir appuyer sur une touche pour commencer l'enregistrement, appuyez à nouveau dessus pour l'arrêter et demandez-lui un nom de fichier pour enregistrer le gif.

Question connexe, existe-t-il un package pour enregistrer des screencasts plus longs à partir d’Emacs?

dédoublé
la source
90% de la question est hors sujet - poser des questions sur les outils permettant de créer des GIF animés (d'Emacs ou autre). La seule partie du sujet demande à un code Elisp d'automatiser ce processus. Envisagez de modifier le titre et le corps de la question pour ne poser que celui-ci: Code Elisp pour faciliter la création de fichiers GIF animés.
Drew
Si vous cherchez une alternative à Windows, ScreenToGif (voir screentogif.codeplex.com) pourrait être votre ami. C'est un exécutable qui vous permet de speficiy de cadrer une partie de votre écran, de l'enregistrer, de le modifier avec du texte, de supprimer des cadres, de l'accélérer ou de le ralentir si vous le souhaitez. Je l'utilise pour mes screencasts.
ReneFroger

Réponses:

24

Oui, il y a un paquet pour enregistrer des screencasts dans Emacs, ça s'appelle

camcorder.el

Je ne peux rien promettre pour l'instant, car je ne l'ai testé que sur mon ordinateur, mais je peux vous dire que cela fonctionne pour moi. :-)

  • Pour l'utiliser, il suffit d'appeler M-x camcorder-record.
  • Un nouveau cadre plus petit apparaîtra et l'enregistrement commencera.
  • Lorsque vous avez terminé, appuyez sur F12et attendez la fin de la conversion.

Les screencasts peuvent être générés dans n’importe quel format compris par imagemagickla convertcommande de. Vous pouvez même mettre l'enregistrement en pause avec F11!

Si vous souhaitez enregistrer sans cadre contextuel, utilisez M-x camcorder-mode.

Les dépendances

Pour l’enregistrement, camcorder.elutilise les utilitaires Linux suivants. Si vous en avez, cela devrait fonctionner en dehors de la boîte. Si vous utilisez autre chose, vous devriez toujours pouvoir le faire fonctionner en configurant la camcorder-recording-commandvariable.

  • recordmydesktop
  • mplayer
  • imagemagick

Dépannage

Sur ma machine, j’ai remarqué que l’identifiant de la fenêtre, Emacs, avait

(format "%x" 
 (string-to-number
  (frame-parameter (selected-frame) 'window-id)))

diffère de l'id que le WM a rapporté avec l' wminfoutilitaire.

J'ai ajouté la variable camcorder-window-id-offsetpour corriger cela. La valeur par défaut est -4, mais vous devrez peut-être augmenter ou diminuer cette valeur pour faire correspondre ces deux nombres.

Malabarba
la source
Simplement parce que toutes les autres réponses utilisées ou mentionnées par Byzanz, je suis curieux de savoir pourquoi vous l’avez rejetée? (en faveur de recordmydesktop, semble-t-il).
phils
@phils Je ne pouvais pas faire travailler Byzanz avec une durée variable, je devais lui donner une durée prédéterminée. recordmydesktop fonctionne avec des signaux de suppression.
Malabarba
J'avais l'habitude xwininfode déterminer le bon ID à utiliser (je n'en ai pas wminfosur mon système).
YoungFrog
J'ai également remarqué que de nouvelles versions de caméscopes étaient utilisées outer-window-id(au lieu de window-id) et qu'un décalage n'était plus nécessaire, mais ce changement n'a pas encore abouti sur melpa-stable.
YoungFrog
1
@YoungFrog merci pour le rappel. J'ai poussé une version stable maintenant.
Malabarba
20

J'ai posté une question similaire sur / r / Emacs .

Pour enregistrer des fichiers GIF, vos principales options sont les suivantes:

  • byzanz-record:
# 12 second duration, top left corner, 700x800 pixel gif
$ byzanz-record -d 12 -x 0 -y 0 -w 900 -h 700 output.gif
# more documentation at https://wiki.ubuntu.com/CreatingScreencasts
  • LICEcap (Windows et OS X)
  • ffmpeg / avconv (avconv est un fork de ffmpeg):
$ avconv -y -video_size 200x100 -f x11grab -i :0.0+0,50 frame-%04d.gif
$ gifsicle --loop -O3 -d5 frame-*.gif > emacs.gif

Pour afficher les séquences de touches, vous avez simplement besoin d’une application qui affiche les séquences de touches. key-mon fournit une application graphique pour cela. Il existe bien sûr un mode Emacs pour afficher les touches enfoncées: mode Journal de commandes .

Wilfred Hughes
la source
Pourriez-vous expliquer un peu ces commandes? À quelle fréquence les images sont-elles capturées avec cela?
Malabarba
5

J'ai utilisé Byzanz pour générer tous mes GIF. J'enregistre avec un écran pour exécuter la byzanzcommande, un pour l'enregistrement. Quelques exemples sont dans mon guide ici .

Tu Do
la source
4

J'ai utilisé Byzanz pour enregistrer des gifs

Installez-le d'abord, mettez cet extrait dans rr (région d'enregistrement) dans votre $ PATH:

#!/bin/bash
# record screencast of a region into a gif using `byzanz-record`

# Delay before starting
DELAY=5

# Sound notification to let one know when recording is about to start (and ends)
beep() {
    paplay /usr/share/sounds/KDE-Im-Irc-Event.ogg &
}

printf "usage: rr [time] [file]\n"

# Duration and output file
if [ $# -gt 0 ]; then
    D="--duration=$@"
else
    echo Default recording duration 10s to $HOME/recorded.gif
    D="--duration=10 $HOME/rarecorded.gif"
fi

# xrectsel from https://github.com/lolilolicon/xrectsel
ARGUMENTS=$(xrectsel "--x=%x --y=%y --width=%w --height=%h") || exit -1

echo Delaying $DELAY seconds. After that, byzanz will start
for (( i=$DELAY; i>0; --i )) ; do
    echo $i
    sleep 1
done
beep
byzanz-record --verbose --delay=0 ${ARGUMENTS} $D
beep

et cela dans rw (fenêtre d'enregistrement) dans votre $ PATH:

#!/bin/bash
# record screencast of a region into a gif using `byzanz-record`

# Delay before starting
DELAY=5

# Sound notification to let one know when recording is about to start (and ends)
beep() {
    paplay /usr/share/sounds/KDE-Im-Irc-Event.ogg &
}

printf "usage: rr [time] [file]\n"

# Duration and output file
if [ $# -gt 0 ]; then
    D="--duration=$@"
else
    echo Default recording duration 10s to $HOME/recorded.gif
    D="--duration=10 $HOME/rarecorded.gif"
fi


XWININFO=$(xwininfo)
read X < <(awk -F: '/Absolute upper-left X/{print $2}' <<< "$XWININFO")
read Y < <(awk -F: '/Absolute upper-left Y/{print $2}' <<< "$XWININFO")
read W < <(awk -F: '/Width/{print $2}' <<< "$XWININFO")
read H < <(awk -F: '/Height/{print $2}' <<< "$XWININFO")

echo Delaying $DELAY seconds. After that, byzanz will start
for (( i=$DELAY; i>0; --i )) ; do
    echo $i
    sleep 1
done
beep
byzanz-record --verbose --delay=0 ${ARGUMENTS} $D
beep

Vous pouvez maintenant utiliser rr et rw pour enregistrer une région / une fenêtre sur des gifs (vous pouvez modifier l'heure et la position en fonction de vos besoins).

CodyChan
la source
Est-ce qu'il prend en charge l'enregistrement et l'affichage des frappes?
erjoalgo
@erjoalgo Nope, il n'affiche pas les frappes.
CodyChan
2

Une option supplémentaire avec le lecteur QuickTime (cela fonctionne sous OSX, je ne sais pas sous Windows). Les conditions requises sont: ffmpegetgifsicle

  • Ouvrez QuickTime et démarrez Fichier -> Nouvel enregistrement d'écran
  • Lorsque vous avez terminé Fichier -> Exporter -> En tant que film avec une option de qualité complète
  • Convertissez maintenant votre distribution d'écran avec cette commande:
    • ffmpeg -i yourscreen.mov -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > out.gif
Enrico Pirani
la source