更新答案:

更新答案:

如果我想在 gtk3 应用程序(例如 Firefox)中打开或保存文件,输入一个字符后会出现不需要的搜索功能。

古老而高效的行为:输入d会给我第一个以 开头的文件d,输入de会给我第一个以 开头的文件de

新的和不想要的行为:输入d启动搜索过程并将我/home/myuser/Downloads/somestuff/DETLEFF或系统中某处的其他文件提供给我。

例子: Gtk3文件选择器

我怎样才能恢复以前富有成效的行为?

我的系统:archliux64,Gtk3:3.18.6,窗口管理器:fluxbox

答案1

您正在寻找的功能称为“typeahead”,它在 中被禁用GtkFileChooserDialoggtk3-typeahead从 AUR 恢复以前的行为。

软件包作者说禁用 typeahead 是硬编码的在 GTK+ 中以及错误报告声明中说:“这不是一个错误;删除预先输入搜索是故意的。”

请注意,现在名称/地址字段中有一些(部分损坏的)制表符补全模仿 shell 的行为。

答案2

更新答案:

从 2019 年起,我开始使用Arch 的 AUR 存储库(但仍然在我的 Debian 系统上)。我现在也在 FreeBSD 上做过这个,用的是小补丁(有点琐碎)。这不是“切换到 Arch”的答案。

一开始设置起来有点困难,但要点是,你实际上可以编译 Arch 的makepkg程序,并使用它来编译 Debian 上的 AUR 存储库。我这样做了(尽管我可能忘记了一些依赖项):

我的旧答案仍然存在于靠近底部的分隔符后面。

1)建筑makepkg

sudo apt-get install bsdtar # pacman depends on bsdtar (libarchive) these days
git clone git://projects.archlinux.org/pacman.git
cd pacman
./configure --sysconfdir=/etc --localstatedir=/var --prefix=/opt/arch # Put built program outside of the usual '/usr/local' when installed to avoid conflicts
make
sudo make install # Install pacman/makepkg

# Make a directory pacman expects to exist to dodge makepkg errors
sudo mkdir -p /var/cache/pacman/pkg

2)准备编译GTK3源:

现在,构建和安装gtk3-typeahead。要获取所有 (debian) 构建依赖项(它们或多或少与 Arch 依赖项相同),您必须首先deb-src在 sources.list 中有一行,以便apt-get build-dep成功获取必要的-dev软件包。

我的sources.list包含以下行来执行此操作。根据您的版本和最近的服务器更改此行。

deb-src http://ftp.us.debian.org/debian/ sid main contrib

3)建筑gtk3-typeahead

然后,您可以运行以下命令来构建gtk3-typeahead

sudo apt-get update
sudo apt-get build-dep 'gtk+3.0' # install gtk3 build dependencies

mkdir /path/to/put/arch/git/repo/into
cd /path/to/put/arch/git/repo/into
git clone https://aur.archlinux.org/gtk3-typeahead.git gtk3-typeahead
cd gtk3-typeahead

# Tack onto configure script arguments so that libraries overwrite the official
# Debian ones in /usr/lib/x86_64-linux-gnu, instead of installing to /usr/lib. 
# CHANGE THIS APPROPRIATELY IF RUNNING 32-BIT (or some other architecture like POWER/MIPS)
sed '/\-\-sysconfdir=/a\
        --libdir=/usr/lib/x86_64-linux-gnu \\' PKGBUILD > PKGBUILD2
mv PKGBUILD2 PKGBUILD

# temporarily add archlinux programs to PATH so we can use 'makepkg'
PATH="/opt/arch/bin:""$PATH"

# Don't check pacman dependencies, since our dependency libraries weren't
# installed via pacman like makepkg expects!
makepkg --nodeps

执行此操作后,二进制文件将被打包到.tar.gzgit 树上一级的存档中。在我的示例中,这将是into目录。

安装方法:

TARBALLPATH="$(readlink -f gtk3-typeahead-*.tar.gz | sort | tail -n 1)" # get full path to tarball of most recent build, if multiple are available
cd /
bsdtar xf "$TARBALLPATH"

这是高度可编写脚本的,在我看来,比处理我的旧脚本要简单一些。它也不再依赖于 Debian。


原始答案:

已经过去一年了,这个问题仍然让我烦恼,因为 GTK3 的人们决定将这种行为硬编码进去,并且无法在不重新编译的情况下恢复它。

然而,typeahead 已被修补回 Ubuntu 中发行的 gtk3。

Ubuntu 还让文件选择器需要双击才能选择文件,而不是仅在文件已被选中时才需要单击。如果您同意修补 gtk3 源代码,我已经制作了一个适用于 gtk+ 3.22.7 的补丁结合 ubuntu 补丁并将其更新为 GTK 的最新版本。

