Dynamic key remapper for Wayland Window System, especially for Sway

Overview

test PyPI version

wayremap

Dynamic keyboard remapper for Wayland.

It works on both X Window Manager and Wayland, but focused on Wayland as it intercepts evdev input and require root permission.

Motivation

Wayland and Sway is awesome. It brings lots of benefit to Linux desktop environment.

When I was using X desktop envionment, there is an awesome tool called xremap which remap keys based on current focused application.

https://github.com/k0kubun/xremap

I was looking for something similar to xremap for Wayland, but not found, so I decided to create on my own.

Install

sudo pip install wayremap

Run

For Wayland security model, we have to do execute key remapping as root.

Simply write your own service and run it as python script:

 # /opt/wayremap.py

from wayremap.config import WayremapConfig, Binding
from wayremap.main import run
import uinput as k

wayremap_config = WayremapConfig(
    # Filter applications which remap will be applied
    applications=[
        'Chromium',
        'Brave-browser',
        'Leafpad',
        'firefoxdeveloperedition',
    ],
    bindings=[
        # Emacs-like key binding
        Binding('ctrl.alt.a', [[k.KEY_LEFTCTRL, k.KEY_HOME]]),
        Binding('ctrl.alt.e', [[k.KEY_LEFTCTRL, k.KEY_END]]),
        Binding('ctrl.alt.h', [[k.KEY_LEFTCTRL, k.KEY_BACKSPACE]]),
        Binding('ctrl.f', [[k.KEY_RIGHT]]),
        Binding('ctrl.b', [[k.KEY_LEFT]]),
        Binding('ctrl.p', [[k.KEY_UP]]),
        Binding('ctrl.n', [[k.KEY_DOWN]]),
        Binding('ctrl.k',
                [[k.KEY_LEFTSHIFT, k.KEY_END], [k.KEY_LEFTCTRL, k.KEY_X]]),
        Binding('ctrl.a', [[k.KEY_HOME]]),
        Binding('ctrl.e', [[k.KEY_END]]),
        Binding('ctrl.y', [[k.KEY_LEFTCTRL, k.KEY_V]]),
        Binding('alt.f', [[k.KEY_LEFTCTRL, k.KEY_RIGHT]]),
        Binding('alt.b', [[k.KEY_LEFTCTRL, k.KEY_LEFT]]),
        Binding('alt.d', [[k.KEY_LEFTCTRL, k.KEY_DELETE]]),
        Binding('ctrl.h', [[k.KEY_BACKSPACE]]),
        Binding('ctrl.s', [[k.KEY_LEFTCTRL, k.KEY_F]]),

        # OSX-like key binding
        Binding('alt.a', [[k.KEY_LEFTCTRL, k.KEY_A]]),
        Binding('alt.c', [[k.KEY_LEFTCTRL, k.KEY_C]]),
        Binding('alt.v', [[k.KEY_LEFTCTRL, k.KEY_V]]),
        Binding('alt.x', [[k.KEY_LEFTCTRL, k.KEY_X]]),

        # Slack helm!
        Binding('alt.x', [[k.KEY_LEFTCTRL, k.KEY_K]]),
    ])

run(wayremap_config, '/dev/input/event4')

And then

sudo modprobe uinput
sudo python /opt/wayremap.py

Note that '/dev/input/event4' varies among system.

Known bugs

  • 3 is pressed when changing focused window
  • Key repeating become slow while switching focused windowd

Roadmap

  • Enable to run wihtout Sway
  • Packaging for Arch Linux, Debian, Fedora, etc.
  • Enable to load per-application config.
  • Re-write in Rust for better performance.
