Por que o gedit continua abrindo aleatoriamente novas instâncias ao abrir arquivos do nautilus?

32

Ah, como eu amo o Ubuntu e todos os seus recursos, mas esse "bug" me deixa com raiva há tanto tempo e finalmente decidi pedir ajuda aqui.

Atribuí todos os .phparquivos a serem abertos com o gedit sempre que clicar duas vezes neles no nautilus. Agora, o comportamento é estranho.

  1. Não tenho gedit em execução
  2. Clico duas vezes em um arquivo para ser aberto
  3. Uma janela do gedit é aberta e o arquivo é carregado
  4. Clico duas vezes em outro arquivo a ser aberto

Agora, existem 2 resultados possíveis:

5A) O arquivo é aberto na mesma janela do gedit em uma nova guia

5B) O arquivo é aberto em uma nova janela do gedit, resultando em 2 gedits em execução.

Se A ou B acontece, parece totalmente aleatório e continua infinitamente. Isso significa que clico duas vezes em 100 arquivos e posso acabar com 60 gedits, alguns dos quais com 1 aba, outros com 2 abas, outros com 3 abas ...

Isso é extremamente irritante e uma correção para isso seria muito apreciada. Alguém já tentou corrigir esse problema?

Isso aconteceu no Ubuntu 10.04, 10.10 e 11.10. Todas as versões do Ubuntu que eu já testei.

Richard Rodriguez
fonte

Respostas:

39

Por quê...

gedit possui um algoritmo bastante interessante para determinar se abre uma nova instância ou se abre em uma guia em uma instância existente.

Localizado no arquivo de origem gedit-app.cna função static boolean is_in_viewport, o algoritmo testa se a instância atual do gedit é

  1. no mesmo número de tela e nome de exibição
  2. no mesmo espaço de trabalho
  3. superior a 25% das bordas da porta de visualização

Se tudo for verdadeiro, o gedit será aberto na mesma instância em uma nova guia, caso contrário, será aberto em uma nova janela.

Em resumo - a única maneira realista de mudar o comportamento é mudar o algoritmo ...

Quão...

A seguir, é uma maneira rápida de obter uma maneira consistente de abrir o gedit ... sempre abrirá uma nova instância.

instale as ferramentas básicas de desenvolvimento

sudo apt-get install devscripts build-essential fakeroot 

pegue a fonte

cd ~/Downloads
mkdir build
cd build
apt-get source gedit
cd gedit-3.2*

fazer a mudança

Abra o gedit-app.c

gedit gedit/gedit-app.c

insira a descrição da imagem aqui

adicione return FALSE;como mostrado e salve.

O que isso faz é sempre sair da rotina dizendo "não estou executando em uma viewport e, portanto, sempre abra uma nova instância"

Se você usar return TRUE;isso, sempre será aberto em uma instância existente do gedit em uma nova guia ...

dê a ele um nome de pacote exclusivo

OK, precisamos dar um nome exclusivo ao pacote para impedir que as atualizações do repositório substituam o pacote alterado

gedit debian/changelog

agora anexe +yournameà versão superior e salve o arquivo

Nota - para ter certeza absoluta - depois de instalar o pacote modificado abaixo, bloqueie a versão conforme a pergunta vinculada abaixo.

insira a descrição da imagem aqui

construa o pacote

sudo apt-get build-dep gedit
debuild -i -us -uc -b

Vá tomar um café ...

cd ..
sudo dpkg -i gedit*.deb

Pergunta vinculada:

  1. Como impedir a atualização de um pacote específico?
liberdade de expressão
fonte
1
Isto, meu senhor, está DOENTE! Muito obrigado, espero que isso vai funcionar ...
Richard Rodriguez
... certamente o fiz durante meus testes ... NB - Eu usei as outras respostas para observação: se você arrastar o gedit para sobrepor as bordas, uma nova instância será aberta, mas se você tiver o gedit na área de trabalho, a nova instância será aberta em um separador. Com a compilação acima - ela sempre é aberta em uma nova instância ou guia, dependendo da compilação com "return FALSE" ou "return TRUE".
fossfreedom
Estou oficialmente confirmando esta solução FUNCIONANDO!
Richard Rodriguez
3
santo sh * t @fossfreedom, eu me curvo, senhor, você fez desta vez, a qualidade e a solução desta resposta é imba. Se pudesse, passaria o dia todo pressionando o botão de votação! Gj.
Bruno Pereira
2
Parece que seria melhor fazer uma solicitação pull para ter uma variável de configuração e fazer um simples (pseudo-código) "se $ config-variable então retornar FALSE". A maneira proposta bloqueia você indefinidamente as atualizações.
Pbhj 11/06
13

