Respuesta actualizada:

Respuesta actualizada:

Si quiero abrir o guardar un archivo en una aplicación gtk3 (por ejemplo, Firefox), aparece una función de búsqueda no deseada después de escribir un carácter.

Comportamiento antiguo y productivo: escribir dme da el primer archivo que comienza con d, escribir deme da el primer archivo con de.

Comportamiento nuevo y no deseado: escribir dinicia un proceso de búsqueda y me da a mí /home/myuser/Downloads/somestuff/DETLEFFo a algún otro archivo en algún lugar del sistema.

Ejemplo: Selector de archivos Gtk3

¿Cómo puedo volver al comportamiento anterior y productivo?

Mi sistema: archliux64, Gtk3: 3.18.6, administrador de ventanas: fluxbox

Respuesta1

La función que busca se llama "escribir anticipadamente" y está deshabilitada en GtkFileChooserDialog. gtk3-typeaheaddel AUR restaura el comportamiento anterior.

El autor del paquetedice que deshabilitar la escritura anticipada está codificadoen GTK+ y en uninforme de errorse decía: "No es un error; la eliminación de la búsqueda de escritura anticipada fue muy intencionada".

Tenga en cuenta que ahora hay algunas funciones de tabulación (parcialmente rotas) en el campo de nombre/dirección que imitan el comportamiento del shell.

Respuesta2

Respuesta actualizada:

A partir de 2019, comencé a usarRepositorio AUR de Arch(Perotodavía en mi sistema Debian). También hice esto en FreeBSD, ahora, con un pequeño parche (algo trivial). Esta NO es una respuesta de "cambiar a Arch".

Al principio fue un poco difícil de configurar, pero lo esencial es que, de hecho, puedes compilar makepkgel programa de Arch y usarlo para compilar repositorios AUR en Debian. Hice esto así (aunque es posible que haya olvidado algunas dependencias):

Mi antigua respuesta todavía está presente después del separador cerca de la parte inferior.

1) Edificio 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) Preparación para compilar las fuentes GTK3:

Ahora, para construir e instalar gtk3-typeahead. Para obtener todas las dependencias de compilación (debian), que son más o menos las mismas que las de Arch, primero debe tener una deb-srclínea en su fuente.list para que apt-get build-deppueda recuperar con éxito los paquetes necesarios -dev.

My sources.listcontiene la siguiente línea para hacer eso. Cambie la línea según su versión y el servidor más cercano.

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

3) Edificio gtk3-typeahead:

Luego, puede ejecutar lo siguiente para compilar 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

Después de hacer esto, los binarios se empaquetarán en un .tar.gzarchivo un nivel por encima del árbol de git. En mi ejemplo, este sería el intodirectorio.

Para instalarlo:

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"

Esto es altamente programable y, en mi humilde opinión, un poco menos complicado que lidiar con mis viejos scripts. Además ya no depende de debian.


Respuesta original:

Ha pasado un año y esto todavía me molesta, desde que la gente de GTK3 decidió codificar este comportamiento, sin forma de revertirlo sin volver a compilar.

Sin embargo, la escritura anticipada fue parcheada nuevamente en gtk3 tal como se distribuye en Ubuntu.

Ubuntu también hizo que el selector de archivos requiriera un doble clic para elegir un archivo, en lugar de requerir solo un clic si el archivo ya estaba seleccionado. Si está de acuerdo con parchear el código fuente de gtk3,He creado un parche que funciona a partir de gtk+ 3.22.7.combinando los parches de ubuntu y actualizándolos a una versión más actual de GTK.

Además,hice un guiónpara mi sistema Debian que descarga automáticamente el código fuente de la última versión en el administrador de paquetes, lo parchea y lo compila. Se ejecuta correctamente en Debian Sid y también debería funcionar bien para otras distribuciones de Debian.

Respuesta3

En Debian inestable, puede obtener la funcionalidad de escritura anticipada presionando ctrl-lcuando la ventana está abierta (l para mirar hacia adelante), pero solo para los diálogos de apertura de archivos, no para los diálogos de guardado de archivos. Para los diálogos para guardar archivos, ctrl-lsolo resaltará el nombre del archivo que se guardará. Para navegar de una manera más inteligente, puede escribir ,, ~en las combinaciones correctas para obtener su directorio de inicio, directorio actual o una ruta de directorio desde la raíz. Además, al presionar la tecla de flecha hacia atrás se puede anular la selección del nombre y mantener el cursor en el cuadro para no perder el nombre actual (como ocurriría en una operación "Guardar como")./.

Parece ser que el comportamiento anterior era mucho mejor :)

Respuesta4

Para Debian: el siguiente script breve crea e instala un paquete Debian normal (parcheado) que puede preferirse a make install. El parche está tomado deaquícon el primer bloque eliminado ya que se informa que causa problemas. Lo probé con éxito en 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

Guarde esto como 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);

información relacionada