Comments
  • PgUp, PgDn, + specific keyboard

    PgUp, PgDn, + specific keyboard

    Yank from reddit:

    Ooh nice. I have a usecase. Could you tell me if that would be supported?

    On my laptop keyboard PageUp and PageDown are smooshed to the arrow keys, and I keep hitting them by mistake. I would like to disable them in the terminal (mostly happens using a shell or vim).

    Perhaps remap them to [Win]+[PageDown] in case I need them anyway. BUT I do not want to disable them on my external keyboard (or alternatively when an external keyboard is connected.)

    So I would line to disable some keys on a specific input device and enable keys with modifiers (shift, win, etc)

    opened by yschaeff 6
  • support USB device

    support USB device

    • support specifying device by name
      • /dev/eventXXX can be changed if the USB device is detached/attached
    • support running multiple mappings for keyboards
    opened by acro5piano 1
  • Support remapping all keys, in addition to alphabet keys

    Support remapping all keys, in addition to alphabet keys

    All evdev keys are the following:

    KEY_0
    KEY_1
    KEY_102ND
    KEY_10CHANNELSDOWN
    KEY_10CHANNELSUP
    KEY_2
    KEY_3
    KEY_3D_MODE
    KEY_4
    KEY_5
    KEY_6
    KEY_7
    KEY_8
    KEY_9
    KEY_A
    KEY_AB
    KEY_ADDRESSBOOK
    KEY_AGAIN
    KEY_ALS_TOGGLE
    KEY_ALTERASE
    KEY_ANGLE
    KEY_APOSTROPHE
    KEY_APPSELECT
    KEY_ARCHIVE
    KEY_ASPECT_RATIO
    KEY_ASSISTANT
    KEY_ATTENDANT_OFF
    KEY_ATTENDANT_ON
    KEY_ATTENDANT_TOGGLE
    KEY_AUDIO
    KEY_AUDIO_DESC
    KEY_AUX
    KEY_B
    KEY_BACK
    KEY_BACKSLASH
    KEY_BACKSPACE
    KEY_BASSBOOST
    KEY_BATTERY
    KEY_BLUE
    KEY_BLUETOOTH
    KEY_BOOKMARKS
    KEY_BREAK
    KEY_BRIGHTNESSDOWN
    KEY_BRIGHTNESSUP
    KEY_BRIGHTNESS_AUTO
    KEY_BRIGHTNESS_CYCLE
    KEY_BRIGHTNESS_MAX
    KEY_BRIGHTNESS_MIN
    KEY_BRIGHTNESS_TOGGLE
    KEY_BRIGHTNESS_ZERO
    KEY_BRL_DOT1
    KEY_BRL_DOT10
    KEY_BRL_DOT2
    KEY_BRL_DOT3
    KEY_BRL_DOT4
    KEY_BRL_DOT5
    KEY_BRL_DOT6
    KEY_BRL_DOT7
    KEY_BRL_DOT8
    KEY_BRL_DOT9
    KEY_BUTTONCONFIG
    KEY_C
    KEY_CALC
    KEY_CALENDAR
    KEY_CAMERA
    KEY_CAMERA_DOWN
    KEY_CAMERA_FOCUS
    KEY_CAMERA_LEFT
    KEY_CAMERA_RIGHT
    KEY_CAMERA_UP
    KEY_CAMERA_ZOOMIN
    KEY_CAMERA_ZOOMOUT
    KEY_CANCEL
    KEY_CAPSLOCK
    KEY_CD
    KEY_CHANNEL
    KEY_CHANNELDOWN
    KEY_CHANNELUP
    KEY_CHAT
    KEY_CLEAR
    KEY_CLOSE
    KEY_CLOSECD
    KEY_CNT
    KEY_COFFEE
    KEY_COMMA
    KEY_COMPOSE
    KEY_COMPUTER
    KEY_CONFIG
    KEY_CONNECT
    KEY_CONTEXT_MENU
    KEY_CONTROLPANEL
    KEY_COPY
    KEY_CUT
    KEY_CYCLEWINDOWS
    KEY_D
    KEY_DASHBOARD
    KEY_DATA
    KEY_DATABASE
    KEY_DELETE
    KEY_DELETEFILE
    KEY_DEL_EOL
    KEY_DEL_EOS
    KEY_DEL_LINE
    KEY_DIGITS
    KEY_DIRECTION
    KEY_DIRECTORY
    KEY_DISPLAYTOGGLE
    KEY_DISPLAY_OFF
    KEY_DOCUMENTS
    KEY_DOLLAR
    KEY_DOT
    KEY_DOWN
    KEY_DVD
    KEY_E
    KEY_EDIT
    KEY_EDITOR
    KEY_EJECTCD
    KEY_EJECTCLOSECD
    KEY_EMAIL
    KEY_END
    KEY_ENTER
    KEY_EPG
    KEY_EQUAL
    KEY_ESC
    KEY_EURO
    KEY_EXIT
    KEY_F
    KEY_F1
    KEY_F10
    KEY_F11
    KEY_F12
    KEY_F13
    KEY_F14
    KEY_F15
    KEY_F16
    KEY_F17
    KEY_F18
    KEY_F19
    KEY_F2
    KEY_F20
    KEY_F21
    KEY_F22
    KEY_F23
    KEY_F24
    KEY_F3
    KEY_F4
    KEY_F5
    KEY_F6
    KEY_F7
    KEY_F8
    KEY_F9
    KEY_FASTFORWARD
    KEY_FASTREVERSE
    KEY_FAVORITES
    KEY_FILE
    KEY_FINANCE
    KEY_FIND
    KEY_FIRST
    KEY_FN
    KEY_FN_1
    KEY_FN_2
    KEY_FN_B
    KEY_FN_D
    KEY_FN_E
    KEY_FN_ESC
    KEY_FN_F
    KEY_FN_F1
    KEY_FN_F10
    KEY_FN_F11
    KEY_FN_F12
    KEY_FN_F2
    KEY_FN_F3
    KEY_FN_F4
    KEY_FN_F5
    KEY_FN_F6
    KEY_FN_F7
    KEY_FN_F8
    KEY_FN_F9
    KEY_FN_RIGHT_SHIFT
    KEY_FN_S
    KEY_FORWARD
    KEY_FORWARDMAIL
    KEY_FRAMEBACK
    KEY_FRAMEFORWARD
    KEY_FRONT
    KEY_FULL_SCREEN
    KEY_G
    KEY_GAMES
    KEY_GOTO
    KEY_GRAPHICSEDITOR
    KEY_GRAVE
    KEY_GREEN
    KEY_H
    KEY_HANGEUL
    KEY_HANGUEL
    KEY_HANGUP_PHONE
    KEY_HANJA
    KEY_HELP
    KEY_HENKAN
    KEY_HIRAGANA
    KEY_HOME
    KEY_HOMEPAGE
    KEY_HP
    KEY_I
    KEY_IMAGES
    KEY_INFO
    KEY_INSERT
    KEY_INS_LINE
    KEY_ISO
    KEY_J
    KEY_JOURNAL
    KEY_K
    KEY_KATAKANA
    KEY_KATAKANAHIRAGANA
    KEY_KBDILLUMDOWN
    KEY_KBDILLUMTOGGLE
    KEY_KBDILLUMUP
    KEY_KBDINPUTASSIST_ACCEPT
    KEY_KBDINPUTASSIST_CANCEL
    KEY_KBDINPUTASSIST_NEXT
    KEY_KBDINPUTASSIST_NEXTGROUP
    KEY_KBDINPUTASSIST_PREV
    KEY_KBDINPUTASSIST_PREVGROUP
    KEY_KBD_LAYOUT_NEXT
    KEY_KBD_LCD_MENU1
    KEY_KBD_LCD_MENU2
    KEY_KBD_LCD_MENU3
    KEY_KBD_LCD_MENU4
    KEY_KBD_LCD_MENU5
    KEY_KEYBOARD
    KEY_KP0
    KEY_KP1
    KEY_KP2
    KEY_KP3
    KEY_KP4
    KEY_KP5
    KEY_KP6
    KEY_KP7
    KEY_KP8
    KEY_KP9
    KEY_KPASTERISK
    KEY_KPCOMMA
    KEY_KPDOT
    KEY_KPENTER
    KEY_KPEQUAL
    KEY_KPJPCOMMA
    KEY_KPLEFTPAREN
    KEY_KPMINUS
    KEY_KPPLUS
    KEY_KPPLUSMINUS
    KEY_KPRIGHTPAREN
    KEY_KPSLASH
    KEY_L
    KEY_LANGUAGE
    KEY_LAST
    KEY_LEFT
    KEY_LEFTALT
    KEY_LEFTBRACE
    KEY_LEFTCTRL
    KEY_LEFTMETA
    KEY_LEFTSHIFT
    KEY_LEFT_DOWN
    KEY_LEFT_UP
    KEY_LIGHTS_TOGGLE
    KEY_LINEFEED
    KEY_LIST
    KEY_LOGOFF
    KEY_M
    KEY_MACRO
    KEY_MACRO1
    KEY_MACRO10
    KEY_MACRO11
    KEY_MACRO12
    KEY_MACRO13
    KEY_MACRO14
    KEY_MACRO15
    KEY_MACRO16
    KEY_MACRO17
    KEY_MACRO18
    KEY_MACRO19
    KEY_MACRO2
    KEY_MACRO20
    KEY_MACRO21
    KEY_MACRO22
    KEY_MACRO23
    KEY_MACRO24
    KEY_MACRO25
    KEY_MACRO26
    KEY_MACRO27
    KEY_MACRO28
    KEY_MACRO29
    KEY_MACRO3
    KEY_MACRO30
    KEY_MACRO4
    KEY_MACRO5
    KEY_MACRO6
    KEY_MACRO7
    KEY_MACRO8
    KEY_MACRO9
    KEY_MACRO_PRESET1
    KEY_MACRO_PRESET2
    KEY_MACRO_PRESET3
    KEY_MACRO_PRESET_CYCLE
    KEY_MACRO_RECORD_START
    KEY_MACRO_RECORD_STOP
    KEY_MAIL
    KEY_MAX
    KEY_MEDIA
    KEY_MEDIA_REPEAT
    KEY_MEDIA_TOP_MENU
    KEY_MEMO
    KEY_MENU
    KEY_MESSENGER
    KEY_MHP
    KEY_MICMUTE
    KEY_MINUS
    KEY_MIN_INTERESTING
    KEY_MODE
    KEY_MOVE
    KEY_MP3
    KEY_MSDOS
    KEY_MUHENKAN
    KEY_MUTE
    KEY_N
    KEY_NEW
    KEY_NEWS
    KEY_NEXT
    KEY_NEXTSONG
    KEY_NEXT_FAVORITE
    KEY_NOTIFICATION_CENTER
    KEY_NUMERIC_0
    KEY_NUMERIC_1
    KEY_NUMERIC_11
    KEY_NUMERIC_12
    KEY_NUMERIC_2
    KEY_NUMERIC_3
    KEY_NUMERIC_4
    KEY_NUMERIC_5
    KEY_NUMERIC_6
    KEY_NUMERIC_7
    KEY_NUMERIC_8
    KEY_NUMERIC_9
    KEY_NUMERIC_A
    KEY_NUMERIC_B
    KEY_NUMERIC_C
    KEY_NUMERIC_D
    KEY_NUMERIC_POUND
    KEY_NUMERIC_STAR
    KEY_NUMLOCK
    KEY_O
    KEY_OK
    KEY_ONSCREEN_KEYBOARD
    KEY_OPEN
    KEY_OPTION
    KEY_P
    KEY_PAGEDOWN
    KEY_PAGEUP
    KEY_PASTE
    KEY_PAUSE
    KEY_PAUSECD
    KEY_PAUSE_RECORD
    KEY_PC
    KEY_PHONE
    KEY_PICKUP_PHONE
    KEY_PLAY
    KEY_PLAYCD
    KEY_PLAYER
    KEY_PLAYPAUSE
    KEY_POWER
    KEY_POWER2
    KEY_PRESENTATION
    KEY_PREVIOUS
    KEY_PREVIOUSSONG
    KEY_PRINT
    KEY_PRIVACY_SCREEN_TOGGLE
    KEY_PROG1
    KEY_PROG2
    KEY_PROG3
    KEY_PROG4
    KEY_PROGRAM
    KEY_PROPS
    KEY_PVR
    KEY_Q
    KEY_QUESTION
    KEY_R
    KEY_RADIO
    KEY_RECORD
    KEY_RED
    KEY_REDO
    KEY_REFRESH
    KEY_REPLY
    KEY_RESERVED
    KEY_RESTART
    KEY_REWIND
    KEY_RFKILL
    KEY_RIGHT
    KEY_RIGHTALT
    KEY_RIGHTBRACE
    KEY_RIGHTCTRL
    KEY_RIGHTMETA
    KEY_RIGHTSHIFT
    KEY_RIGHT_DOWN
    KEY_RIGHT_UP
    KEY_RO
    KEY_ROOT_MENU
    KEY_ROTATE_DISPLAY
    KEY_ROTATE_LOCK_TOGGLE
    KEY_S
    KEY_SAT
    KEY_SAT2
    KEY_SAVE
    KEY_SCALE
    KEY_SCREEN
    KEY_SCREENLOCK
    KEY_SCREENSAVER
    KEY_SCROLLDOWN
    KEY_SCROLLLOCK
    KEY_SCROLLUP
    KEY_SEARCH
    KEY_SELECT
    KEY_SELECTIVE_SCREENSHOT
    KEY_SEMICOLON
    KEY_SEND
    KEY_SENDFILE
    KEY_SETUP
    KEY_SHOP
    KEY_SHUFFLE
    KEY_SLASH
    KEY_SLEEP
    KEY_SLOW
    KEY_SLOWREVERSE
    KEY_SOUND
    KEY_SPACE
    KEY_SPELLCHECK
    KEY_SPORT
    KEY_SPREADSHEET
    KEY_STOP
    KEY_STOPCD
    KEY_STOP_RECORD
    KEY_SUBTITLE
    KEY_SUSPEND
    KEY_SWITCHVIDEOMODE
    KEY_SYSRQ
    KEY_T
    KEY_TAB
    KEY_TAPE
    KEY_TASKMANAGER
    KEY_TEEN
    KEY_TEXT
    KEY_TIME
    KEY_TITLE
    KEY_TOUCHPAD_OFF
    KEY_TOUCHPAD_ON
    KEY_TOUCHPAD_TOGGLE
    KEY_TUNER
    KEY_TV
    KEY_TV2
    KEY_TWEN
    KEY_U
    KEY_UNDO
    KEY_UNKNOWN
    KEY_UNMUTE
    KEY_UP
    KEY_UWB
    KEY_V
    KEY_VCR
    KEY_VCR2
    KEY_VENDOR
    KEY_VIDEO
    KEY_VIDEOPHONE
    KEY_VIDEO_NEXT
    KEY_VIDEO_PREV
    KEY_VOD
    KEY_VOICECOMMAND
    KEY_VOICEMAIL
    KEY_VOLUMEDOWN
    KEY_VOLUMEUP
    KEY_W
    KEY_WAKEUP
    KEY_WIMAX
    KEY_WLAN
    KEY_WORDPROCESSOR
    KEY_WPS_BUTTON
    KEY_WWAN
    KEY_WWW
    KEY_X
    KEY_XFER
    KEY_Y
    KEY_YELLOW
    KEY_YEN
    KEY_Z
    KEY_ZENKAKUHANKAKU
    KEY_ZOOM
    KEY_ZOOMIN
    KEY_ZOOMOUT
    KEY_ZOOMRESET
    

    got it by printing code by editing this file: ~/.local/lib/python3.9/site-packages/evdev/ecodes.py

    The original file is written c lang and not found the source.

    opened by acro5piano 1
  • Feature Request: Different bindings per application

    Feature Request: Different bindings per application

    Unless I'm not understanding correctly, there isn't currently a way to configure a different set of bindings per application.

    I'd like to have apple style copy and paste on everything, but to do that I need to send control+c for most applications and control+shift+c for a handful of specific applications (my terminal)

    opened by minego 1
  • Keys are not being remapped

    Keys are not being remapped

    I think I have it installed and running correctly... I checked out the repo, ran 'pip3 install .' from the repo, and then went into /usr/lib/python3.10/site-packages/wayremap to modify the configuration and run it.

    I had to change main.py to use event22 instead of event4 (22 is my keyboard, 4 is my HDMI monitor).

    It is successfully recognizing when focus changes to a different application, but pressing the keys I have configured does not appear to do anything. I'm a bit lost...

    opened by minego 1
