2 votes

supprimer le précédent "file://" lors du collage dans le terminal gnome

J'utilise Ubuntu 14.04 mais je suppose que ce problème peut être observé dans presque toutes les versions d'Ubuntu.

Lorsque je copie un fichier à partir de nautilus en utilisant Ctrlc et coller dans gedit il colle le texte comme /home/urvish/.bash_history ce qui est parfait pour moi. Mais lorsque je le colle dans le terminal en utilisant CtrlShiftv c'est comme ça file:///home/urvish/.bash_history .

Y a-t-il un moyen d'enlever ce qui précède ? file:// pendant le collage ? (Je sais que je peux le faire manuellement mais je le fais très fréquemment et le faire manuellement prend du temps).

0voto

Sergiy Kolodyazhnyy Points 97292

Ce que fait gnome-terminal

En lisant la documentation de Gtk, il semble qu'il y ait 2 façons pour un programme de traiter le contenu du presse-papiers - du texte brut et une liste d'URIs vers un fichier. Pour une raison quelconque, gnome-terminal a décidé que ce serait une bonne idée de faire la différence entre les deux, et donc que lorsque vous copiez un fichier de Nautilus à gnome-terminal le terminal récupère la liste des URI, tandis que les autres programmes ne récupèrent que du texte brut.

L'édition automatique du presse-papiers serait légèrement gênante ( bien que je poursuive toujours l'idée) - nous aurions besoin de définir un moyen de détecter où vous essayez de coller le contenu du presse-papiers, et l'exécution d'un script persistant qui édite script en texte brut ( supprimant effectivement les URI) vous empêchera de copier des fichiers d'une fenêtre Nautilus à une autre.

Le "glisser-déposer" est probablement la solution la plus simple. Mais comme une approche par script a été demandée, j'ai eu l'idée de deux approches manuelles. L'une s'appuie sur la fonction intégrée du Nautilus qui consiste à ajouter scripts à votre menu de clic droit. L'autre sur la saisie d'un raccourci spécifique avant collage dans gnome-terminal.

Approche manuelle du script, version 1

Ce script est à placer dans ~/.local/share/nautilus/scripts et rendu exécutable via chmod +x ~/.local/share/nautilus/scripts/scriptname.sh ou en faisant un clic droit sur le fichier et en modifiant l'onglet Permissions dans les propriétés. En fait, il vous permet de copier le chemin d'accès aux fichiers sélectionnés sous forme de chaînes entre guillemets et avec les éléments suivants file:// partie enlevée.

Pour l'utiliser, sélectionnez un ou plusieurs fichiers dans Nautilus, puis cliquez dessus avec le bouton droit de la souris. Sélectionnez Scripts menu -> your_script_name.py .

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from gi.repository import Gtk, Gdk
import sys
import os
import time
import subprocess
import signal
import urllib.parse
import threading

def autoquit(*args):
    subprocess.call(['zenity','--info'])
    time.sleep(1)
    Gtk.main_quit()

def main():

    uris = os.getenv("NAUTILUS_SCRIPT_SELECTED_URIS")
    new_text = " ".join([ "'" + urllib.parse.unquote(i).replace('file://','') + "'"
                          for i in uris.split()])

    clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
    if clip.set_text(new_text,-1):
        thread = threading.Thread(target=autoquit)
        thread.start()
    Gtk.main()

if __name__ == '__main__': 
    try:
        main()
    except Exception as e:
        subprocess.call(['zenity','--info','--text',str(e)])

Approche manuelle du script, version 2

Cette approche repose sur l'idée d'exécuter le script Python ci-dessous juste avant de coller en gnome-terminal . Vous pouvez l'appeler depuis gnome-terminal manuellement en tant que commande, ou liez-le à un raccourci clavier. Ainsi, avec la méthode du raccourci, je le lierais à CtrlShiftB (parce que B et V sont proches sur le clavier), et à chaque fois que j'ai besoin de coller depuis Nautilus, j'appuie sur CtrlShiftB pour modifier, puis CtrlShiftV à coller

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from gi.repository import Gtk, Gdk
import subprocess
import urllib.parse
import signal
import sys

def unquote_uri(*args):
    uris = args[-2]
    new_text = " ".join([ "'" + str(urllib.parse.unquote(i).replace('file://','')) + "'"
                          for i in uris])
    print(new_text)
    args[-3].clear()
    args[-3].set_text(new_text,-1)
    Gtk.main_quit()

def main():
    cached = str()
    clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
    clip.request_uris(unquote_uri, None)
    signal.signal(signal.SIGINT,signal.SIG_DFL)
    Gtk.main()

if __name__ == '__main__': main()

Clause de non-responsabilité : la réponse est encore en cours d'élaboration ; des contenus/idées supplémentaires peuvent être ajoutés ultérieurement.

0voto

faustus Points 101

J'arrive un peu tard dans la soirée, mais je rencontre ce problème sur Linux Mint MATE (mate-terminal).

Il semble que le simple fait de saisir le contenu du presse-papiers, puis de le repasser au presse-papiers, suffise. Si c'est le cas, nous devons seulement nous préoccuper de tester si le contenu du presse-papiers comprend un ou plusieurs chemins de fichiers valides, et laisser le reste intact.

Ce qui suit supprimera le préfixe file:// sur Mint :

#!/usr/bin/env python

import os
import pyperclip
import time

class ClipboardWatcher():

    def __init__(self,latency):
        self.clipboard_last = pyperclip.paste()
        self.clipboard_now = None
        self.latency = latency

    def check_clipboard(self):

        # assume clipboard is space delimited list of valid paths
        as_list = self.clipboard_now.split()  
        valid_path = [ i for i in as_list if os.path.exists(i) ] 

        if len(as_list) == len(valid_path): # assumption true
            self.clipboard_now = " ".join(valid_path) 
            return True

        return False

    def run(self):
        while True:
            time.sleep(self.latency)  
            self.clipboard_now = pyperclip.paste()
            if self.clipboard_now != self.clipboard_last:                 
                if self.check_clipboard(): 
                    pyperclip.copy(self.clipboard_now)
                    print "Matched:", self.clipboard_now
            self.clipboard_last = self.clipboard_now

clippy = ClipboardWatcher(1)  # watch every n seconds
clippy.run()

Si vous deviez mettre en œuvre ce genre d'approche, vous voudriez probablement aussi la démoniser. Le module pyperclip peut être obtenu avec :

sudo pip install pyperclip

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X