¿Cómo puedo asignar un atajo de teclado para scripts nautilus?

10

He configurado un script Nautilus . Puse el script /home/sumeet/.local/share/nautilus/scriptsy aparece en el menú del botón derecho. y también funciona como se esperaba. Solo quiero asignar un acceso directo al script.


¿Cómo puedo crear atajos de teclado para mis scripts nautilus?

Las respuestas dadas en la pregunta anterior apuntan a una versión específica y están completamente desactualizadas, y no pude encontrar nada más que esta pregunta sobre este tema.

Sumeet Deshmukh
fuente
Se puede hacer, pero también necesita editar un poco el script nautilus. ¿Es eso posible en tu caso? (Sospecho que es :)). Bothe Serg y yo hicimos algo así aquí: askubuntu.com/questions/886642/… . Esa solución se puede aplicar aquí, pero se necesita la secuencia de comandos de destino para recibir el archivo o directorio como argumento.
Jacob Vlijm
@JacobVlijm es el mismo guión ( ya sabes cuál )
Sumeet Deshmukh
1
AHAAA, entonces la respuesta es bastante simple. Espero poder publicarlo en algún lugar hoy.
Jacob Vlijm
@JacobVlijm lo aprecio, hombre.
Sumeet Deshmukh
Hola Sumeet, prometo que aplicaré la solución de objetos perdidos a todas las apariciones del script, incluida la que acabo de publicar. Inmediatamente si puedo respirar de nuevo :)
Jacob Vlijm

Respuestas:

6

Cómo se puede hacer

Cuando hace clic con el botón derecho en un archivo o carpeta para un script nautilus, el archivo seleccionado se pasa como argumento al script. En la mayoría de los casos por algo como:

import os
subject = os.getenv("NAUTILUS_SCRIPT_CURRENT_URI")

... usando python3, en su forma más simple.

Si reemplaza esto por:

import pyperclip

subprocess.call(["xdotool", "key", "Control_L+c"])
subject = pyperclip.paste()

... el archivo seleccionado actualmente se usa dentro del script como argumento

Que necesitas

Para usar esta solución (16.04 y superior), necesita instalar ambos xdotooly python3-pyperclip:

sudo apt-get install python3-pyperclip xdotool

El guión completo, mencionado en los comentarios.

luego se convierte en:

#!/usr/bin/env python3
import subprocess
import os
import sys
import pyperclip

# --- set the list of valid extensions below (lowercase)
# --- use quotes, *don't* include the dot!
ext = ["jpg", "jpeg", "png", "gif", "icns", "ico"]
# --- set the list of preferred filenames
# --- use quotes
specs = ["folder.png", "cover.png", "monkey.png"]
# ---

# retrieve the path of the targeted folder
subprocess.call(["xdotool", "key", "Control_L+c"])
dr = pyperclip.paste()

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        fls = os.listdir(folder)
        try:
            first = [p for p in fls if p in specs]
            first = first[0] if first else min(
                p for p in fls if p.split(".")[-1].lower() in ext
                )
        except ValueError:
            pass
        else:
            subprocess.Popen([
                "gvfs-set-attribute", "-t", "string",
                os.path.abspath(folder), "metadata::custom-icon",
                "file://"+os.path.abspath(os.path.join(folder, first))
                ])

Agregar esto a una tecla de acceso directo establecerá los íconos para todos los directorios dentro del seleccionado.

Agregarlo a una tecla de acceso directo (!)

Agregar teclas de acceso directo, ejecutar (scripts usando-) xdotoolcomandos para presionar otra combinación de teclas puede ser complicado. Para evitar que ambas combinaciones de teclas interfieran entre sí, use:

/bin/bash -c "sleep 1 && python3 /path/to/script.py"

Explicación

Cuando se presiona Ctrl+ Cmientras se selecciona un archivo, la ruta al archivo se copia al portapapeles. Estamos simulando la pulsación de tecla con:

subprocess.call(["xdotool", "key", "Control_L+c"])

pythonEl pyperclipmódulo simplemente produce la ruta, eliminada de file://cuando se usa pyperclip.paste()(esto no pegará literalmente, sino que hará que la ruta esté disponible dentro del script).

Jacob Vlijm
fuente
1

Si el objetivo es seleccionar archivos y ejecutar acciones, es posible hacerlo utilizando solo el script de shell con xdotooly xclip. Así que primero instálalos:

sudo apt-get install xdotool xclip

Y luego cree el siguiente script con las acciones dentro del bucle:

#!/bin/bash
file=$(mktemp)

xdotool key "Control_L+c"
variable="$( xclip -out -selection clipboard)"
variable="$( echo -e "$variable" | \
            awk 'BEGIN { FS = "\n" } { printf "\"%s\" ", $1 }' | \
            sed -e s#\"\"## | \
            sed 's/" "/"\n"/g')"

echo "$variable" > $file

if [ -s "$file" ]; then
   while read absolute_path_file; do
      absolute_path_file="$(eval echo "$absolute_path_file")"
      base_name="$(basename "$absolute_path_file")"
      ### Execute the actions with the selected files here
      ### echo "$absolute_path_file"
      ### echo "$base_name"
   done < $file
fi

Este script no se basa en las variables NAUTILUS y puede crear un acceso directo con él:

/bin/bash -c "sleep 1 && /path/script.bash"
Rafael Muynarsk
fuente