Releases(v0.0.9)
  • v0.0.9(Feb 19, 2022)

    What's Changed

    • breaking: support multiple keyboards (like USB keyboard) by @acro5piano in https://github.com/acro5piano/wayremap/pull/9
    • enable to wait sway startup by @acro5piano in https://github.com/acro5piano/wayremap/pull/10

    Full Changelog: https://github.com/acro5piano/wayremap/compare/v0.0.8...v0.0.9

    Source code(tar.gz)
    Source code(zip)
  • v0.0.8(Dec 12, 2021)

    What's Changed

    • works without sway, warning if no applications selected by @acro5piano in https://github.com/acro5piano/wayremap/pull/4
    • new config format to support all keys, close #2 by @acro5piano in https://github.com/acro5piano/wayremap/pull/5

    Breaking Change :warning:

    The config format was changed. To migrate, please see https://github.com/acro5piano/wayremap/commit/06d27c9bb86b766d7fd1e4230f3a16827785519e#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5R39-L52

    Full Changelog: https://github.com/acro5piano/wayremap/compare/v0.0.7...v0.0.8

    Source code(tar.gz)
    Source code(zip)
  • v0.0.7-1(Dec 10, 2021)

  • v0.0.7(Dec 10, 2021)

  • v0.0.6(Dec 10, 2021)

