Obtendo o wmctrl para trabalhar com várias janelas do Emacs

4

Estou tentando escrever um script que muda o foco para o Emacs. Isso é o que eu tenho:

#!/bin/bash
wmctrl -a 'emacs@pat-ubuntu-desktop'

Funciona bem quando há apenas uma janela do Emacs (ou "frame", no jargão do Emacs) aberta, mas não faz nada quando várias janelas do Emacs estão abertas. O problema parece ser que os títulos das janelas mudam quando uma segunda janela é aberta. Quando há uma única janela aberta, seu nome é emacs@pat-ubuntu-desktop :

➜  ~  wmctrl -l
0x05c000a3  0 pat-ubuntu-desktop emacs@pat-ubuntu-desktop

Mas quando abro uma segunda janela, os títulos das janelas mudam:

➜  ~  wmctrl -l
0x05c000a3  0 pat-ubuntu-desktop *scratch*
0x05c00921  0 pat-ubuntu-desktop *scratch*

EDITAR : A seguinte questão foi ilusória, o resultado do meu navegador ter "emacs" em seu título (porque eu estava pesquisando informações sobre o meu primeiro problema).

Outra questão (talvez relacionada, talvez não), é que mesmo quando há apenas uma única janela do Emacs aberta, o comando wmctrl -a 'emacs' não funciona, mas wmctrl -a 'emacs@' (ou wmctrl -a 'emacs@pat-ubuntu-desktop' ) não funciona . Por que o @ deve ser incluído?

    
por Patrick Brinich-Langlois 17.06.2013 / 00:33

2 respostas

1

A correspondência no título da janela não é muito confiável. Por exemplo, se você estiver visualizando essa pergunta no seu navegador, wmctrl -a 'emacs' poderá ativar seu navegador.

Você pode personalizar o formato de título do frame com frame-title-format . Eu uso (multiple-frames "%b" ("" invocation-name "@" system-name)) . Mas eu não recomendo contar com isso em seu script.

Você pode dizer a wmctrl para procurar uma janela por classe com a opção -x . Isso é simples e confiável.

wmctrl -x -a Emacs

Como alternativa, você pode fazer o Emacs fazer o trabalho . Isso dá a você uma chance melhor de escolher o "melhor" quadro quando houver vários quadros ativos.

    
por 18.06.2013 / 02:29
2

Se você quiser apenas mudar o foco, por que não usar o emacsclient?

emacsclient --eval '(select-frame-set-input-focus (selected-frame))'

Se você deseja abrir um arquivo ao mesmo tempo, pode até usar

emacsclient -n FILE

Se você precisar usar wmctrl por outros motivos, eu acho que você pode obter (emacs-pid) , (frame-parameter frame 'display) , (frame-parameter frame 'window-id) , etc. por emacsclient e então alimentá-los com wmctrl .

Veja também: link

    
por 17.06.2013 / 07:45