Linux Mint / Ubuntu: remplacer Ctrl+C / Ctrl+V par un raccourcis universel (ou presque)

Bonjour à tous,

Cet article s'adresse plutôt aux utilisateurs de machine Linux.

Introduction

Travaillant dans de nombreux environnements, j'utilise souvent les combinaisons claviers CTRL+C pour copier et CTRL+V pour coller des informations entre différents logiciels (console, web, application, etc)
Le HIC, c'est que j'utilise le pouce de la main gauche pour presser la touche CTRL gauche... tordant l'articulation du pouce qui fini par se plaindre.

Articulation du pouce mise-à-mal pour faire un Contrôle+C

Recherche d'une solution plus générique

Comme cela est peu confortable, je cherche un raccourcis clavier différent, plus facile à composer, et pouvant être utilisé dans toutes les applications.

Figurer vous que les systèmes Linux, comme Windows, ne permettent pas de remplacer -au niveau du système- la combinaison de touche pour le Copier/Coller.

C'est complètement dingue que cela ne soit pas possible en 2022!

Ajout d'un mini-clavier séparé ? --> rejeté

Il est possible d'ajouter un petit clavier supplémentaire pour presser les combinaisons Ctrl+C et Ctrl+V à notre place d'une simple pression de touche.
Possible à 100% mais nécessite de déplacer les mains hors du clavier principal... ce qui est contre productif!

Combinaisons alternatives

J'ai quand même fini par trouver une solution assez confortable pouvant fonctionner à travers le système et surtout facile à faire au clavier (toujours en utilisant le pouce mais sans contorsion.

  • ALT gauche+F1 = Copier dans les applications graphiques
  • ALT gauche+F2 = Coller dans les applications graphiques

J'aurais aimé utiliser les mêmes combinaisons dans  un terminal (ligne de commande) mais cela n'est pour l'instant pas possible. J'ai donc opté pour un autre choix intéressant pour le terminal/ligne de commande.

  • F1 = Copier dans le terminal
  • F2 = coller dans le terminal

 Des combinaisons plus confortable à composer SANS quitter le clavier. 


Cela marche plutôt bien à vu d'oeil... et s'est montré vraiment efficace dans le temps (plusieurs semaines maintenant).

Mise en place

Libérer les combinaisons autour de F1 et F2 

Modifier les raccourcis clavier système. Il n'est pas rare que F1 et ses combinaisons CTRL+F1 / ALT+F1 soit associés soient associés à la présentation de l'aide. Il faut désactiver ce raccourcis système via l'application "Raccourcis Clavier"

Raccourcis clavier système

Libérer les combinaisons autour de F1 et F2

Modifier les raccourcis du terminal 

Par défaut, le terminal utilise Ctrl+Alt+C pour Copier et Ctrl + Alt + V pour coller.
Mate Terminal propose le menu "Edition | Raccourcis Clavier" qui permet d'associer des touches différentes pour le copier-coller.
Coller=F1, Copier=F2

Le script PyInput

Finalement, c'est un script Python3 qui va nous permettre de capturer les saisies Alt+F1 et Alt+F2 au clavier pour les transformer en Ctrl+C et Ctrl+V envoyé à l'application.

Ce script n'est pas très compliqué et s'appuie sur la bibliothèque python pynput .

Pour installer pynput:

sudo apt-get install python3-dev

sudo pip3 install pynput

Ensuite, il suffit d'exécuter le script pynput-cv.py visible ci-dessous avec python3.
Le script contient toujours quelques ligne de débogage. Il est possible de le quitter en pressant la touche scroll-clock.

#!/usr/bin/env python3
from pynput import keyboard


last_pressed = None
kb_controller = keyboard.Controller()

def on_press(key):
    global last_pressed 
    #try:
    #    print('Alphanumeric key pressed: {0} '.format(key.char))
    #except AttributeError:
    #    print('special key pressed: {0}'.format(key))

    if (key == keyboard.Key.f1) or (key == keyboard.Key.f2) or (key == keyboard.Key.scroll_lock):
        last_pressed = key
    else:
        last_pressed = None

def on_release(key):
    global last_pressed
    global kb_controller
    # print('Key released: {0}'.format(key))
    if key == keyboard.Key.alt:
        if last_pressed != None: # if F1 or F2 have been pressed
            if last_pressed == keyboard.Key.f1:
                # Send Copy KeyStroke
                kb_controller.press( keyboard.Key.ctrl )
                kb_controller.press( 'c' )
                kb_controller.release( 'c' )
                kb_controller.release( keyboard.Key.ctrl )
            elif last_pressed == keyboard.Key.f2:
                # Send Paste KeyStroke
                kb_controller.press( keyboard.Key.ctrl )
                kb_controller.press( 'v' )
                kb_controller.release( 'v' )
                kb_controller.release( keyboard.Key.ctrl )
            elif last_pressed == keyboard.Key.scroll_lock:
                return False # Stop listener
        last_pressed = None

    #if key == keyboard.Key.esc:
    #    # Stop listener
    #    return False

# Collect events until released
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

Dépôt Gihub

Si vous avez la flemme de saisir le script, il est disponible dans le dépôt GitHub suivant. Je démarre toujours ce script à la main depuis un terminal... puis je l'oublie dans un coin, c'est parfait! 

Aucun commentaire