Owner
Kay Gosho
A Web Developer betting on TypeScript + GraphQL.
Kay Gosho
Python utilities for writing cross-version compatible libraries

Python utilities for writing cross-version compatible libraries

Tyler M. Kontra 85 Jun 29, 2022
This script allows you to retrieve all functions / variables names of a Python code, and the variables values.

Memory Extractor This script allows you to retrieve all functions / variables names of a Python code, and the variables values. How to use it ? The si

Venax 2 Dec 26, 2021
Dill_tils is a package that has my commonly used functions inside it for ease of use.

DilllonB07 Utilities Dill_tils is a package that has my commonly used functions inside it for ease of use. Installation Anyone can use this package by

Dillon Barnes 2 Dec 05, 2021
This is Cool Utility tools that you can use in python.

This is Cool Utility tools that you can use in python. There are a few tools that you might find very useful, you can use this on pretty much any project and some utils might help you a lot and save

Senarc Studios 6 Apr 18, 2022
This code renames subtitle file names to your video files names, so you don't need to rename them manually.

Rename Subtitle This code renames your subtitle file names to your video file names so you don't need to do it manually Note: It only works for series

Mostafa Kazemi 4 Sep 12, 2021
A small utility that sorts your files.

FileSorter A small utility that sorts your files. TODO: Scan directory to find files(thanks @corruptmemry for this!) Split extensions to determine fil

