Warum öffnet gedit beim Öffnen von Dateien aus nautilus immer wieder zufällig neue Instanzen?


32

Oh, wie sehr ich Ubuntu und all seine Funktionen liebe, aber dieser "Bug" hat mich so lange wütend gemacht und ich habe mich endlich entschlossen, hier um Hilfe zu bitten.

Ich habe alle .phpDateien zugewiesen , die mit gedit geöffnet werden sollen, wenn ich in nautilus auf sie doppelklicke. Nun ist das Verhalten seltsam.

  1. Ich habe kein gedit ausgeführt
  2. Ich doppelklicke auf eine zu öffnende Datei
  3. Ein gedit-Fenster wird geöffnet und die Datei geladen
  4. Ich doppelklicke auf eine andere zu öffnende Datei

Nun gibt es 2 mögliche Ergebnisse:

5A) Die Datei wird im selben gedit-Fenster in einer neuen Registerkarte geöffnet

5B) Die Datei wird in einem neuen gedit-Fenster geöffnet, wodurch 2 gedits ausgeführt werden.

Ob A oder B passiert, scheint völlig zufällig zu sein und geht unendlich weiter. Das heißt, ich doppelklicke auf 100 Dateien und erhalte möglicherweise 60 Gedits, von denen einige 1 Tab, einige 2 Tab und einige 3 Tab enthalten ...

Dies ist äußerst ärgerlich und eine Lösung dafür wäre sehr dankbar. Jemand jemals versucht, dieses Problem zu beheben?

Dies ist in Ubuntu 10.04, 10.10 und 11.10 geschehen. Alle Ubuntu-Versionen, die ich je getestet habe.

Antworten:


39

Warum...

gedit Der Algorithmus ist sehr interessant, um festzustellen, ob eine neue Instanz oder eine Registerkarte einer vorhandenen Instanz geöffnet wird.

Befindet sich in der Quelldatei gedit-app.cder Funktion static boolean is_in_viewport, prüft der Algorithmus, ob die aktuelle gedit-Instanz vorhanden ist

  1. in der gleichen Bildschirmnummer und Anzeigenamen
  2. im selben Arbeitsbereich
  3. mehr als 25% der Ränder des Ansichtsfensters

Wenn alle zutreffen, wird gedit in derselben Instanz in einer neuen Registerkarte geöffnet, andernfalls in einem neuen Fenster.

Zusammenfassend lässt sich sagen, dass der einzig realistische Weg, das Verhalten zu ändern, darin besteht, den Algorithmus zu ändern ...

Wie...

Das Folgende ist ein schneller Weg, um einen konsistenten Weg zum Öffnen von gedit zu finden. Es wird immer eine neue Instanz geöffnet.

Installieren Sie die grundlegenden Entwicklungstools

sudo apt-get install devscripts build-essential fakeroot 

Holen Sie sich die Quelle

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

mach die Veränderung

Öffnen Sie gedit-app.c

gedit gedit/gedit-app.c

Bildbeschreibung hier eingeben

fügen Sie hinzu return FALSE;wie gezeigt und speichern Sie.

Das bedeutet, dass Sie die Routine immer verlassen, wenn Sie sagen, dass Sie nicht in einem Ansichtsfenster ausgeführt werden und daher immer eine neue Instanz öffnen.

Wenn Sie return TRUE;dies verwenden, wird es immer in einer vorhandenen Instanz von gedit in einem neuen Tab geöffnet ...

Geben Sie ihm einen eindeutigen Paketnamen

OK, wir müssen dem Paket einen eindeutigen Namen geben, um zu verhindern, dass Repository-Updates Ihr geändertes Paket überschreiben

gedit debian/changelog

jetzt +yournamean die oberste Zeile anhängen und die Datei speichern, dh

Beachten Sie - um ganz sicher zu gehen -, dass Sie nach der Installation des modifizierten Pakets die Version gemäß der unten stehenden Frage sperren müssen.

Bildbeschreibung hier eingeben

Bauen Sie das Paket

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

Auf einen Kaffee gehen ...

cd ..
sudo dpkg -i gedit*.deb

Verknüpfte Frage:

  1. Wie kann ich die Aktualisierung eines bestimmten Pakets verhindern?

1
Das, mein Herr, ist KRANK! Vielen Dank, hoffe, dass dies funktioniert ...
Richard Rodriguez

... das habe ich während meiner Tests sicherlich getan ... NB - Ich habe bei den anderen Antworten festgestellt, dass beim Ziehen von gedit zum Überlappen der Kanten eine neue Instanz geöffnet wird. Wenn Sie jedoch gedit auf dem Desktop haben, wird die neue Instanz in geöffnet eine Registerkarte. Mit der obigen Kompilierung wird es immer in einer neuen Instanz oder einem neuen Tab geöffnet, je nachdem, ob es mit "return FALSE" oder "return TRUE" kompiliert wurde.
fossfreedom

Ich bestätige offiziell, dass diese Lösung FUNKTIONIERT!
Richard Rodriguez

