diff --git a/configuration.nix b/configuration.nix index 3d74d8c..c1b846f 100644 --- a/configuration.nix +++ b/configuration.nix @@ -56,14 +56,16 @@ # services.xserver.enable = true; services.xserver = { enable = true; - layout = "de"; - xkbOptions = "eurosign;e,caps:escape"; - libinput.enable = true; - displayManager = { - sddm.enable = true; - }; + xkb.layout = "de"; + xkb.options = "eurosign;e,caps:escape"; }; + services.displayManager = { + sddm.enable = true; + }; + + services.libinput.enable = true; + programs.hyprland.enable = true; services.flatpak.enable = true; nixpkgs.config.allowUnfree = true; diff --git a/emacs/emacs.nix b/emacs/emacs.nix index 52f8325..5630a24 100644 --- a/emacs/emacs.nix +++ b/emacs/emacs.nix @@ -16,18 +16,6 @@ enable = true; text = builtins.readFile ./templates; }; - home.file.".emacs.d/lib/smartparens-emacs-lisp.el" = { - enable = true; - text = builtins.readFile ./lib/smartparens-emacs-lisp.el; - }; - home.file.".emacs.d/lib/smartparens-scheme.el" = { - enable = true; - text = builtins.readFile ./lib/smartparens-scheme.el; - }; - home.file.".emacs.d/lib/smartparens-clojure.el" = { - enable = true; - text = builtins.readFile ./lib/smartparens-clojure.el; - }; programs.emacs = { enable = true; package = pkgs.emacs29-pgtk; diff --git a/emacs/lib/smartparens-clojure.el b/emacs/lib/smartparens-clojure.el deleted file mode 100644 index c187e53..0000000 --- a/emacs/lib/smartparens-clojure.el +++ /dev/null @@ -1,59 +0,0 @@ -;;; smartparens-clojure.el --- Additional configuration for Clojure mode. -*- lexical-binding: t; -*- - -;; Copyright (C) 2016, 2018-2019 Vitalie Spinu, Matus Goljer - -;; Author: Vitalie Spinu -;; Maintainer: Matus Goljer -;; Created: 14 July 2016 -;; Keywords: abbrev convenience editing -;; URL: https://github.com/Fuco1/smartparens -;; -;; This file is not part of GNU Emacs. -;; -;;; License: -;; -;; This file is part of Smartparens. -;; -;; Smartparens is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. -;; -;; Smartparens is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Smartparens. If not, see . -;; -;;; Commentary: -;; -;; This file provides some additional configuration for Clojure mode. To use -;; it, simply add: -;; -;; (require 'smartparens-clojure) -;; -;; into your configuration. You can use this in conjunction with the -;; default config or your own configuration. -;; -;;; Code: - -(require 'smartparens) - -(defvar sp-clojure-prefix "\\(?:[@`'#~,_?^]+\\)" - "Prefix used in `sp-sexp-prefix' for clojure modes.") - -(dolist (mode '(clojure-mode clojurescript-mode clojurec-mode cider-repl-mode)) - (add-to-list 'sp-sexp-prefix `(,mode regexp ,sp-clojure-prefix))) - -;; Match "`" with "`" in strings and comments -(sp-with-modes sp-clojure-modes - (sp-local-pair "'" nil :actions nil) - (sp-local-pair "`" "`" - :when '(sp-in-string-p - sp-in-comment-p) - :unless '(sp-lisp-invalid-hyperlink-p))) - -(provide 'smartparens-clojure) -;;; smartparens-clojure.el ends here diff --git a/emacs/lib/smartparens-emacs-lisp.el b/emacs/lib/smartparens-emacs-lisp.el deleted file mode 100644 index e885495..0000000 --- a/emacs/lib/smartparens-emacs-lisp.el +++ /dev/null @@ -1,61 +0,0 @@ -;;; smartparens-clojure.el --- Additional configuration for Emacs Lisp mode. -*- lexical-binding: t; -*- - -;; Copyright (C) 2023 Daniel Ziltener - -;; Author: Daniel Ziltener -;; Created: 13 December 2023 -;; Keywords: abbrev convenience editing -;; URL: https://github.com/Fuco1/smartparens -;; -;; This file is not part of GNU Emacs. -;; -;;; License: -;; -;; This file is part of Smartparens. -;; -;; Smartparens is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. -;; -;; Smartparens is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Smartparens. If not, see . -;; -;;; Commentary: -;; -;; This file provides some additional configuration for Emacs Lisp mode. To use -;; it, simply add: -;; -;; (require 'smartparens-emacs-lisp) -;; -;; into your configuration. You can use this in conjunction with the -;; default config or your own configuration. -;; -;;; Code: - -(require 'smartparens) - -(defvar sp-emacs-lisp-prefix "\\(?:[@`'#,_]+\\)" - "Prefix used in `sp-sexp-prefix' for emacs lisp mode.") - -(defvar sp-emacs-lisp-modes '(emacs-lisp-mode lisp-data-mode) - "List of Emacs Lisp-related modes.") - -(dolist (mode sp-emacs-lisp-modes) - (add-to-list 'sp-sexp-prefix `(,mode regexp ,sp-emacs-lisp-prefix))) - -;; Match "`" with "`" in strings and comments -(sp-with-modes sp-emacs-lisp-modes - (sp-local-pair "'" nil :actions nil) - (sp-local-pair "`" "`" - :when '(sp-in-string-p - sp-in-comment-p))) - -(provide 'smartparens-emacs-lisp) -;;; smartparens-emacs-lisp.el ends here - diff --git a/emacs/lib/smartparens-scheme.el b/emacs/lib/smartparens-scheme.el deleted file mode 100644 index dd80c74..0000000 --- a/emacs/lib/smartparens-scheme.el +++ /dev/null @@ -1,60 +0,0 @@ -;;; smartparens-clojure.el --- Additional configuration for Emacs Lisp mode. -*- lexical-binding: t; -*- - -;; Copyright (C) 2023 Daniel Ziltener - -;; Author: Daniel Ziltener -;; Created: 13 December 2023 -;; Keywords: abbrev convenience editing -;; URL: https://github.com/Fuco1/smartparens -;; -;; This file is not part of GNU Emacs. -;; -;;; License: -;; -;; This file is part of Smartparens. -;; -;; Smartparens is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. -;; -;; Smartparens is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Smartparens. If not, see . -;; -;;; Commentary: -;; -;; This file provides some additional configuration for Emacs Lisp mode. To use -;; it, simply add: -;; -;; (require 'smartparens-scheme) -;; -;; into your configuration. You can use this in conjunction with the -;; default config or your own configuration. -;; -;;; Code: - -(require 'smartparens) - -(defvar sp-scheme-prefix "\\(?:[@`'#,_]+\\)" - "Prefix used in `sp-sexp-prefix' for emacs lisp mode.") - -(defvar sp-scheme-modes '(scheme-mode geiser-mode) - "List of Scheme-related modes.") - -(dolist (mode sp-scheme-modes) - (add-to-list 'sp-sexp-prefix `(,mode regexp ,sp-scheme-prefix))) - -;; Match "`" with "`" in strings and comments -(sp-with-modes sp-scheme-modes - (sp-local-pair "'" nil :actions nil) - (sp-local-pair "`" "`" - :when '(sp-in-string-p - sp-in-comment-p))) - -(provide 'smartparens-scheme) -;;; smartparens-scheme.el ends here diff --git a/flake.lock b/flake.lock index 10b8c89..ebbb6fc 100644 --- a/flake.lock +++ b/flake.lock @@ -41,181 +41,6 @@ "type": "github" } }, - "hyprcursor": { - "inputs": { - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1720108799, - "narHash": "sha256-AxRkTJlbB8r7aG6gvc7IaLhc2T9TO4/8uqanKRxukBQ=", - "owner": "hyprwm", - "repo": "hyprcursor", - "rev": "a5c0d57325c5f0814c39110a70ca19c070ae9486", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprcursor", - "type": "github" - } - }, - "hyprland": { - "inputs": { - "hyprcursor": "hyprcursor", - "hyprlang": "hyprlang", - "hyprutils": "hyprutils", - "hyprwayland-scanner": "hyprwayland-scanner", - "nixpkgs": "nixpkgs_2", - "systems": "systems_2", - "xdph": "xdph" - }, - "locked": { - "lastModified": 1719317162, - "narHash": "sha256-t3N0VzDJdxchdmHkbGMGqvoxTq/Bm7Y98upU4icPYLY=", - "owner": "hyprwm", - "repo": "Hyprland", - "rev": "918d8340afd652b011b937d29d5eea0be08467f5", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "ref": "v0.41.2", - "repo": "Hyprland", - "type": "github" - } - }, - "hyprland-protocols": { - "inputs": { - "nixpkgs": [ - "hyprland", - "xdph", - "nixpkgs" - ], - "systems": [ - "hyprland", - "xdph", - "systems" - ] - }, - "locked": { - "lastModified": 1718746314, - "narHash": "sha256-HUklK5u86w2Yh9dOkk4FdsL8eehcOZ95jPhLixGDRQY=", - "owner": "hyprwm", - "repo": "hyprland-protocols", - "rev": "1b61f0093afff20ab44d88ad707aed8bf2215290", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-protocols", - "type": "github" - } - }, - "hyprlang": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1720381373, - "narHash": "sha256-lyC/EZdHULsaAKVryK11lgHY9u6pXr7qR4irnxNWC7k=", - "owner": "hyprwm", - "repo": "hyprlang", - "rev": "5df0174fd09de4ac5475233d65ffc703e89b82eb", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprlang", - "type": "github" - } - }, - "hyprutils": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1720472788, - "narHash": "sha256-FZjoeMfgQLeBFGvpaUBnTMP4evAv44LDPr7mv4Tzc04=", - "owner": "hyprwm", - "repo": "hyprutils", - "rev": "c342d5ca44ec4ecbd39b595d458ea58214b5d871", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprutils", - "type": "github" - } - }, - "hyprwayland-scanner": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1720215857, - "narHash": "sha256-JPdL+Qul+jEueAn8CARfcWP83eJgwkhMejQYfDvrgvU=", - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "rev": "d5fa094ca27e0039be5e94c0a80ae433145af8bb", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "type": "github" - } - }, - "nix-filter": { - "locked": { - "lastModified": 1693833173, - "narHash": "sha256-hlMABKrGbEiJD5dwUSfnw1CQ3bG7KKwDV+Nx3bEZd7U=", - "owner": "numtide", - "repo": "nix-filter", - "rev": "ac030bd9ba98e318e1f4c4328d60766ade8ebe8b", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "nix-filter", - "type": "github" - } - }, "nixpkgs": { "locked": { "lastModified": 1701156937, @@ -233,22 +58,6 @@ } }, "nixpkgs_2": { - "locked": { - "lastModified": 1700612854, - "narHash": "sha256-yrQ8osMD+vDLGFX7pcwsY/Qr5PUd6OmDMYJZzZi0+zc=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "19cbff58383a4ae384dea4d1d0c823d72b49d614", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_3": { "locked": { "lastModified": 1720386169, "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", @@ -268,30 +77,7 @@ "inputs": { "flatpaks": "flatpaks", "home-manager": "home-manager", - "hyprland": "hyprland", - "nixpkgs": "nixpkgs_3", - "split-monitor-workspaces": "split-monitor-workspaces" - } - }, - "split-monitor-workspaces": { - "inputs": { - "hyprland": [ - "hyprland" - ], - "nix-filter": "nix-filter" - }, - "locked": { - "lastModified": 1698179193, - "narHash": "sha256-zDW+72enuRGuLLRbO1+pYk8FgRjQrBGksIAOk88OwOI=", - "owner": "Duckonaut", - "repo": "split-monitor-workspaces", - "rev": "2b1abdbf9e9de9ee660540167c8f51903fa3d959", - "type": "github" - }, - "original": { - "owner": "Duckonaut", - "repo": "split-monitor-workspaces", - "type": "github" + "nixpkgs": "nixpkgs_2" } }, "systems": { @@ -309,21 +95,6 @@ "type": "github" } }, - "systems_2": { - "locked": { - "lastModified": 1689347949, - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", - "owner": "nix-systems", - "repo": "default-linux", - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default-linux", - "type": "github" - } - }, "utils": { "inputs": { "systems": "systems" @@ -341,32 +112,6 @@ "repo": "flake-utils", "type": "github" } - }, - "xdph": { - "inputs": { - "hyprland-protocols": "hyprland-protocols", - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1700508250, - "narHash": "sha256-X4o/mifI7Nhu0UKYlxx53wIC+gYDo3pVM9L2u3PE2bE=", - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "rev": "eb120ff25265ecacd0fc13d7dab12131b60d0f47", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 20ee421..bc69137 100644 --- a/flake.nix +++ b/flake.nix @@ -23,17 +23,10 @@ url = "github:nix-community/home-manager/release-24.05"; inputs.nixpkgs.follows = "nixpkgs"; }; - hyprland = { - url = "github:hyprwm/Hyprland/v0.41.2"; - }; - hyprsplit = { - url = "github:shezdy/hyprsplit"; - inputs.hyprland.follows = "hyprland"; - }; flatpaks.url = "github:GermanBread/declarative-flatpak/stable"; }; - outputs = inputs@{ nixpkgs, home-manager, hyprland, hyprsplit, flatpaks, ... }: { + outputs = inputs@{ nixpkgs, home-manager, flatpaks, ... }: { nixosConfigurations = { "ziltis-desktop" = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; diff --git a/home.nix b/home.nix index 189adf4..76e4160 100644 --- a/home.nix +++ b/home.nix @@ -1,4 +1,4 @@ -args@{ config, pkgs, hyprland, split-monitor-workspaces, flatpaks, ... }: +args@{ config, pkgs, split-monitor-workspaces, flatpaks, ... }: { home.username = "zilti"; @@ -40,7 +40,7 @@ args@{ config, pkgs, hyprland, split-monitor-workspaces, flatpaks, ... }: # (nerdfonts.override { fonts = [ "VictorMono" "MPlus" ]; }) nerdfonts nil - nixfmt + nixfmt-classic nwg-displays pciutils # perl538Packages.DigestHMAC @@ -85,7 +85,7 @@ args@{ config, pkgs, hyprland, split-monitor-workspaces, flatpaks, ... }: home.sessionVariables = { #PASSWORD_STORE_DIR = "${config.home.homeDirectory}/.local/share/password-store"; PATH = "$PATH:~/.local/bin"; - PASSWORD_STORE_DIR = "$XDG_DATA_HOME/password-store"; + #PASSWORD_STORE_DIR = "$XDG_DATA_HOME/password-store"; SSH_ASKPASS = "${pkgs.libsForQt5.ksshaskpass}/bin/ksshaskpass"; CHICKEN_DOC_REPOSITORY = "$XDG_DATA_HOME/chicken/doc"; CHICKEN_INSTALL_REPOSITORY = "$XDG_DATA_HOME/chicken/eggs"; @@ -268,8 +268,6 @@ args@{ config, pkgs, hyprland, split-monitor-workspaces, flatpaks, ... }: programs.ripgrep = { enable = true; }; - programs.gpg = { enable = true; }; - home.file.".config/senpai/senpai.scfg" = { enable = true; text = '' @@ -280,11 +278,23 @@ args@{ config, pkgs, hyprland, split-monitor-workspaces, flatpaks, ... }: ''; }; - home.file.".gnupg/gpg-agent.conf" = { + programs.gpg = { enable = true; - text = '' - grab - pinentry-program ${pkgs.pinentry-qt}/bin/pinentry-qt + settings = { + utf8-strings = true; + auto-key-retrieve = true; + }; + }; + + services.gpg-agent = { + enable = true; + enableSshSupport = true; + defaultCacheTtl = 7200; + maxCacheTtl = 7200; + defaultCacheTtlSsh = 7200; + maxCacheTtlSsh = 7200; + pinentryPackage = pkgs.pinentry-qt; + extraConfig = '' allow-emacs-pinentry allow-loopback-pinentry ''; @@ -295,7 +305,7 @@ args@{ config, pkgs, hyprland, split-monitor-workspaces, flatpaks, ... }: settings = { base_url = "vaultwarden.lyrion.ch"; email = "dziltener@lyrion.ch"; - pinentry = "qt"; + pinentry = pkgs.pinentry-qt; }; }; @@ -494,6 +504,7 @@ services.hypridle = { timeout = 1200; on-timeout = "hyprctl dispatch dpms off"; on-resume = "hyprctl dispatch dpms on"; + } ]; }; }; diff --git a/hyprland/hyprland.nix b/hyprland/hyprland.nix index f65167f..f9fec32 100644 --- a/hyprland/hyprland.nix +++ b/hyprland/hyprland.nix @@ -1,4 +1,4 @@ -{ config, lib, pkgs, hyprland, wayland, hyprsplit, ... }: +{ config, lib, pkgs, wayland, ... }: { @@ -12,15 +12,11 @@ # rev = "99a88fd21fac270bd999d4a26cf0f4a4222c58be"; # sha256 = "sha256-07B5QmQmsUKYf38oWU3+2C6KO4JvinuTwmW1Pfk8CT8="; # } + /themes/${flavour}.conf); - }; + # }; wayland.windowManager.hyprland = { enable = true; systemd.enable = true; - package = hyprland.packages.${pkgs.system}.hyprland; - plugins = [ - hyprsplit.packages.${pkgs.system}.hyprsplit - ]; settings = { source = [ @@ -82,7 +78,7 @@ default_split_ratio = 1.5; }; master = { - new_is_master = false; + new_status = "slave"; orientation = "center"; workspace = "w[g2] layoutopt:orientation:left"; always_center_master = true; @@ -111,9 +107,9 @@ # Screenshots #"SHIFT, PRINT, exec, hyprshot -m region" '' - PRINT, exec, ${pkgs.grim}/bin/grim -l 9 -g "$(${pkgs.slurp}/bin/slurp)" - | ${pkgs.swappy}/bin/swappy -f -'' + $mainMod, PRINT, exec, ${pkgs.grim}/bin/grim -l 9 -g "$(${pkgs.slurp}/bin/slurp)" - | ${pkgs.swappy}/bin/swappy -f -'' '' - SHIFT, PRINT, exec, ${pkgs.grim}/bin/grim -l 9 - | ${pkgs.swappy}/bin/swappy -f -'' + $mainMod SHIFT, PRINT, exec, ${pkgs.grim}/bin/grim -l 9 - | ${pkgs.swappy}/bin/swappy -f -'' "$mainMod SHIFT, L, exec, $lockscreen" # Move focus "$mainMod, left, movefocus, l" @@ -130,31 +126,31 @@ "$mainMod SHIFT, T, lockactivegroup, toggle" # Switch workspaces - "$mainMod, 1, split:workspace, 1" - "$mainMod, 2, split:workspace, 2" - "$mainMod, 3, split:workspace, 3" - "$mainMod, 4, split:workspace, 4" - "$mainMod, 5, split:workspace, 5" - "$mainMod, 6, split:workspace, 6" - "$mainMod, 7, split:workspace, 7" - "$mainMod, 8, split:workspace, 8" - "$mainMod, 9, split:workspace, 9" + "$mainMod, 1, workspace, 1" + "$mainMod, 2, workspace, 2" + "$mainMod, 3, workspace, 3" + "$mainMod, 4, workspace, 4" + "$mainMod, 5, workspace, 5" + "$mainMod, 6, workspace, 6" + "$mainMod, 7, workspace, 7" + "$mainMod, 8, workspace, 8" + "$mainMod, 9, workspace, 9" # Move windows to workspaces - "$mainMod SHIFT, 1, split:movetoworkspace, 1" - "$mainMod SHIFT, 2, split:movetoworkspace, 2" - "$mainMod SHIFT, 3, split:movetoworkspace, 3" - "$mainMod SHIFT, 4, split:movetoworkspace, 4" - "$mainMod SHIFT, 5, split:movetoworkspace, 5" - "$mainMod SHIFT, 6, split:movetoworkspace, 6" - "$mainMod SHIFT, 7, split:movetoworkspace, 7" - "$mainMod SHIFT, 8, split:movetoworkspace, 8" - "$mainMod SHIFT, 9, split:movetoworkspace, 9" + "$mainMod SHIFT, 1, movetoworkspace, 1" + "$mainMod SHIFT, 2, movetoworkspace, 2" + "$mainMod SHIFT, 3, movetoworkspace, 3" + "$mainMod SHIFT, 4, movetoworkspace, 4" + "$mainMod SHIFT, 5, movetoworkspace, 5" + "$mainMod SHIFT, 6, movetoworkspace, 6" + "$mainMod SHIFT, 7, movetoworkspace, 7" + "$mainMod SHIFT, 8, movetoworkspace, 8" + "$mainMod SHIFT, 9, movetoworkspace, 9" # Scroll through workspaces "$mainMod, mouse_down, workspace, e+1" "$mainMod, mouse_up, workspace, e-1" # Special workspace "SHIFT ALT, RETURN, togglespecialworkspace" - "SHIFT, S, movetoworkspace, special" + "$mainMod SHIFT, S, movetoworkspace, special" ]; # Mouse bindings