2 Jun 16, 2022
general-phylomoji: a phylogenetic tree of emoji

general-phylomoji: a phylogenetic tree of emoji

2 Dec 11, 2021
A Python library for reading, writing and visualizing the OMEGA Format

A Python library for reading, writing and visualizing the OMEGA Format, targeted towards storing reference and perception data in the automotive context on an object list basis with a focus on an urb

Institut für Kraftfahrzeuge, RWTH Aachen, ika 12 Sep 01, 2022
Airspy-Utils is a small software collection to help with firmware related operations on Airspy HF+ devices.

Airspy-Utils Airspy-Utils is a small software collection to help with firmware related operations on Airspy HF+ devices on Linux (and other free syste

Dhiru Kholia 11 Oct 04, 2022
🦩 A Python tool to create comment-free Jupyter notebooks.

Pelikan Pelikan lets you convert notebooks to comment-free notebooks. In other words, It removes Python block and inline comments from source cells in

Hakan Özler 7 Nov 20, 2021
A python app which aggregates and splits costs from multiple public cloud providers into a csv

Cloud Billing This project aggregates the costs public cloud resources by accounts, services and tags by importing the invoices from public cloud prov

1 Oct 04, 2022
Just some scripts to export vector tiles to geojson.

Vector tiles to GeoJSON Nowadays modern web maps are usually based on vector tiles. The great thing about vector tiles is, that they are not just imag

Lilith Wittmann 77 Jul 26, 2022
This tool analyzes the json files generated by stream-lnd-htlcs to find hidden channel demand.

analyze_lnd_htlc Introduction Rebalancing channels is an important part of running a Lightning Network node. While it would be great if all channels c

Marimox 4 Dec 08, 2022
Give you a better view of your Docker registry disk usage.

registry-du Give you a better view of your Docker registry disk usage. This small tool will analysis your Docker registry(vanilla or Harbor both work)

Nova Kwok 16 Jan 07, 2023
Numbers-parser - Python module for parsing Apple Numbers .numbers files

numbers-parser numbers-parser is a Python module for parsing Apple Numbers .numbers files. It supports Numbers files generated by Numbers version 10.3

Jon Connell 154 Jan 05, 2023
✨ Une calculatrice totalement faite en Python par moi, et en français.

Calculatrice ❗ Une calculatrice totalement faite en Python par moi, et en français. 🔮 Voici une calculatrice qui vous permet de faire vos additions,

MrGabin 3 Jun 06, 2021
Control-Alt-Delete - Help Tux Escape Beastie's Jail!

Control-Alt-Delete Help Tux escape Beastie's jail by completing the following challenges! Challenges Challenge 00: Drinks: Tux needs to drink less. Ch

NDLUG 8 Oct 31, 2021
These scripts look for non-printable unicode characters in all text files in a source tree

find-unicode-control These scripts look for non-printable unicode characters in all text files in a source tree. find_unicode_control.py should work w

Siddhesh Poyarekar 25 Aug 30, 2022
Protect your eyes from eye strain using this simple and beautiful, yet extensible break reminder

Protect your eyes from eye strain using this simple and beautiful, yet extensible break reminder

Gobinath 1.2k Jan 01, 2023
Python library to decorate and beautify strings

outputformat Python library to decorate and beautify your standard output 💖 Ins

Felipe Delestro Matos 259 Dec 13, 2022