Eu queria que todos os arquivos fossem abertos em apenas uma janela do gedit. Não encontrei essas informações em outro lugar, mas com as alterações a seguir, consegui abrir todos os arquivos de texto em apenas uma janela como novas abas, não importa como os abro (via lançador, via nautilus, via Gnome DO).

  1. Obtenha o número de exibição: digite echo $DISPLAYna linha de comando. por exemplo, você obtém :0como seu número de exibição.

  2. Abra /usr/share/applications/gedit.desktopcomo superusuário com um editor de texto.

  3. Mude a linha dizendo:

    Exec=gedit %U
    

    para

    Exec=gedit --display=:0 %U
    

    onde :0está o seu número de exibição.

Tim Banchi
fonte
2
Muito melhor do que recompilar o gedit e fazer hacks estranhos de pacotes. Obrigado!
Rrogers
1
A execução dessa opção na linha de comando não impede a geditabertura de novas instâncias (janelas). Pelo menos na versão atual 3.18.
Alf15 #
funciona para mim na versão 3.28.1, tanto na linha de comando quanto na GUI. precisa reiniciar embora
efie 12/09/18
2

Isso não acontece aleatoriamente

Por padrão, o Gedit não é feito para abrir muitas instâncias, mas uma a cada exibição. Se você abrir na tela onde ainda não existe, o Gedit abrirá arquivos no Gedit, pois agora existe a tela do arquivo aberto.

Para que você possa fazer com que a 1ª instância do gedit esteja em Todos os espaços de trabalho, siga a exibição ativa. Ou trabalhe em cada espaço de trabalho com cada projeto e cada um com seu próprio Gedit aberto. Nos atalhos de teclado, você pode criar um novo atalho para alternar a janela em todos os espaços de trabalho.

OU é possível abri-lo sempre em nova instância usando o comando de atalho em Abrir com .. gedit --new-window

Então você pode tentar nas propriedades do php abertas com reset e abrir uma nova abertura com apenas o Gedit

usando gedit --help-allull veja outra opção de abertura com o gedit.

E você também pode tentar remover o gedit com todos os arquivos de configuração e instalá-lo limpo usando sudo apt-get purge gedit && sudo apt-get clean && sudo apt-get update && sudo apt-get install gedit

ATUALIZAÇÃO: Consegui reproduzir - ao mover a janela um pouco para fora da tela e abrir um arquivo aberto em uma nova janela. De alguma forma, pensa que está em outro monitor.

Canguru
fonte
Sim, isso acontece aleatoriamente. Esse é ponto principal. A implementação é incorreta / não é robusta. Por exemplo, eu estou em uma perda que eu fiz, mas gedit agora decidiu aleatoriamente para mudar para este sempre um novo modo de janela depois de trabalhar como normal hoje cedo ...
spinkus
1

Isso começou a acontecer comigo. Não consegui encontrar nenhum arquivo conf relevante e até tentei limpar + limpar. Finalmente encontrei o que era. A janela do Gedit estava se abrindo de tal forma que parecia maximizada, mas não estava. Apertei o botão maximizar na janela e isso resolveu o problema! Observe que a janela não mudou de tamanho, apenas os cantos foram do redondo ao quadrado. Parece que isso deve ser um bug no algoritmo @fossfreedom descrito acima.

Nota: Quando você fecha a janela, o estado de maximizar / minimizar deve ser armazenado em alguma configuração do usuário em algum lugar. Esse estado sobrevive à limpeza + limpeza e também não está nas confs do Gedit por usuário.

spinkus
fonte