Gravando um screencast GIF do Emacs

35

Eu vejo muitas pessoas postando GIFs animados mostrando os recursos do Emacs, mas não vi um bom caminho para criar um. Existe algum código que tente vincular os quadros-chave do gif a pressionamentos de tecla no Emacs? Existe algum pacote ou função elisp para automatizar o processo? Eu adoraria poder pressionar uma tecla para iniciar a gravação, pressione-a novamente para parar e solicite um nome de arquivo para salvar o gif.

Pergunta relacionada, existe um pacote para gravar screencasts mais longos no Emacs?

dgtized
fonte
90% da questão está fora de tópico - perguntando sobre ferramentas para criar GIFs animados (do Emacs ou qualquer outra coisa). A única parte do tópico é solicitar o código Elisp para automatizar esse processo. Considere editar o título e o corpo da pergunta para perguntar apenas a última: código Elisp para facilitar a criação de GIFs animados.
Tirou
Se você está procurando uma alternativa para o Windows, o ScreenToGif (consulte screentogif.codeplex.com) pode ser seu amigo. É um executável que permite enquadrar uma parte da tela com eficiência, gravá-la, editá-la com texto ou excluir quadros ou acelerar ou acelerar, ou diminuir a velocidade, se desejar. Eu o uso nos meus screencasts.
ReneFroger

Respostas:

24

Sim, existe um pacote para gravar screencasts no Emacs, chamado

camcorder.el

Ainda não posso prometer nada, já que o testei apenas no meu computador, mas posso dizer que funciona para mim. :-)

  • Para usá-lo, basta ligar M-x camcorder-record.
  • Um novo quadro menor aparecerá e a gravação será iniciada.
  • Quando terminar, pressione F12e aguarde a conclusão da conversão.

Screencasts podem ser gerados em qualquer formato entendido por imagemagick's convertcomando. Você pode até pausar a gravação com F11!

Se você deseja gravar sem um quadro pop-up, use M-x camcorder-mode.

Dependências

Para a gravação, camcorder.eluse os seguintes utilitários linux. Se você os tiver, deve funcionar imediatamente. Se você usar outra coisa, ainda poderá fazê-lo funcionar configurando a camcorder-recording-commandvariável.

  • recordmydesktop
  • mplayer
  • imagemagick

Solução de problemas

Na minha máquina, notei que o Emacs de id de janela relatado com

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

diferia do ID que o WM relatou com o wminfoutilitário.

Eu adicionei a variável camcorder-window-id-offsetpara corrigir isso. O valor padrão é -4, mas pode ser necessário aumentar ou diminuir o valor para que esses dois números correspondam.

Malabarba
fonte
Puramente porque todas as outras respostas usaram ou mencionaram Byzanz, estou curioso para saber por que você a rejeitou? (a favor do recordmydesktop, ao que parece).
precisa
@phils Não consegui que o byzanz trabalhasse com duração variável, tive que dar uma duração pré-determinada. O recordmydesktop trabalha com sinais de morte.
Malabarba
Eu costumava xwininfodeterminar o ID correto a ser usado (não tenho um wminfono meu sistema).
YoungFrog
Também notei versões mais recentes do uso da câmera de vídeo outer-window-id(em vez de window-id) e não há mais necessidade de compensação, mas essa alteração ainda não está estável no melpa.
YoungFrog
11
@YoungFrog obrigado pelo lembrete. Empurrei uma versão estável agora.
Malabarba 18/03
20

Publiquei uma pergunta semelhante no / r / Emacs .

Para gravar GIFs, suas principais opções são:

  • 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 e OS X)
  • ffmpeg / avconv (avconv é um fork do ffmpeg):
$ avconv -y -video_size 200x100 -f x11grab -i :0.0+0,50 frame-%04d.gif
$ gifsicle --loop -O3 -d5 frame-*.gif > emacs.gif

Para mostrar as teclas digitadas, você só precisa de um aplicativo que mostre as teclas digitadas. O key-mon fornece um aplicativo GUI para isso. Obviamente, existe um modo Emacs para mostrar as teclas pressionadas: command-log-mode .

Wilfred Hughes
fonte
Você poderia se aprofundar um pouco nesses comandos? Com que frequência os quadros são capturados com isso?
Malabarba
5

Eu usei o Byzanz para gerar todos os meus GIFs. Gravo com uma tela para executar o byzanzcomando, uma para gravação. Alguns exemplos estão no meu guia aqui .

Tu Do
fonte
4

Eu usei o Byzanz para gravar gifs

Instale-o primeiro, coloque este trecho em rr (região de registro) no seu $ 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

e isso em rw (janela de registro) em seu $ 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

Agora você pode usar rr e rw para gravar região / janela em gifs (você pode alterar a hora e a posição de acordo com suas necessidades).

CodyChan
fonte
Ele suporta gravação e exibição de teclas?
erjoalgo 26/06
@erjoalgo não, não exibe as teclas digitadas.
CodyChan 26/06
2

Mais uma opção usando o QuickTime player (funciona no OSX, não sei no Windows). Os requisitos são: ffmpegegifsicle

  • Abra o QuickTime e inicie Arquivo -> Nova gravação de tela
  • Quando terminar Arquivo -> Exportar -> Como filme com a opção de qualidade total
  • Agora converta sua conversão de tela com este comando:
    • ffmpeg -i yourscreen.mov -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > out.gif
Enrico Pirani
fonte