更新的答案:

更新的答案:

如果我想在 gtk3 應用程式(例如 firefox)中開啟或儲存文件,則在輸入字元後會出現不必要的搜尋功能。

舊而富有成效的行為:輸入d給我第一個以 開頭的文件d,輸入de給我第一個以de.

新的和不需要的行為:鍵入d會啟動搜尋過程,並為我/home/myuser/Downloads/somestuff/DETLEFF或系統中的某個位置提供其他檔案。

例子: Gtk3檔案選擇器

我怎樣才能改回原來的、有成效的行為方式?

我的系統:archliux64,Gtk3:3.18.6,視窗管理器:fluxbox

答案1

您正在尋找的功能稱為“typeahead”,它在GtkFileChooserDialog.gtk3-typeahead從 AUR 恢復之前的行為。

包作者說禁用預輸入是硬編碼的在 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在 resources.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 stable 上,您可以透過在視窗開啟時按下(l 表示前瞻)來獲得預輸入功能,但僅適用於檔案開啟對話框,不適用於檔案儲存對話框。對於檔案儲存對話框,ctrl-l只會反白顯示要儲存的檔案的名稱。若要以更聰明的方式導航,您可以鍵入~/.的正確組合來取得主目錄、目前目錄或來自根目錄的目錄路徑。另外,按後退箭頭鍵可以取消選擇名稱並將遊標保留在方塊中,這樣您就不會遺失目前名稱(如「另存為」操作中會發生的情況)。

看來舊的行為好得多:)

答案4

對於 Debian:以下簡短腳本創建並安裝一個(已修補的)常規 debian 軟體包,該軟體包可能優於 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);

相關內容