diff --git a/pkgs/tools/X11/xkeysnail/browser-emacs-bindings.py b/pkgs/tools/X11/xkeysnail/browser-emacs-bindings.py new file mode 100644 index 00000000000..697ad87a1b7 --- /dev/null +++ b/pkgs/tools/X11/xkeysnail/browser-emacs-bindings.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +import re +from xkeysnail.transform import * + +aa = False +def a_setvar(v): + def _setvar(): + transform._mark_set = False + global aa; aa = v + return _setvar +def a_ifvar(): + def _ifvar(): + transform._mark_set = False + global aa + if aa: + aa = False + return K("esc") + return K("enter") + return _ifvar +def a_flipmark(): + def _flipmark(): + transform._mark_set = not transform._mark_set; + return _flipmark + +define_keymap(re.compile("Google-chrome|Chromium-browser|Firefox"), { + K("C-b"): with_mark(K("left")), + K("C-f"): with_mark(K("right")), + K("C-p"): with_mark(K("up")), + K("C-n"): with_mark(K("down")), + K("M-b"): with_mark(K("C-left")), + K("M-f"): with_mark(K("C-right")), + K("C-a"): with_mark(K("home")), + K("C-e"): with_mark(K("end")), + + K("C-w"): [K("C-x"), set_mark(False)], + K("M-w"): [K("C-c"), K("right"), set_mark(False)], + K("C-y"): [K("C-v"), set_mark(False)], + K("C-k"): [K("Shift-end"), K("C-x"), set_mark(False)], + K("C-d"): [K("delete"), set_mark(False)], + K("M-d"): [K("C-delete"), set_mark(False)], + K("M-backspace"): [K("C-backspace"), set_mark(False)], + + K("C-slash"): [K("C-z"), set_mark(False)], + K("C-space"): a_flipmark(), + K("C-M-space"): with_or_set_mark(K("C-right")), + + # K("C-s"): K("F3"), + # K("C-r"): K("Shift-F3"), + # K("C-g"): [K("esc"), set_mark(False)] + + K("C-s"): [K("F3"), a_setvar(True)], + K("C-r"): [K("Shift-F3"), a_setvar(True)], + K("C-g"): [K("esc"), a_setvar(False)], + K("enter"): a_ifvar() +}) diff --git a/pkgs/tools/X11/xkeysnail/default.nix b/pkgs/tools/X11/xkeysnail/default.nix new file mode 100644 index 00000000000..fa52a714c7a --- /dev/null +++ b/pkgs/tools/X11/xkeysnail/default.nix @@ -0,0 +1,42 @@ +{ stdenv, lib, fetchFromGitHub, makeWrapper, python3Packages }: + +python3Packages.buildPythonApplication rec { + pname = "xkeysnail"; + version = "0.4.0"; + + src = fetchFromGitHub { + owner = "mooz"; + repo = pname; + rev = "bf3c93b4fe6efd42893db4e6588e5ef1c4909cfb"; + sha256 = "0plcpb4ndzfsd5hj32m0g32swnhyph9sd759cdhhzmjvlq3j8q6p"; + }; + + nativeBuildInputs = [ makeWrapper ]; + propagatedBuildInputs = with python3Packages; [ + evdev + xlib + inotify-simple + appdirs + ]; + + doCheck = false; + + postInstall = '' + mkdir -p $out/share + cp ./example/config.py $out/share/example.py + cp ${./browser-emacs-bindings.py} $out/share/browser.py + + makeWrapper $out/bin/xkeysnail $out/bin/xkeysnail-example \ + --add-flags "-q" --add-flags "$out/share/example.py" + makeWrapper $out/bin/xkeysnail $out/bin/xkeysnail-browser \ + --add-flags "-q" --add-flags "$out/share/browser.py" + ''; + + meta = with lib; { + description = "Yet another keyboard remapping tool for X environment"; + homepage = "https://github.com/mooz/xkeysnail"; + platforms = platforms.linux; + license = licenses.gpl1Only; + maintainers = with maintainers; [ bb2020 ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index f9e9f1faa66..e91769b5990 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9062,6 +9062,8 @@ in xkbvalidate = callPackage ../tools/X11/xkbvalidate { }; + xkeysnail = callPackage ../tools/X11/xkeysnail { }; + xfstests = callPackage ../tools/misc/xfstests { }; xprintidle-ng = callPackage ../tools/X11/xprintidle-ng {};