当从鹦鹉螺打开文件时,为什么gedit会继续随机打开新实例?


32

噢,我多么喜欢Ubuntu及其所有功能,但是这个“错误”一直让我很生气,我终于决定在这里寻求帮助。

.php每当我在nautilus中双击它们时,我都将分配所有要使用gedit打开的文件。现在,这种行为很奇怪。

  1. 我没有运行gedit
  2. 我双击要打开的文件
  3. 将打开一个gedit窗口,并加载文件
  4. 我双击另一个要打开的文件

现在,有两种可能的结果:

5A)文件在新标签的同一gedit窗口中打开

5B)文件在新的gedit窗口中打开,导致运行2个gedit。

是否发生A或B似乎完全是随机的,并且会继续进行下去。这意味着我双击了100个文件,最终可能得到60个gedit,其中有些将带有1个选项卡,有些将具有2个选项卡,有些将具有3个选项卡...

这是非常烦人的,对此的解决方法将不胜感激。任何人都试图解决此问题吗?

这已在Ubuntu 10.04、10.10和11.10中发生。我曾经测试过的所有Ubuntu版本。

Answers:


39

为什么...

gedit 有一个非常有趣的算法来确定是打开新实例还是在现有实例的选项卡中打开。

该算法位于gedit-app.c函数中的源文件中static boolean is_in_viewport,用于测试当前gedit实例是否为

  1. 在相同的屏幕编号和显示名称中
  2. 在同一工作区
  3. 大于视口边缘的25%

如果所有条件都正确,则gedit将在同一实例中的新标签页中打开,否则将在新窗口中打开。

总结-改变行为的唯一现实方法是改变算法...

怎么样...

以下是获得一致的打开gedit方法的快速方法...它将始终打开一个新实例。

安装基本的开发工具

sudo apt-get install devscripts build-essential fakeroot 

获取来源

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

做出改变

打开gedit-app.c

gedit gedit/gedit-app.c

在此处输入图片说明

return FALSE;如图所示添加并保存。

这是要始终退出例程,说“我不在视口中运行,因此总是打开新实例”。

如果您使用return TRUE;它,它将始终在新标签中的现有gedit实例中打开...

给它一个唯一的包名

好的,我们需要为软件包指定一个唯一的名称,以防止存储库更新覆盖已更改的软件包

gedit debian/changelog

现在追加+yourname到顶行版本并保存文件,即

注意-绝对可以-在安装以下经过修改的软件包后,请按照以下链接的问题锁定版本。

在此处输入图片说明

制作包装

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

去喝咖啡...

cd ..
sudo dpkg -i gedit*.deb

链接的问题:

  1. 如何防止特定软件包的更新?

1
我的先生,这病了!非常感谢,希望这会奏效...
Richard Rodriguez

...在测试期间肯定是这样做的... NB-我使用其他答案观察到,如果将gedit拖动到重叠的边缘,则会打开一个新实例,但是如果您在桌面中有gedit,则会在以下位置打开新实例:标签。使用上面的编译-它始终会在新实例或选项卡中打开,具体取决于使用“ return FALSE”或“ return TRUE”进行编译的情况。
fossfreedom

我正式确认此解决方案!
理查德·罗德里格斯

3
holy sh * t @fossfreedom,先生,我向您鞠躬,您这次已经做了,此答案的质量和解决方案是imba。如果可以的话,我会整日按下投票按钮!j
布鲁诺·佩雷拉

2
似乎最好通过发出拉取请求来获取配置变量并执行简单的(伪代码)“如果$ config-variable然后返回FALSE”。提议的方法将您无限期地锁定在更新范围之外。
pbhj

13

我只想在一个gedit窗口中打开所有文件。我没有在其他地方找到此信息,但是通过以下更改,我设法使所有文本文件都在一个窗口中作为新选项卡打开,而不管如何打开它们(通过启动器,通过Nautilus,通过Gnome DO)。

  1. 获取显示号:echo $DISPLAY在命令行中键入。例如,您得到:0您的显示编号。

  2. /usr/share/applications/gedit.desktop使用文本编辑器以超级用户身份打开。

  3. 更改以下行:

    Exec=gedit %U
    

    Exec=gedit --display=:0 %U
    

    :0您的显示号码在哪里。


2
比重新编译gedit和进行奇怪的程序包破解要好得多。谢谢!
法师2014年

1
从命令行使用此选项运行不会阻止gedit打开新实例(Windows)。至少在当前版本3.18中。
alfC

可以从命令行和gui在3.28.1版中为我工作。虽然需要重新启动
efie

2

这不是随机发生的

默认情况下,Gedit不会打开多个实例,但每个显示一个。如果您在尚未显示的地方打开显示,那么Gedit将在Gedit中打开文件;女巫现在在该显示中已打开文件。

因此,您可以将gedit的第一个实例设置在所有工作空间上,以便它跟随您的活动显示。或在每个项目的每个工作区中工作,并且每个项目都有自己打开的Gedit。在键盘快捷键中,您可以创建新的快捷键,以在所有工作区上切换窗口蜂鸣声。

或者可以使用“打开方式”中的快捷方式命令使其始终在新实例中打开。 gedit --new-window

因此,您可以尝试使用reset打开的php属性,并仅使用Gedit进行新的打开

使用gedit --help-allull,请参阅使用gedit打开的其他选项。

您也可以尝试删除所有配置文件中的gedit,然后使用 sudo apt-get purge gedit && sudo apt-get clean && sudo apt-get update && sudo apt-get install gedit

更新:我能够重现-将窗口移离屏幕一点点然后打开一些文件会在新窗口中打开。它以某种方式认为它在另一个Display中。


是的,它确实是随机发生的。这就是重点。该实现存在错误/不够鲁棒。例如,我不知所措,但是在今天早些时候正常工作之后,gedit现在已随机决定始终切换到新窗口模式……
spinkus

1

这开始发生在我身上。我找不到任何相关的conf文件,甚至尝试了purge + clean。终于找到了它。Gedit窗口正在打开,看起来好像已最大化,但不是。我按下了窗口上的最大化按钮,这解决了这个问题!请注意,窗口并没有改变大小,只有角落从圆形变为正方形。看来这一定是上述算法@fossfreedom中的错误。

注意:关闭窗口时,最大化/最小化状态必须存储在某些用户配置中。此状态在清除+清除后仍然存在,并且也不在每个用户的Gedit conf中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.