此外,我写了个脚本对于我的 Debian 系统,它会自动从包管理器中下载最新版本的源代码,对其进行修补并编译。在 Debian Sid 上正常运行,在其他 Debian 发行版上也应该可以正常工作。

答案3

ctrl-l在 Debian 不稳定版中,您可以在窗口打开时按下 来获得预输入功能(l 表示预读),但仅适用于文件打开对话框,而不适用于文件保存对话框。对于文件保存对话框,ctrl-l将仅突出显示要保存的文件的名称。要以更智能的方式导航,您可以以正确的组合键入~/.以获取主目录、当前目录或来自根目录的目录路径。此外,按后退箭头键可以取消选择名称并将光标保持在框中,这样您就不会丢失当前名称(就像在“另存为”操作中发生的那样)。

看来旧的行为要好得多:)

答案4

对于 Debian:以下简短脚本创建并安装(已修补的)常规 debian-package,它可能比 make install 更受欢迎。补丁取自这里删除第一个块,因为据报道它会导致问题。我在 Debian 10 Buster 上成功测试了它。

#!/usr/bin/env bash
set -e

# provide the patch path
path_patch=typeahead.patch

sudo apt-get build-dep libgtk-3-dev
apt-get source libgtk-3-dev
cd $(find gtk* -maxdepth 0 -type d)
patch gtk/gtkfilechooserwidget.c < "$path_patch"
debuild -b  -us -uc  --no-pre-clean
cd ..
sudo dpkg -i libgtk-3-0_*.deb
# do not update (dist-upgrade)
sudo apt-mark hold libgtk-3-0

将其存储为 typeahead.patch:

@@ -1399,12 +1405,6 @@
           return TRUE;
         }
     }
-  else if (gtk_search_entry_handle_event (GTK_SEARCH_ENTRY (priv->search_entry), (GdkEvent *)event))
-    {
-      if (priv->operation_mode != OPERATION_MODE_SEARCH)
-        operation_mode_set (impl, OPERATION_MODE_SEARCH);
-      return TRUE;
-    }

   if (GTK_WIDGET_CLASS (gtk_file_chooser_widget_parent_class)->key_press_event (widget, event))
     return TRUE;
@@ -2427,7 +2427,7 @@
 {
   GtkFileChooserWidgetPrivate *priv = impl->priv;

-  gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->browse_files_tree_view), -1);
+  gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->browse_files_tree_view), MODEL_COL_NAME);

   gtk_tree_view_column_set_sort_column_id (priv->list_name_column, MODEL_COL_NAME);
   gtk_tree_view_column_set_sort_column_id (priv->list_time_column, MODEL_COL_TIME);
@@ -4338,6 +4338,7 @@
   gtk_tree_view_set_model (GTK_TREE_VIEW (priv->browse_files_tree_view),
                            GTK_TREE_MODEL (priv->browse_files_model));
   update_columns (impl, FALSE, _("Modified"));
+  gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->browse_files_tree_view), TRUE);
   file_list_set_sort_column_ids (impl);
   set_sort_column (impl);
   profile_msg ("    gtk_tree_view_set_model end", NULL);
@@ -7098,10 +7099,6 @@
 {
   GList *l, *files, *files_with_info, *infos;
   GFile *file;
-  gboolean select = FALSE;
-
-  if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (impl->priv->search_model), NULL) == 0)
-    select = TRUE;

   files = NULL;
   files_with_info = NULL;
@@ -7129,8 +7126,6 @@
   g_list_free_full (infos, g_object_unref);

   gtk_stack_set_visible_child_name (GTK_STACK (impl->priv->browse_files_stack), "list");
-  if (select)
-    gtk_widget_grab_focus (impl->priv->browse_files_tree_view);
 }

 /* Callback used from GtkSearchEngine when the query is done running */
@@ -7427,6 +7422,7 @@
   gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->recent_model),
                                         GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
                                         GTK_SORT_DESCENDING);
+  gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->browse_files_tree_view), TRUE);
 }

 typedef struct
@@ -7444,7 +7440,7 @@

   gtk_tree_view_set_model (GTK_TREE_VIEW (priv->browse_files_tree_view),
                            GTK_TREE_MODEL (priv->recent_model));
-  gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->browse_files_tree_view), -1);
+  gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->browse_files_tree_view), MODEL_COL_NAME);

   gtk_tree_view_column_set_sort_column_id (priv->list_name_column, -1);
   gtk_tree_view_column_set_sort_column_id (priv->list_time_column, -1);

相关内容