Gtk3アプリ(Firefoxなど)でファイルを開いたり保存したりしたい場合、文字を傾けた後に不要な検索機能が表示されます。
古い生産的な動作:d
と入力すると、d
で始まる最初のファイルが表示され、de
と入力すると、de
で最初のファイルが表示されます。
新しい不要な動作:d
と入力すると、検索プロセスが開始され、/home/myuser/Downloads/somestuff/DETLEFF
またはシステム内のどこかにある他のファイル。
どうすれば古くて生産的な行動に戻すことができますか?
私のシステム:archliux64、Gtk3:3.18.6、windowmanager:fluxbox
探している機能は「typeahead」と呼ばれ、GtkFileChooserDialog
では無効になっています。 gtk3-typeahead
AURから、以前の動作を復元します。
パッケージの作者 先行入力の無効化はハードコーディングされていると言う GTK +と バグレポート それは次のように述べられています:「これはバグではありません。先行入力検索の削除は非常に重要でした意図的です。」
シェルの動作を模倣した名前/アドレスフィールドにいくつかの(部分的に壊れた)タブ補完があることに注意してください。
2019年の時点で、私は ArchのAURリポジトリ を使用することにしました(しかしはまだ私のDebianシステムにあります)。 FreeBSDでも、小さな(やや些細な)パッチを使ってこれを行いました。これは「Archへの切り替え」の答えではありません。
最初はセットアップが少し難しかったですが、その要点は、実際にArchのmakepkg
プログラムをコンパイルし、それを使用してDebianでAURリポジトリをコンパイルできることです。私はこれをそのように行いました(いくつかの依存関係を忘れていたかもしれませんが):
私の古い答えは、下部近くのセパレーターの後にまだ存在しています。
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
次に、gtk3-typeahead
をビルドしてインストールします。 Archのものとほぼ同じであるすべての(debian)ビルド依存関係を取得するには、最初にsources.listにdeb-src
行を入れて、apt-get build-dep
が必要なものを正常にフェッチできるようにする必要があります-dev
パッケージ。
私のsources.list
には、次の行が含まれています。リリースと最も近いサーバーに基づいて行を変更します。
deb-src http://ftp.us.debian.org/debian/ sid main contrib
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
これを行った後、バイナリはgitツリーの1レベル上の.tar.gz
アーカイブにパックされます。私の例では、これは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の人々がこの動作をハードコーディングすることを決定したので、1年が経ちましたが、これはまだ私を悩ませています。再コンパイルせずに元に戻す方法はありません。
ただし、typeaheadは、Ubuntuで配布されているgtk3にパッチで戻されました。
Ubuntuはまた、ファイルがすでに選択されている場合にシングルクリックだけでなく、ファイルチューザーでファイルを選択するためにダブルクリックを必要とするようにしました。 gtk3ソースコードにパッチを当てても問題がない場合は、 gtk + 3.22.7の時点で機能するパッチを作成しました ubuntuパッチを組み合わせて、GTKの最新バージョンに更新します。
さらに、 私はスクリプトを作成しました 私のdebianシステムでは、パッケージマネージャーの最新バージョンのソースを自動的にダウンロードし、パッチを適用してコンパイルします。 Debian Sidで正しく動作し、他のDebianディストリビューションでも問題なく動作するはずです。
Debian不安定版では、ウィンドウが開いているときに(先読みの場合はl)、ctrl-l
を押すことで先行入力機能を取得できますが、ファイルを開くダイアログの場合のみで、ファイルの保存ダイアログは表示されません。ファイル保存ダイアログの場合、ctrl-l
は保存するファイルの名前のみを強調表示します。よりインテリジェントな方法でナビゲートするには、正しい組み合わせで~
、/
、.
と入力して、ホームディレクトリ、現在のディレクトリ、またはルートからのディレクトリパスを取得します。また、戻る矢印キーを押すと、名前の選択を解除してカーソルをボックス内に保持できるため、現在の名前を失うことはありません(「名前を付けて保存」操作で発生する場合のように)。
古い振る舞いの方がはるかに良かったようです:)
この答えは正確な古い動作を取り戻すことはできませんが、再帰検索を実行するか、マウスを使用する必要があるという主な問題を解決します。
私は gtkfilechooserwidget.c のコードを調べて、スラッシュを含むパスを入力し始めると、オートコンプリート(emacs ivyのような)と再帰検索が無効になっています。
たとえば、./
、../
、~/
または/
そしてそれはうまくいくでしょう。
Debianの場合:次の短いスクリプトは、(パッチされた)通常のdebian-packageを作成してインストールします。これは、make installよりも優先される場合があります。パッチは ここ から取得され、問題が発生すると報告されているため、最初のブロックが削除されています。 Debian 10Busterでのテストに成功しました。
#!/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);