3
heilige sh * t @fossfreedom, ich verneige mich vor Ihnen, Sir, Sie haben diesmal getan, die Qualität und Lösung dieser Antwort ist imba. Wenn ich könnte, würde ich den ganzen Tag damit verbringen, diesen Abstimmungsknopf zu drücken! Gj.
Bruno Pereira

2
Es scheint, als wäre es besser gewesen, eine Pull-Anfrage für eine Konfigurationsvariable zu stellen und einen einfachen (Pseudo-Code) "wenn $ config-variable dann FALSE zurückgibt" durchzuführen. Die vorgeschlagene Methode sperrt Sie auf unbestimmte Zeit vor Updates.
pbhj

13

Ich wollte, dass alle Dateien in nur einem gedit-Fenster geöffnet werden. Ich habe diese Informationen nicht woanders gefunden, aber mit den folgenden Änderungen habe ich es geschafft, alle Textdateien in nur einem Fenster als neue Registerkarten zu öffnen, egal wie ich sie öffne (über Launcher, über Nautilus, über Gnome DO).

  1. Abrufen der Anzeigenummer: Geben Sie echo $DISPLAYdie Befehlszeile ein. ZB bekommst du :0als Displaynummer.

  2. Öffnen Sie /usr/share/applications/gedit.desktopals Superuser mit einem Texteditor.

  3. Ändern Sie die Zeile mit den Worten:

    Exec=gedit %U
    

    zu

    Exec=gedit --display=:0 %U
    

    Wo :0ist Ihre Display-Nummer?


2
Viel besser als gedit neu zu kompilieren und seltsame Paket-Hacks durchzuführen. Vielen Dank!
Rcrogers

1
Das Ausführen mit dieser Option über die Befehlszeile verhindert nicht, dass geditneue Instanzen (Fenster) geöffnet werden. Zumindest in der aktuellen Version 3.18.
AlfC

funktioniert für mich in Version 3.28.1 sowohl von der Kommandozeile als auch von der GUI aus. muss allerdings neu
gestartet werden

2

Dies geschieht nicht zufällig

Standardmäßig öffnet Gedit nicht viele Instanzen, sondern jeweils eine. Wenn du in der Anzeige öffnest, wo es noch nicht ist, öffnet Gedit Dateien in Gedit, die jetzt in dieser Anzeige von der geöffneten Datei vorhanden sind.

Sie können also festlegen, dass die erste Instanz von gedit in allen Arbeitsbereichen angezeigt wird, damit sie Ihrer aktiven Anzeige folgt. Oder arbeiten Sie an jedem Arbeitsplatz mit jedem Projekt und jedem mit einem eigenen geöffneten Gedit. In Tastenkombinationen können Sie eine neue Verknüpfung zum Umschalten des Fensters in allen Arbeitsbereichen erstellen.

ODER es ist möglich, es immer in einer neuen Instanz zu öffnen, indem Sie den Befehl "Verknüpfung" in "Öffnen mit" verwenden. gedit --new-window

So können Sie in PHP-Eigenschaften versuchen, mit Reset zu öffnen und mit nur Gedit eine neue Öffnung zu setzen

Verwenden Sie gedit --help-allull, um andere Optionen zum Öffnen mit gedit anzuzeigen.

Und Sie können auch versuchen, gedit mit allen Konfigurationsdateien zu entfernen und es mit sauber zu installieren sudo apt-get purge gedit && sudo apt-get clean && sudo apt-get update && sudo apt-get install gedit

UPDATE: Ich konnte reproduzieren - wenn ich das Fenster etwas außerhalb des Bildschirms bewegte, öffnete sich eine Datei in einem neuen Fenster. Es denkt irgendwie, dass es in einem anderen Display ist.


Ja, es passiert zufällig. Das ist der springende Punkt. Die Implementierung ist fehlerhaft / nicht robust. Zum Beispiel bin ich ratlos, aber gedit hat sich jetzt zufällig entschieden, in diesen immer neuen Fenstermodus zu wechseln, nachdem
ich

1

Das passierte mir. Ich konnte keine relevante conf-Datei finden und versuchte es sogar mit purge + clean. Endlich gefunden was es war. Das Gedit-Fenster wurde so geöffnet, dass es so aussah, als wäre es maximiert, aber nicht. Ich habe die Maximierungsschaltfläche im Fenster gedrückt und das Problem wurde behoben! Beachten Sie, dass sich die Größe des Fensters nicht geändert hat, sondern nur die Ecken von rund zu quadratisch. Es scheint, dass dies ein Fehler im beschriebenen Algorithmus @fossfreedom sein muss .

Hinweis: Wenn Sie das Fenster schließen, muss der Maximierungs- / Minimierungsstatus in einer Benutzerkonfiguration gespeichert werden. Dieser Status überlebt die Bereinigung + Bereinigung und ist auch nicht in Gedit-Confs für einzelne Benutzer enthalten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.