Você pode ativar / (trazer para a frente) o emacs usando o elisp nativo? (por exemplo, ao trabalhar em outro programa)

16

Eu quero forçar o emacs a ser ativado, ser comprado para ser usado e 'roubar' o foco em determinadas circunstâncias. Por exemplo, quando eu termino um org-Pomodoro ou durante um lembrete de compromisso importante.

Agora, estou procurando uma maneira 'nativa' de fazer isso, apenas para reduzir dependências externas. (apenas o Linux é bom para mim, a plataforma cruzada seria melhor).

Isso é tecnicamente possível a partir do emacs?

Solução:

Se você estiver usando a GUI, isso funcionará bem:

(x-focus-frame nil)

[Por razões históricas ...] Eu tentei:

Visibilidade do quadro (não funciona)

(make-frame-visible)

E também:

(make-frame-invisible)
(make-frame-visible)

Mas estes parecem funcionar apenas se o Emacs já estiver ativado.

Elevação de quadro (não funciona)

O quadro mais baixo parece realmente ocultar o emacs.

(lower-frame)

Mas elevar o quadro de um temporizador não. Ou seja, nada acontece.

(raise-frame)

Parece que falta um 'ativar-emacs' antes de aumentá-lo.

[NOTA sobre solução externa]

Atualmente, como (solução alternativa / solução?) Eu uso um pouco do elisp:

(call-process "activateEmacs")

E o respectivo script bash: (pode ser necessário instalar o xdotool no seu sistema primeiro)

#!/bin/sh 
sleep 0.5
xdotool search --onlyvisible --class emacs windowactivate
Leo Ufimtsev
fonte
4
Tente raise-frame.
Tom tromey
Obrigado pela sugestão. abaixar o quadro funciona, mas elevar o quadro não o aumenta novamente por algum motivo?
Leo Ufimtsev
Acredito que o TomTromey está correto. Você pode testar da seguinte maneira. Primeiro, crie um temporizador de inactividade: (defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame)))). Suspenda o quadro com M-x (suspend-frame). Em 5 segundos, esse quadro reaparecerá.
Dan
Bem, funciona se você (suspend-frame)e esperar lá sem clicar em outra janela. Mas se você suspender o quadro e continuar trabalhando em outro aplicativo, o emacs não reaparecerá. Pelo menos não no meu sistema (fedora 21 com o Mate desktop). Um exemplo simples é este: : (run-at-time "5 sec" nil '(lambda () (interactive) (message "trying to raise frame") (raise-frame)))execute isso e pressione a tecla Alt-tab em outro aplicativo. A mensagem aparecerá no buffer, mas o emacs não será gerado ... Pensamentos?
Leo Ufimtsev
1
Estou usando a versão Gui do emacs? (não a versão do terminal), você também estava usando o GUI?
Leo Ufimtsev

Respostas:

16

Se você estiver usando um sistema de janelas, poderá usá-lo x-focus-frame.

Nota:

  • x-focus-frame funciona para Windows e Linux
  • antes do Emacs 23.1, use w32-focus-frameno Windows.
TaylanUB
fonte
sim, de fato. (x-focus-frame nil) aumenta a janela do emacs. Arrumado!
Leo Ufimtsev
1

Quer (x-focus-frame nil)ou (other-frame 0)vai fazê-lo. Não tenho certeza se existe alguma diferença de comportamento entre os dois.

Brian Z
fonte