Update passwords
This commit is contained in:
commit
ad2c5a239a
1
.dir-locals.el
Normal file
1
.dir-locals.el
Normal file
@ -0,0 +1 @@
|
|||||||
|
((nil . ((projectile-project-compilation-cmd . "./install"))))
|
8
.gitignore
vendored
Executable file
8
.gitignore
vendored
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
secret.nix
|
||||||
|
*~
|
||||||
|
\#*\#
|
||||||
|
auto-save-list
|
||||||
|
tramp
|
||||||
|
.\#*
|
||||||
|
result
|
||||||
|
*\.qcow2
|
0
.projectile
Normal file
0
.projectile
Normal file
28
LICENSE
Normal file
28
LICENSE
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
|
|
||||||
|
This software was originally created by Alexander Bantyev aka balsoft,
|
||||||
|
but you may omit any notices of original author in your dealings with
|
||||||
|
software.
|
7
Makefile
Normal file
7
Makefile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
.PHONY: install result
|
||||||
|
install: result; SHELL=/bin/sh pkexec $$PWD/switch $$PWD
|
||||||
|
|
||||||
|
secret.nix: secret.nix.gpg; gpg -dq $< > $@
|
||||||
|
|
||||||
|
result: secret.nix; ./build
|
||||||
|
|
15
README.md
Normal file
15
README.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# balsoft’s nixos configuration
|
||||||
|
## Trying it out in VM
|
||||||
|
If you happen to run NixOS, you can quite easily check out my configuration by running
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://github.com/balsoft/nixos-config --recursive && cd nixos-config && cat vm && read && ./vm
|
||||||
|
```
|
||||||
|
|
||||||
|
I recommend you inspect `vm` script before running it. Press Ctrl-C if something seems wrong (after all, Microsoft owns Github now; you never know if it’s Windows 10 installation script)
|
||||||
|
|
||||||
|
## Creating your own secret.nix for better experience
|
||||||
|
You can check out the structure of `./secret.nix` in `./modules/secrets.nix`
|
||||||
|
|
||||||
|
## Installing it on your machine
|
||||||
|
Run `./install`
|
32
bootstrap
Executable file
32
bootstrap
Executable file
@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#!nix-shell -i bash -p git gnupg
|
||||||
|
|
||||||
|
export IN_NIX_SHELL=
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
mkdir -p /mnt/home/balsoft/projects
|
||||||
|
nixos-generate-config --root /mnt
|
||||||
|
echo 'import /home/balsoft/projects/nixos-config "$(hostname)"' > /mnt/etc/nixos/configuration.nix
|
||||||
|
cd /mnt/home/balsoft/projects
|
||||||
|
git clone ssh://git@github.com/balsoft/nixos-config
|
||||||
|
cd nixos-config
|
||||||
|
|
||||||
|
touch secret.nix
|
||||||
|
while [[ -s secret.nix ]]
|
||||||
|
do gpg -dq secret.nix.gpg > secret.nix
|
||||||
|
done
|
||||||
|
|
||||||
|
mv /mnt/etc/nixos/hardware-configuration.nix hardware-configuration/$(hostname).nix
|
||||||
|
|
||||||
|
mkdir /home/balsoft
|
||||||
|
mount --rbind /mnt/home/balsoft /home/balsoft
|
||||||
|
mount --rbind /mnt/etc/nixos /etc/nixos
|
||||||
|
umount -l /nix/.rw-store
|
||||||
|
cp /nix/ /mnt -r
|
||||||
|
mount --rbind /mnt/nix /nix
|
||||||
|
|
||||||
|
./build --substituters "https://cache.balsoft.ru https://cache.nixos.org" --no-require-sigs
|
||||||
|
nixos-install --system ./result
|
||||||
|
cd /mnt/home/balsoft
|
||||||
|
chmod 777 -R .
|
24
build
Executable file
24
build
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#!nix-shell -p git -i bash
|
||||||
|
|
||||||
|
unset IN_NIX_SHELL
|
||||||
|
|
||||||
|
nixpkgs=$(nix eval --raw '(import ./nix/sources.nix).nixpkgs')
|
||||||
|
|
||||||
|
nix-store --realise $nixpkgs
|
||||||
|
|
||||||
|
export NIX_PATH=nixpkgs=$nixpkgs:nixos-config=/etc/nixos/configuration.nix
|
||||||
|
|
||||||
|
if [[ -n $INSIDE_EMACS ]]
|
||||||
|
then
|
||||||
|
nix-build $nixpkgs/nixos -A system $@
|
||||||
|
else
|
||||||
|
nix build -f $nixpkgs/nixos system $@
|
||||||
|
fi &&
|
||||||
|
{
|
||||||
|
git add .
|
||||||
|
d=$(date +%s)
|
||||||
|
# The quickest way to commit
|
||||||
|
git commit -t <(echo -n "Update "; echo -n $(git diff HEAD --name-only) | tr "\n" ", ") --no-edit --no-gpg-sign
|
||||||
|
git tag latestBuild --force
|
||||||
|
}
|
25
default.nix
Executable file
25
default.nix
Executable file
@ -0,0 +1,25 @@
|
|||||||
|
# This is balsoft's configuration file.
|
||||||
|
#
|
||||||
|
# https://github.com/balsoft/nixos-config
|
||||||
|
#
|
||||||
|
# This is main nixos configuration
|
||||||
|
# To use this configuration:
|
||||||
|
# 1. Add your own secret.nix to this folder
|
||||||
|
# 2. Replace /etc/nixos/configuration.nix with the following:
|
||||||
|
# import /path/to/this/nixos-config "Vendor-Type"
|
||||||
|
# 3. Log in to application and services where neccesary
|
||||||
|
|
||||||
|
device: # This is the device we're on now
|
||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
let sources = import ./nix/sources.nix;
|
||||||
|
in {
|
||||||
|
imports = [
|
||||||
|
"${./hardware-configuration}/${device}.nix"
|
||||||
|
"${sources.home-manager}/nixos"
|
||||||
|
(import ./modules device)
|
||||||
|
];
|
||||||
|
|
||||||
|
inherit device;
|
||||||
|
|
||||||
|
system.stateVersion = "18.03";
|
||||||
|
}
|
34
hardware-configuration/AMD-Workstation.nix
Normal file
34
hardware-configuration/AMD-Workstation.nix
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[ <nixpkgs/nixos/modules/installer/scan/not-detected.nix>
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "sd_mod" ];
|
||||||
|
boot.kernelModules = [ "kvm-amd" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
fileSystems."/" =
|
||||||
|
{ device = "/dev/nvme0n1p2";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/home" =
|
||||||
|
{ device = "/dev/disk/by-label/Home";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{ device = "/dev/nvme0n1p1";
|
||||||
|
fsType = "vfat";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
swapDevices = [ ];
|
||||||
|
|
||||||
|
nix.maxJobs = lib.mkDefault 16;
|
||||||
|
}
|
4
hardware-configuration/NixOS-VM.nix
Normal file
4
hardware-configuration/NixOS-VM.nix
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{...}:
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
30
hardware-configuration/T420-Laptop.nix
Normal file
30
hardware-configuration/T420-Laptop.nix
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[ <nixpkgs/nixos/modules/installer/scan/not-detected.nix>
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "ehci_pci" "ahci" "usb_storage" "sd_mod" "sdhci_pci" ];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
fileSystems."/" =
|
||||||
|
{ device = "/dev/disk/by-uuid/29edff1b-4457-4d0c-9dfc-2cf5b6afcb46";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{ device = "/dev/disk/by-uuid/4976-D10F";
|
||||||
|
fsType = "vfat";
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [ ];
|
||||||
|
|
||||||
|
nix.maxJobs = lib.mkDefault 4;
|
||||||
|
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
|
||||||
|
}
|
30
hardware-configuration/T490s-Laptop.nix
Normal file
30
hardware-configuration/T490s-Laptop.nix
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[ <nixpkgs/nixos/modules/installer/scan/not-detected.nix>
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
fileSystems."/" =
|
||||||
|
{ device = "/dev/disk/by-uuid/e50bd1d6-3613-465e-895a-9dde6ffaad46";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{ device = "/dev/disk/by-uuid/621A-6414";
|
||||||
|
fsType = "vfat";
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [ ];
|
||||||
|
|
||||||
|
nix.maxJobs = lib.mkDefault 8;
|
||||||
|
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
|
||||||
|
}
|
4
install
Executable file
4
install
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#!nix-shell -p gnumake gnupg -i bash
|
||||||
|
|
||||||
|
make
|
BIN
misc/Passwords.kdbx
Normal file
BIN
misc/Passwords.kdbx
Normal file
Binary file not shown.
BIN
misc/programs.sqlite
Normal file
BIN
misc/programs.sqlite
Normal file
Binary file not shown.
102
modules/applications.nix
Executable file
102
modules/applications.nix
Executable file
@ -0,0 +1,102 @@
|
|||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
with import ../support.nix { inherit lib config; }; {
|
||||||
|
options.defaultApplications = lib.mkOption {
|
||||||
|
type = lib.types.attrs;
|
||||||
|
description = "Preferred applications";
|
||||||
|
};
|
||||||
|
config = rec {
|
||||||
|
defaultApplications = {
|
||||||
|
term = {
|
||||||
|
cmd = "${pkgs.konsole}/bin/konsole";
|
||||||
|
desktop = "konsole";
|
||||||
|
};
|
||||||
|
editor = {
|
||||||
|
cmd = toString (pkgs.writeTextFile {
|
||||||
|
name = "emacsclient";
|
||||||
|
text = ''
|
||||||
|
#!${pkgs.bash}/bin/bash
|
||||||
|
${pkgs.emacs}/bin/emacsclient -s /tmp/emacs1000/server -c $@'';
|
||||||
|
executable = true;
|
||||||
|
});
|
||||||
|
desktop = "emacsclient";
|
||||||
|
};
|
||||||
|
browser = {
|
||||||
|
cmd = "${pkgs.firefox-wayland}/bin/firefox";
|
||||||
|
desktop = "firefox";
|
||||||
|
};
|
||||||
|
fm = {
|
||||||
|
cmd = "${pkgs.dolphin}/bin/dolphin";
|
||||||
|
desktop = "dolphin";
|
||||||
|
};
|
||||||
|
monitor = {
|
||||||
|
cmd = "${pkgs.ksysguard}/bin/ksysguard";
|
||||||
|
desktop = "ksysguard";
|
||||||
|
};
|
||||||
|
torrent = {
|
||||||
|
cmd = "${pkgs.ktorrent}/bin/ktorrent";
|
||||||
|
desktop = "ktorrent";
|
||||||
|
};
|
||||||
|
archive = {
|
||||||
|
cmd = "${pkgs.ark}/bin/ark";
|
||||||
|
desktop = "org.kde.ark";
|
||||||
|
};
|
||||||
|
mail = {
|
||||||
|
cmd = "${pkgs.trojita}/bin/trojita";
|
||||||
|
desktop = "trojita";
|
||||||
|
};
|
||||||
|
text_processor = {
|
||||||
|
cmd = "${pkgs.abiword}/bin/abiword";
|
||||||
|
desktop = "abiword";
|
||||||
|
};
|
||||||
|
spreadsheet = {
|
||||||
|
cmd = "${pkgs.gnumeric}/bin/gnumeric";
|
||||||
|
desktop = "gnumeric";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
home-manager.users.balsoft.xdg.configFile."mimeapps.list.home".text =
|
||||||
|
|
||||||
|
with config.defaultApplications;
|
||||||
|
let
|
||||||
|
apps = builtins.mapAttrs (name: value: "${value.desktop}.desktop;") {
|
||||||
|
"text/html" = browser;
|
||||||
|
"image/*" = { desktop = "org.kde.gwenview"; };
|
||||||
|
"application/x-bittorrent" = torrent;
|
||||||
|
"application/zip" = archive;
|
||||||
|
"application/rar" = archive;
|
||||||
|
"application/7z" = archive;
|
||||||
|
"application/*tar" = archive;
|
||||||
|
"application/x-kdenlive" = archive;
|
||||||
|
"x-scheme-handler/http" = browser;
|
||||||
|
"x-scheme-handler/https" = browser;
|
||||||
|
"x-scheme-handler/about" = browser;
|
||||||
|
"x-scheme-handler/unknown" = browser;
|
||||||
|
"x-scheme-handler/mailto" = mail;
|
||||||
|
"application/pdf" = { desktop = "org.kde.okular"; };
|
||||||
|
"application/vnd.openxmlformats-officedocument.wordprocessingml.document" =
|
||||||
|
text_processor;
|
||||||
|
"application/msword" = text_processor;
|
||||||
|
"application/vnd.oasis.opendocument.text" = text_processor;
|
||||||
|
"text/csv" = spreadsheet;
|
||||||
|
"application/vnd.oasis.opendocument.spreadsheet" = spreadsheet;
|
||||||
|
"text/plain" =
|
||||||
|
editor; # This actually makes Emacs an editor for everything... XDG is wierd
|
||||||
|
};
|
||||||
|
in genIni {
|
||||||
|
"Default Applications" = apps;
|
||||||
|
"Added Associations" = apps;
|
||||||
|
};
|
||||||
|
home-manager.users.balsoft.xdg.configFile."filetypesrc".text = genIni {
|
||||||
|
EmbedSettings = {
|
||||||
|
"embed-application/*" = false;
|
||||||
|
"embed-text/*" = false;
|
||||||
|
"embed-text/plain" = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
home-manager.users.balsoft.home.activation.mimeapps = {
|
||||||
|
before = [ ];
|
||||||
|
after = [ "linkGeneration" ];
|
||||||
|
data =
|
||||||
|
"$DRY_RUN_CMD cp ~/.config/mimeapps.list.home ~/.config/mimeapps.list";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
72
modules/applications/emacs/default.nix
Normal file
72
modules/applications/emacs/default.nix
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
{ pkgs, config, lib, ... }: {
|
||||||
|
home-manager.users.balsoft = {
|
||||||
|
programs.emacs = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.emacs;
|
||||||
|
extraPackages = epkgs:
|
||||||
|
with epkgs; [
|
||||||
|
use-package
|
||||||
|
nix-mode
|
||||||
|
haskell-mode
|
||||||
|
wakib-keys
|
||||||
|
exec-path-from-shell
|
||||||
|
counsel
|
||||||
|
projectile
|
||||||
|
which-key
|
||||||
|
markdown-mode
|
||||||
|
frames-only-mode
|
||||||
|
company
|
||||||
|
rainbow-delimiters
|
||||||
|
diff-hl
|
||||||
|
mode-line-bell
|
||||||
|
hasklig-mode
|
||||||
|
flycheck
|
||||||
|
flycheck-pkg-config
|
||||||
|
auto-indent-mode
|
||||||
|
clipmon
|
||||||
|
org-gcal
|
||||||
|
company-ghci
|
||||||
|
xresources-theme
|
||||||
|
company-tabnine
|
||||||
|
expand-region
|
||||||
|
ivy
|
||||||
|
smex
|
||||||
|
quickrun
|
||||||
|
counsel-tramp
|
||||||
|
ix
|
||||||
|
magit
|
||||||
|
xah-fly-keys
|
||||||
|
arduino-mode
|
||||||
|
elixir-mode
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = [
|
||||||
|
(pkgs.makeDesktopItem {
|
||||||
|
terminal = "False";
|
||||||
|
type = "Application";
|
||||||
|
name = "emacsclient";
|
||||||
|
genericName = "Text editor";
|
||||||
|
desktopName = "Emacs client";
|
||||||
|
mimeType = "text/plain";
|
||||||
|
exec = "emacsclient -s /tmp/emacs1000/server -c %F";
|
||||||
|
categories = "Development;TextEditor;";
|
||||||
|
icon = "emacs";
|
||||||
|
})
|
||||||
|
pkgs.clang
|
||||||
|
];
|
||||||
|
|
||||||
|
services.emacs.enable = true;
|
||||||
|
|
||||||
|
systemd.user.services.emacs.Service.Environment =
|
||||||
|
"PATH=/run/current-system/sw/bin:/etc/profiles/per-user/balsoft/bin";
|
||||||
|
|
||||||
|
home.file.".emacs.d/init.el".source = ./init.el;
|
||||||
|
home.file.".emacs.d/elisp/gud-lldb.el".source = ./gud-lldb.el;
|
||||||
|
home.activation.emacs = {
|
||||||
|
before = [ ];
|
||||||
|
after = [ ];
|
||||||
|
data = "$DRY_RUN_CMD mkdir -p ~/.emacs.d/autosave";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
198
modules/applications/emacs/gud-lldb.el
Normal file
198
modules/applications/emacs/gud-lldb.el
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
;;; gud-lldb.el --- Grand Unified Debugger mode for running LLDB
|
||||||
|
|
||||||
|
;; Copyright (C) 1992-1996, 1998, 2000-2014 Free Software Foundation,
|
||||||
|
;; Inc.
|
||||||
|
|
||||||
|
;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
|
||||||
|
;; Maintainer: emacs-devel@gnu.org
|
||||||
|
;; Keywords: unix, tools, osx
|
||||||
|
|
||||||
|
;; This file is part of GNU Emacs.
|
||||||
|
|
||||||
|
;; GNU Emacs 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.
|
||||||
|
|
||||||
|
;; GNU Emacs 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;;; Commentary:
|
||||||
|
|
||||||
|
;; This file contains an extract of the gud.el version from
|
||||||
|
;; `http://opensource.apple.com/source/lldb/lldb-69/utils/emacs/gud.el'
|
||||||
|
|
||||||
|
;;; Code:
|
||||||
|
|
||||||
|
(require 'gud)
|
||||||
|
|
||||||
|
|
||||||
|
;; History of argument lists passed to lldb.
|
||||||
|
(defvar gud-lldb-history nil)
|
||||||
|
|
||||||
|
;; Keeps track of breakpoint created. In the following case, the id is "1".
|
||||||
|
;; It is used to implement temporary breakpoint.
|
||||||
|
;; (lldb) b main.c:39
|
||||||
|
;; breakpoint set --file 'main.c' --line 39
|
||||||
|
;; Breakpoint created: 1: file ='main.c', line = 39, locations = 1
|
||||||
|
(defvar gud-breakpoint-id nil)
|
||||||
|
|
||||||
|
(defun lldb-extract-breakpoint-id (string)
|
||||||
|
;; Search for "Breakpoint created: \\([^:\n]*\\):" pattern.
|
||||||
|
;(message "gud-marker-acc string is: |%s|" string)
|
||||||
|
(if (string-match "Breakpoint created: \\([^:\n]*\\):" string)
|
||||||
|
(progn
|
||||||
|
(setq gud-breakpoint-id (match-string 1 string))
|
||||||
|
(message "breakpoint id: %s" gud-breakpoint-id)))
|
||||||
|
)
|
||||||
|
|
||||||
|
(defun gud-lldb-marker-filter (string)
|
||||||
|
(setq gud-marker-acc
|
||||||
|
(if gud-marker-acc (concat gud-marker-acc string) string))
|
||||||
|
(lldb-extract-breakpoint-id gud-marker-acc)
|
||||||
|
(let (start)
|
||||||
|
;; Process all complete markers in this chunk
|
||||||
|
(while (or
|
||||||
|
;; (lldb) r
|
||||||
|
;; Process 15408 launched: '/Volumes/data/lldb/svn/trunk/test/conditional_break/a.out' (x86_64)
|
||||||
|
;; (lldb) Process 15408 stopped
|
||||||
|
;; * thread #1: tid = 0x2e03, 0x0000000100000de8 a.out`c + 7 at main.c:39, stop reason = breakpoint 1.1, queue = com.apple.main-thread
|
||||||
|
(string-match " at \\([^:\n]*\\):\\([0-9]*\\), stop reason = .*\n"
|
||||||
|
gud-marker-acc start)
|
||||||
|
;; (lldb) frame select -r 1
|
||||||
|
;; frame #1: 0x0000000100000e09 a.out`main + 25 at main.c:44
|
||||||
|
(string-match "^[ ]*frame.* at \\([^:\n]*\\):\\([0-9]*\\)\n"
|
||||||
|
gud-marker-acc start))
|
||||||
|
;(message "gud-marker-acc matches our pattern....")
|
||||||
|
(setq gud-last-frame
|
||||||
|
(cons (match-string 1 gud-marker-acc)
|
||||||
|
(string-to-number (match-string 2 gud-marker-acc)))
|
||||||
|
start (match-end 0)))
|
||||||
|
|
||||||
|
;; Search for the last incomplete line in this chunk
|
||||||
|
(while (string-match "\n" gud-marker-acc start)
|
||||||
|
(setq start (match-end 0)))
|
||||||
|
|
||||||
|
;; If we have an incomplete line, store it in gud-marker-acc.
|
||||||
|
(setq gud-marker-acc (substring gud-marker-acc (or start 0))))
|
||||||
|
string)
|
||||||
|
|
||||||
|
;; Keeps track of whether the Python lldb_oneshot_break function definition has
|
||||||
|
;; been exec'ed.
|
||||||
|
(defvar lldb-oneshot-break-defined nil)
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defun lldb (command-line)
|
||||||
|
"Run lldb on program FILE in buffer *gud-FILE*.
|
||||||
|
The directory containing FILE becomes the initial working directory
|
||||||
|
and source-file directory for your debugger."
|
||||||
|
(interactive (list (gud-query-cmdline 'lldb)))
|
||||||
|
|
||||||
|
(gud-common-init command-line nil 'gud-lldb-marker-filter)
|
||||||
|
(set (make-local-variable 'gud-minor-mode) 'lldb)
|
||||||
|
(setq lldb-oneshot-break-defined nil)
|
||||||
|
|
||||||
|
;; Make lldb dump fullpath instead of basename for a file.
|
||||||
|
;; See also gud-lldb-marker-filter where gud-last-frame is grokked from lldb output.
|
||||||
|
(progn
|
||||||
|
(gud-call "settings set frame-format frame #${frame.index}: ${frame.pc}{ ${module.file.basename}{`${function.name}${function.pc-offset}}}{ at ${line.file.fullpath}:${line.number}}\\n")
|
||||||
|
(sit-for 1)
|
||||||
|
(gud-call "settings set thread-format thread #${thread.index}: tid = ${thread.id}{, ${frame.pc}}{ ${module.file.basename}{`${function.name}${function.pc-offset}}}{ at ${line.file.fullpath}:${line.number}}{, stop reason = ${thread.stop-reason}}\\n")
|
||||||
|
(sit-for 1))
|
||||||
|
|
||||||
|
(gud-def gud-listb "breakpoint list"
|
||||||
|
"l" "List all breakpoints.")
|
||||||
|
(gud-def gud-bt "thread backtrace"
|
||||||
|
"b" "Show stack for the current thread.")
|
||||||
|
(gud-def gud-bt-all "thread backtrace all"
|
||||||
|
"B" "Show stacks for all the threads.")
|
||||||
|
|
||||||
|
(gud-def gud-break "breakpoint set -f %f -l %l"
|
||||||
|
"\C-b" "Set breakpoint at current line.")
|
||||||
|
(gud-def gud-tbreak
|
||||||
|
(progn (gud-call "breakpoint set -f %f -l %l")
|
||||||
|
(sit-for 1)
|
||||||
|
(if (not lldb-oneshot-break-defined)
|
||||||
|
(progn
|
||||||
|
;; The "\\n"'s are required to escape the newline chars
|
||||||
|
;; passed to the lldb process.
|
||||||
|
(gud-call (concat "script exec \"def lldb_oneshot_break(frame, bp_loc):\\n"
|
||||||
|
" target=frame.GetThread().GetProcess().GetTarget()\\n"
|
||||||
|
" bp=bp_loc.GetBreakpoint()\\n"
|
||||||
|
" print 'Deleting oneshot breakpoint:', bp\\n"
|
||||||
|
" target.BreakpointDelete(bp.GetID())\""))
|
||||||
|
(sit-for 1)
|
||||||
|
;; Set the flag since Python knows about the function def now.
|
||||||
|
(setq lldb-oneshot-break-defined t)))
|
||||||
|
(gud-call "breakpoint command add -p %b -o 'lldb_oneshot_break(frame, bp_loc)'"))
|
||||||
|
"\C-t" "Set temporary breakpoint at current line.")
|
||||||
|
(gud-def gud-remove "breakpoint clear -f %f -l %l"
|
||||||
|
"\C-d" "Remove breakpoint at current line")
|
||||||
|
(gud-def gud-step "thread step-in"
|
||||||
|
"\C-s" "Step one source line with display.")
|
||||||
|
(gud-def gud-stepi "thread step-inst"
|
||||||
|
"\C-i" "Step one instruction with display.")
|
||||||
|
(gud-def gud-next "thread step-over"
|
||||||
|
"\C-n" "Step one line (skip functions).")
|
||||||
|
(gud-def gud-nexti "thread step-inst-over"
|
||||||
|
nil "Step one instruction (skip functions).")
|
||||||
|
(gud-def gud-cont "process continue"
|
||||||
|
"\C-r" "Continue with display.")
|
||||||
|
(gud-def gud-finish "thread step-out"
|
||||||
|
"\C-f" "Finish executing current function.")
|
||||||
|
(gud-def gud-up
|
||||||
|
(progn (gud-call "frame select -r 1")
|
||||||
|
(sit-for 1))
|
||||||
|
"<" "Up 1 stack frame.")
|
||||||
|
(gud-def gud-down
|
||||||
|
(progn (gud-call "frame select -r -1")
|
||||||
|
(sit-for 1))
|
||||||
|
">" "Down 1 stack frame.")
|
||||||
|
(gud-def gud-print "expression -- %e"
|
||||||
|
"\C-p" "Evaluate C expression at point.")
|
||||||
|
(gud-def gud-pstar "expression -- *%e"
|
||||||
|
nil "Evaluate C dereferenced pointer expression at point.")
|
||||||
|
(gud-def gud-run "run"
|
||||||
|
"r" "Run the program.")
|
||||||
|
(gud-def gud-stop-subjob "process kill"
|
||||||
|
"s" "Stop the program.")
|
||||||
|
|
||||||
|
(setq comint-prompt-regexp "\\(^\\|\n\\)\\*")
|
||||||
|
(setq paragraph-start comint-prompt-regexp)
|
||||||
|
(run-hooks 'lldb-mode-hook)
|
||||||
|
)
|
||||||
|
|
||||||
|
;; ;; tooltip
|
||||||
|
;; (defun gud-lldb-tooltip-print-command (expr)
|
||||||
|
;; "Return a suitable command to print the expression EXPR."
|
||||||
|
;; (pcase gud-minor-mode
|
||||||
|
;; ;; '-o' to print the objc object description if available
|
||||||
|
;; (`lldb (concat "expression -o -- " expr))
|
||||||
|
;; (`gdbmi (concat "-data-evaluate-expression \"" expr "\""))
|
||||||
|
;; (`guiler expr)
|
||||||
|
;; (`dbx (concat "print " expr))
|
||||||
|
;; ((or `xdb `pdb) (concat "p " expr))
|
||||||
|
;; (`sdb (concat expr "/"))))
|
||||||
|
|
||||||
|
;; (advice-add 'gud-tooltip-print-command :override #'gud-lldb-tooltip-print-command)
|
||||||
|
|
||||||
|
;; menu
|
||||||
|
(setcdr (nth 2 (nth 7 (assoc 'nexti gud-menu-map))) '((lldb gdbmi gdb dbx)))
|
||||||
|
(setcdr (nth 2 (nth 7 (assoc 'stepi gud-menu-map))) '((lldb gdbmi gdb dbx)))
|
||||||
|
(setcdr (nth 2 (nth 7 (assoc 'finish gud-menu-map))) '((lldb gdbmi gdb guiler xdb jdb pdb)))
|
||||||
|
(setcdr (nth 2 (nth 7 (assoc 'print* gud-menu-map))) '((lldb gdbmi gdb jdb)))
|
||||||
|
(setcdr (nth 2 (nth 7 (assoc 'down gud-menu-map))) '((lldb gdbmi gdb guiler dbx xdb jdb pdb)))
|
||||||
|
(setcdr (nth 2 (nth 7 (assoc 'up gud-menu-map))) '((lldb gdbmi gdb guiler dbx xdb jdb pdb)))
|
||||||
|
(setcdr (nth 2 (nth 7 (assoc 'tbreak gud-menu-map))) '((lldb gdbmi gdb sdb xdb)))
|
||||||
|
(setcdr (nth 2 (nth 7 (assoc 'run gud-menu-map))) '((lldb gdbmi gdb dbx jdb)))
|
||||||
|
;; (setcdr (nth 2 (nth 7 (assoc 'tooltips gud-menu-map))) '((lldb gdbmi guiler dbx sdb xdb pdb)))
|
||||||
|
|
||||||
|
|
||||||
|
(provide 'gud-lldb)
|
||||||
|
|
||||||
|
;;; gud-lldb.el ends here
|
405
modules/applications/emacs/init.el
Executable file
405
modules/applications/emacs/init.el
Executable file
@ -0,0 +1,405 @@
|
|||||||
|
;;; init.el --- balsoft's config
|
||||||
|
|
||||||
|
;;; Commentary:
|
||||||
|
|
||||||
|
;;; None
|
||||||
|
|
||||||
|
;; -*- lexical-binding: t -*-
|
||||||
|
|
||||||
|
;;; Code:
|
||||||
|
|
||||||
|
;;----------------------------------------------------------------------------
|
||||||
|
;; Adjust garbage collection
|
||||||
|
;;----------------------------------------------------------------------------
|
||||||
|
(setq gc-cons-threshold (* 20 1024 1024))
|
||||||
|
|
||||||
|
|
||||||
|
;; ---------------------
|
||||||
|
;; Setup Load Path
|
||||||
|
;; ---------------------
|
||||||
|
|
||||||
|
(nconc load-path
|
||||||
|
(list (expand-file-name "local" user-emacs-directory)
|
||||||
|
(expand-file-name "wakib" user-emacs-directory)))
|
||||||
|
|
||||||
|
|
||||||
|
;; -----------------------
|
||||||
|
;; use-package
|
||||||
|
;; -----------------------
|
||||||
|
(setq load-prefer-newer t) ; Don't load outdated byte code
|
||||||
|
|
||||||
|
(require 'package)
|
||||||
|
(let* ((no-ssl (and (memq system-type '(windows-nt ms-dos))
|
||||||
|
(not (gnutls-available-p))))
|
||||||
|
(proto (if no-ssl "http" "https")))
|
||||||
|
;; Comment/uncomment these two lines to enable/disable MELPA and MELPA Stable as desired
|
||||||
|
(add-to-list 'package-archives (cons "melpa" (concat proto "://melpa.org/packages/")) t)
|
||||||
|
(add-to-list 'package-archives (cons "melpa-stable" (concat proto "://stable.melpa.org/packages/")) t)
|
||||||
|
|
||||||
|
(add-to-list 'package-archives '("cselpa" . "https://elpa.thecybershadow.net/packages/"))
|
||||||
|
(when (< emacs-major-version 24)
|
||||||
|
;; For important compatibility libraries like cl-lib
|
||||||
|
(add-to-list 'package-archives '("gnu" . (concat proto "://elpa.gnu.org/packages/")))))
|
||||||
|
(package-initialize)
|
||||||
|
(setq package-enable-at-startup nil)
|
||||||
|
|
||||||
|
;; Bootstrap `use-package'
|
||||||
|
(unless (package-installed-p 'use-package)
|
||||||
|
(package-refresh-contents)
|
||||||
|
(package-install 'use-package))
|
||||||
|
(eval-when-compile
|
||||||
|
(require 'use-package))
|
||||||
|
(setq use-package-always-ensure nil)
|
||||||
|
|
||||||
|
(setq-default tab-width 2)
|
||||||
|
|
||||||
|
(mode-line-bell-mode)
|
||||||
|
|
||||||
|
(line-number-mode)
|
||||||
|
(column-number-mode)
|
||||||
|
|
||||||
|
;; backup in one place. flat, no tree structure
|
||||||
|
(setq backup-directory-alist '(("" . "~/.emacs.d/backup")))
|
||||||
|
|
||||||
|
(setq auto-save-file-name-transforms
|
||||||
|
`((".*" "~/.emacs.d/autosave/" t)))
|
||||||
|
|
||||||
|
(setq-default indent-tabs-mode nil)
|
||||||
|
|
||||||
|
|
||||||
|
(setq-default tab-always-indent 'complete)
|
||||||
|
|
||||||
|
|
||||||
|
(setq-default compilation-scroll-output 'first-error)
|
||||||
|
|
||||||
|
(add-to-list 'load-path "~/.emacs.d/elisp/")
|
||||||
|
|
||||||
|
(require 'gud-lldb)
|
||||||
|
|
||||||
|
(use-package auto-indent-mode
|
||||||
|
:config
|
||||||
|
(auto-indent-global-mode))
|
||||||
|
|
||||||
|
(global-auto-revert-mode)
|
||||||
|
|
||||||
|
(electric-indent-mode 1)
|
||||||
|
|
||||||
|
;; (use-package ergoemacs-mode
|
||||||
|
;; :config
|
||||||
|
;; (ergoemacs-mode 1))
|
||||||
|
|
||||||
|
|
||||||
|
(use-package xah-fly-keys
|
||||||
|
:config
|
||||||
|
(xah-fly-keys-set-layout "qwerty")
|
||||||
|
(xah-fly-keys 1)
|
||||||
|
|
||||||
|
(defun xah-fly-keys-russian-on ()
|
||||||
|
"Add Russian layout keys.
|
||||||
|
Hook function for `xah-fly-command-mode-activate-hook'
|
||||||
|
2018-10-26 Thanks to TechiBech
|
||||||
|
Version 2018-10-27"
|
||||||
|
(interactive)
|
||||||
|
(progn
|
||||||
|
(define-key xah-fly-key-map (kbd "й") 'xah-reformat-lines)
|
||||||
|
(define-key xah-fly-key-map (kbd "ц") 'xah-shrink-whitespaces)
|
||||||
|
(define-key xah-fly-key-map (kbd "э") 'xah-cycle-hyphen-underscore-space)
|
||||||
|
(define-key xah-fly-key-map (kbd "у") 'xah-backward-kill-word)
|
||||||
|
(define-key xah-fly-key-map (kbd "я") 'xah-comment-dwim)
|
||||||
|
(define-key xah-fly-key-map (kbd "х") 'hippie-expand)
|
||||||
|
(define-key xah-fly-key-map (kbd "ф") 'execute-extended-command)
|
||||||
|
(define-key xah-fly-key-map (kbd "т") 'isearch-forward)
|
||||||
|
(define-key xah-fly-key-map (kbd "ш") 'previous-line)
|
||||||
|
(define-key xah-fly-key-map (kbd "р") 'xah-beginning-of-line-or-block)
|
||||||
|
(define-key xah-fly-key-map (kbd "в") 'xah-delete-backward-char-or-bracket-text)
|
||||||
|
(define-key xah-fly-key-map (kbd "н") 'undo)
|
||||||
|
(define-key xah-fly-key-map (kbd "г") 'backward-word)
|
||||||
|
(define-key xah-fly-key-map (kbd "о") 'backward-char)
|
||||||
|
(define-key xah-fly-key-map (kbd "п") 'xah-delete-current-text-block)
|
||||||
|
(define-key xah-fly-key-map (kbd "с") 'xah-copy-line-or-region)
|
||||||
|
(define-key xah-fly-key-map (kbd "м") 'xah-paste-or-paste-previous)
|
||||||
|
(define-key xah-fly-key-map (kbd "з") 'xah-insert-space-before)
|
||||||
|
(define-key xah-fly-key-map (kbd "ь") 'xah-backward-left-bracket)
|
||||||
|
(define-key xah-fly-key-map (kbd "д") 'forward-char)
|
||||||
|
(define-key xah-fly-key-map (kbd "ы") 'open-line)
|
||||||
|
(define-key xah-fly-key-map (kbd "к") 'xah-kill-word)
|
||||||
|
(define-key xah-fly-key-map (kbd "ч") 'xah-cut-line-or-region)
|
||||||
|
(define-key xah-fly-key-map (kbd "щ") 'forward-word)
|
||||||
|
(define-key xah-fly-key-map (kbd "ж") 'xah-end-of-line-or-block)
|
||||||
|
(define-key xah-fly-key-map (kbd "л") 'next-line)
|
||||||
|
(define-key xah-fly-key-map (kbd "а") 'xah-fly-insert-mode-activate)
|
||||||
|
(define-key xah-fly-key-map (kbd "б") 'xah-next-window-or-frame)
|
||||||
|
(define-key xah-fly-key-map (kbd "и") 'xah-toggle-letter-case)
|
||||||
|
(define-key xah-fly-key-map (kbd "е") 'set-mark-command)))
|
||||||
|
|
||||||
|
(defun xah-fly-keys-russian-off ()
|
||||||
|
"Remove Russian layout keys.
|
||||||
|
Hook function for `xah-fly-insert-mode-activate-hook'
|
||||||
|
2018-10-26 Thanks to TechiBech
|
||||||
|
Version 2018-10-27"
|
||||||
|
(interactive)
|
||||||
|
(progn
|
||||||
|
(define-key xah-fly-key-map (kbd "й") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "ц") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "э") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "у") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "я") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "х") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "ф") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "т") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "ш") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "р") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "в") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "н") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "г") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "о") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "п") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "с") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "м") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "з") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "ь") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "д") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "ы") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "к") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "ч") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "щ") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "ж") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "л") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "а") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "б") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "и") 'nil)
|
||||||
|
(define-key xah-fly-key-map (kbd "е") 'nil)))
|
||||||
|
|
||||||
|
(add-hook 'xah-fly-command-mode-activate-hook 'xah-fly-keys-russian-on )
|
||||||
|
|
||||||
|
(add-hook 'xah-fly-insert-mode-activate-hook 'xah-fly-keys-russian-off )
|
||||||
|
(define-key key-translation-map (kbd "ESC") (kbd "C-g"))
|
||||||
|
)
|
||||||
|
|
||||||
|
(global-set-key (kbd "C-b") 'switch-to-buffer)
|
||||||
|
(global-set-key (kbd "C-TAB") 'org-cycle-level)
|
||||||
|
|
||||||
|
(global-display-line-numbers-mode)
|
||||||
|
|
||||||
|
(electric-pair-mode)
|
||||||
|
|
||||||
|
(electric-indent-mode)
|
||||||
|
|
||||||
|
(use-package flycheck
|
||||||
|
:config
|
||||||
|
(global-flycheck-mode))
|
||||||
|
|
||||||
|
;; -------------------
|
||||||
|
;; Initial Setup
|
||||||
|
;; -------------------
|
||||||
|
(menu-bar-mode -1)
|
||||||
|
(scroll-bar-mode -1)
|
||||||
|
(tool-bar-mode -1)
|
||||||
|
(cua-selection-mode 1)
|
||||||
|
;;(define-key cua--rectangle-keymap (kbd "ESC") nil)
|
||||||
|
;;(define-key cua-global-keymap (kbd "<C-return>") nil)
|
||||||
|
;;(define-key cua-global-keymap (kbd "C-x SPC") 'cua-rectangle-mark-mode)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(when (not window-system)
|
||||||
|
(xterm-mouse-mode 1))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(use-package hasklig-mode
|
||||||
|
:hook (haskell-mode))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(use-package company-ghci
|
||||||
|
:config
|
||||||
|
(push 'company-ghci company-backends))
|
||||||
|
|
||||||
|
(global-set-key (kbd "M-RET") 'execute-extended-command)
|
||||||
|
|
||||||
|
(defun smart-beginning-of-line ()
|
||||||
|
"Move point to first non-whitespace character or beginning of line.
|
||||||
|
|
||||||
|
Move point to the first non-whitespace character on this line.
|
||||||
|
If point was already at that position, move point to beginning of line."
|
||||||
|
(interactive "^") ; Use (interactive) in Emacs 22 or older
|
||||||
|
(let ((oldpos (point)))
|
||||||
|
(back-to-indentation)
|
||||||
|
(and (= oldpos (point))
|
||||||
|
(beginning-of-line))))
|
||||||
|
|
||||||
|
(global-set-key [home] 'smart-beginning-of-line)
|
||||||
|
|
||||||
|
(global-unset-key [menu-bar options cua-mode])
|
||||||
|
|
||||||
|
(fringe-mode '(0 . 0))
|
||||||
|
|
||||||
|
;; scroll one line at a time (less "jumpy" than defaults)
|
||||||
|
|
||||||
|
(setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) ;; one line at a time
|
||||||
|
|
||||||
|
(setq mouse-wheel-progressive-speed nil) ;; don't accelerate scrolling
|
||||||
|
|
||||||
|
(setq mouse-wheel-follow-mouse 't) ;; scroll window under mouse
|
||||||
|
|
||||||
|
(setq scroll-step 1) ;; keyboard scroll one line at a time
|
||||||
|
|
||||||
|
(use-package frames-only-mode)
|
||||||
|
;; Make new frames instead of new windows
|
||||||
|
(set 'pop-up-frames 'graphic-only)
|
||||||
|
(set 'gdb-use-separate-io-buffer nil)
|
||||||
|
(set 'gdb-many-windows nil)
|
||||||
|
|
||||||
|
|
||||||
|
(use-package counsel
|
||||||
|
:config
|
||||||
|
(counsel-mode 1))
|
||||||
|
|
||||||
|
;; -------------------
|
||||||
|
;; Projectile
|
||||||
|
;; -------------------
|
||||||
|
;; No deferred loading as bind-keymap
|
||||||
|
;; doesn't handle wakib C-d keymaps
|
||||||
|
(use-package projectile
|
||||||
|
:config
|
||||||
|
(setq projectile-completion-system 'ivy)
|
||||||
|
(define-key projectile-mode-map (kbd "C-c p") nil)
|
||||||
|
(define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map)
|
||||||
|
(projectile-mode 1)
|
||||||
|
(global-unset-key [menu-bar tools Projectile])
|
||||||
|
(projectile-register-project-type 'nix-shell '("shell.nix")
|
||||||
|
:compile "nix-build shell.nix"
|
||||||
|
:run "nix-shell")
|
||||||
|
(setq projectile-project-search-path '("~/projects/"))
|
||||||
|
|
||||||
|
(global-set-key (kbd "<f9>") 'projectile-compile-project)
|
||||||
|
(global-set-key (kbd "<f5>") 'projectile-run-project))
|
||||||
|
|
||||||
|
;; -------------------
|
||||||
|
;; Yasnippet
|
||||||
|
;; -------------------
|
||||||
|
|
||||||
|
(use-package nix-mode
|
||||||
|
:hook
|
||||||
|
((nix-mode . (lambda () (local-set-key (kbd "<f7>") 'nix-format-buffer))))
|
||||||
|
((nix-mode . (lambda () (setq indent-line-function 'nix-indent-line)))))
|
||||||
|
|
||||||
|
;; -------------------
|
||||||
|
;; expand-region
|
||||||
|
;; -------------------
|
||||||
|
(use-package company
|
||||||
|
:config
|
||||||
|
(global-company-mode 1)
|
||||||
|
;; Trigger completion immediately.
|
||||||
|
(setq company-idle-delay 0)
|
||||||
|
|
||||||
|
;; Number the candidates (use M-1, M-2 etc to select completions).
|
||||||
|
(setq company-show-numbers t)
|
||||||
|
|
||||||
|
;; Use the tab-and-go frontend.
|
||||||
|
;; Allows TAB to select and complete at the same time.
|
||||||
|
(company-tng-configure-default)
|
||||||
|
(setq company-frontends
|
||||||
|
'(company-tng-frontend
|
||||||
|
company-pseudo-tooltip-frontend
|
||||||
|
company-echo-metadata-frontend))
|
||||||
|
|
||||||
|
(require 'color)
|
||||||
|
|
||||||
|
(let ((bg (face-attribute 'default :background)))
|
||||||
|
(custom-set-faces
|
||||||
|
`(company-tooltip ((t (:inherit default :background ,(color-lighten-name bg 2)))))
|
||||||
|
`(company-scrollbar-bg ((t (:background ,(color-lighten-name bg 10)))))
|
||||||
|
`(company-scrollbar-fg ((t (:background ,(color-lighten-name bg 5)))))
|
||||||
|
`(company-tooltip-selection ((t (:inherit font-lock-function-name-face))))
|
||||||
|
`(company-tooltip-common ((t (:inherit font-lock-constant-face)))))))
|
||||||
|
|
||||||
|
(use-package company-tabnine
|
||||||
|
:config
|
||||||
|
(add-to-list 'company-backends #'company-tabnine))
|
||||||
|
|
||||||
|
|
||||||
|
;; -------------------
|
||||||
|
;; Ivy
|
||||||
|
;; -------------------
|
||||||
|
(use-package ivy
|
||||||
|
:config
|
||||||
|
(ivy-mode 1)
|
||||||
|
(setq ivy-use-virtual-buffers t)
|
||||||
|
(define-key ivy-minibuffer-map [remap keyboard-quit] 'minibuffer-keyboard-quit)
|
||||||
|
;; (setq enable-recursive-minibuffers t)
|
||||||
|
(setq ivy-count-format "")
|
||||||
|
(setq ivy-initial-inputs-alist nil))
|
||||||
|
|
||||||
|
(use-package smex)
|
||||||
|
|
||||||
|
;; TODO (change defun rewrite to advice)
|
||||||
|
(use-package quickrun
|
||||||
|
:init
|
||||||
|
(global-set-key [menu-bar tools quickrun] `(menu-item ,"Run Buffer" quickrun))
|
||||||
|
:config
|
||||||
|
(setq quickrun-focus-p nil)
|
||||||
|
;; Move cursor out of the way when displaying output
|
||||||
|
(advice-add 'quickrun--recenter
|
||||||
|
:after (lambda (&optional _)
|
||||||
|
(with-selected-window
|
||||||
|
(get-buffer-window quickrun--buffer-name)
|
||||||
|
(end-of-buffer))))
|
||||||
|
:bind
|
||||||
|
(([f8] . quickrun )))
|
||||||
|
|
||||||
|
|
||||||
|
(show-paren-mode 1)
|
||||||
|
;; TODO - MOVE Electric Pair Mode to user local
|
||||||
|
|
||||||
|
|
||||||
|
;; MAJOR MODES
|
||||||
|
|
||||||
|
(use-package markdown-mode
|
||||||
|
:mode "\\.\\(m\\(ark\\)?down\\|md\\)$")
|
||||||
|
|
||||||
|
|
||||||
|
;; Setup Splash Screen
|
||||||
|
;; (setq inhibit-startup-screen t)
|
||||||
|
;; (setq-default major-mode 'fundamental-mode)
|
||||||
|
;; (setq-default initial-scratch-message "")
|
||||||
|
|
||||||
|
(setq custom-file (expand-file-name "custom" user-emacs-directory))
|
||||||
|
(load custom-file t t)
|
||||||
|
|
||||||
|
(defun compile-on-save-start ()
|
||||||
|
"Recompile when compilation is not going."
|
||||||
|
(let ((buffer (compilation-find-buffer)))
|
||||||
|
(unless (get-buffer-process buffer)
|
||||||
|
(recompile))))
|
||||||
|
|
||||||
|
(define-minor-mode compile-on-save-mode
|
||||||
|
"Minor mode to automatically call `recompile' whenever the
|
||||||
|
current buffer is saved. When there is ongoing compilation,
|
||||||
|
nothing happens."
|
||||||
|
:lighter " CoS"
|
||||||
|
(if compile-on-save-mode
|
||||||
|
(progn (make-local-variable 'after-save-hook)
|
||||||
|
(add-hook 'after-save-hook 'compile-on-save-start nil t))
|
||||||
|
(kill-local-variable 'after-save-hook)))
|
||||||
|
|
||||||
|
(auto-fill-mode)
|
||||||
|
|
||||||
|
|
||||||
|
;; -------------------
|
||||||
|
;; Theme
|
||||||
|
;; -------------------
|
||||||
|
(use-package xresources-theme
|
||||||
|
:config
|
||||||
|
(load-theme 'xresorces t)
|
||||||
|
(setq after-init-hook (load-theme 'xresources t))
|
||||||
|
(add-hook 'after-make-frame-functions
|
||||||
|
(lambda (frame)
|
||||||
|
(with-selected-frame frame
|
||||||
|
(load-theme 'xresources t)))))
|
||||||
|
|
||||||
|
(setq inhibit-startup-screen t)
|
||||||
|
|
||||||
|
;;; init.el ends here
|
0
modules/applications/emacs/org-gcal-config.el
Normal file
0
modules/applications/emacs/org-gcal-config.el
Normal file
72
modules/applications/firefox.nix
Normal file
72
modules/applications/firefox.nix
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
with import ../../support.nix { inherit lib config; };
|
||||||
|
let thm = config.themes.colors;
|
||||||
|
in {
|
||||||
|
environment.sessionVariables.MOZ_USE_XINPUT2 = "1";
|
||||||
|
home-manager.users.balsoft = lib.mkIf (config.deviceSpecific.goodMachine) {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
plasma-integration
|
||||||
|
plasma5.xdg-desktop-portal-kde
|
||||||
|
plasma-browser-integration
|
||||||
|
];
|
||||||
|
home.file.".mozilla/native-messaging-hosts".source = pkgs.symlinkJoin {
|
||||||
|
name = "native-messaging-hosts";
|
||||||
|
paths = [
|
||||||
|
"${pkgs.plasma-browser-integration}/lib/mozilla/native-messaging-hosts"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
programs.firefox = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.firefox-wayland;
|
||||||
|
profiles.default = {
|
||||||
|
id = 0;
|
||||||
|
userChrome = ''
|
||||||
|
#TabsToolbar {
|
||||||
|
visibility: collapse;
|
||||||
|
}
|
||||||
|
toolbar#nav-bar, nav-bar-customization-target {
|
||||||
|
background: ${thm.bg} !important;
|
||||||
|
}
|
||||||
|
@-moz-document url("about:newtab") {
|
||||||
|
* { background-color: ${thm.bg} !important; }
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
settings = {
|
||||||
|
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
|
||||||
|
|
||||||
|
"extensions.autoDisableScopes" = 0;
|
||||||
|
|
||||||
|
"browser.search.defaultenginename" = "Google";
|
||||||
|
"browser.search.selectedEngine" = "Google";
|
||||||
|
"browser.urlbar.placeholderName" = "Google";
|
||||||
|
"browser.search.region" = "US";
|
||||||
|
|
||||||
|
"browser.uidensity" = 1;
|
||||||
|
"browser.search.openintab" = true;
|
||||||
|
"xpinstall.signatures.required" = false;
|
||||||
|
"extensions.update.enabled" = false;
|
||||||
|
|
||||||
|
"font.name.monospace.x-western" = "Roboto Mono";
|
||||||
|
"font.name.sans-serif.x-western" = "Roboto";
|
||||||
|
"font.name.serif.x-western" = "Roboto Slab";
|
||||||
|
|
||||||
|
"browser.display.background_color" = thm.bg;
|
||||||
|
"browser.display.foreground_color" = thm.fg;
|
||||||
|
"browser.display.document_color_use" = 2;
|
||||||
|
"browser.anchor_color" = thm.fg;
|
||||||
|
"browser.visited_color" = thm.blue;
|
||||||
|
"browser.display.use_document_fonts" = true;
|
||||||
|
"pdfjs.disabled" = true;
|
||||||
|
"media.videocontrols.picture-in-picture.enabled" = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
extensions = with pkgs.nur.rycee.firefox-addons; [
|
||||||
|
torswitch
|
||||||
|
close-other-windows
|
||||||
|
adsum-notabs
|
||||||
|
ublock-origin
|
||||||
|
plasma-integration
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
51
modules/applications/konsole.nix
Normal file
51
modules/applications/konsole.nix
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
{ pkgs, lib, config, ... }:
|
||||||
|
with (import ../../support.nix { inherit lib config; }); {
|
||||||
|
home-manager.users.balsoft.xdg.dataFile = {
|
||||||
|
"konsole/Default.profile".text = genIni {
|
||||||
|
Appearance.ColorScheme = "generated";
|
||||||
|
"Cursor Options".CursorShape = 1;
|
||||||
|
General = {
|
||||||
|
Command = "zsh";
|
||||||
|
Name = "Default";
|
||||||
|
Parent = "FALLBACK/";
|
||||||
|
};
|
||||||
|
Scrolling = {
|
||||||
|
HistoryMode = 2;
|
||||||
|
ScrollBarPosition = 2;
|
||||||
|
};
|
||||||
|
"Terminal Features".BlinkingCursorEnabled = true;
|
||||||
|
};
|
||||||
|
"konsole/generated.colorscheme".text = genIni {
|
||||||
|
General = {
|
||||||
|
Description = "generated";
|
||||||
|
Opacity = 1;
|
||||||
|
Wallpaper = "";
|
||||||
|
};
|
||||||
|
Background.Color = thmDec.bg;
|
||||||
|
BackgroundIntense.Color = thmDec.bg;
|
||||||
|
Foreground.Color = thmDec.fg;
|
||||||
|
Color0.Color = thmDec.dark;
|
||||||
|
Color0Intense.Color = thmDec.alt;
|
||||||
|
Color1.Color = thmDec.red;
|
||||||
|
Color2.Color = thmDec.green;
|
||||||
|
Color3.Color = thmDec.yellow;
|
||||||
|
Color4.Color = thmDec.blue;
|
||||||
|
Color5.Color = thmDec.purple;
|
||||||
|
Color6.Color = thmDec.cyan;
|
||||||
|
Color7.Color = thmDec.fg;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
home-manager.users.balsoft.xdg.configFile."konsolerc.home".text = genIni {
|
||||||
|
"Desktop Entry".DefaultProfile = "Default.profile";
|
||||||
|
KonsoleWindow = {
|
||||||
|
SaveGeometryOnExit = false;
|
||||||
|
ShowMenuBarByDefault = false;
|
||||||
|
UseSingleInstance = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
home-manager.users.balsoft.home.activation.konsole = {
|
||||||
|
data = "$DRY_RUN_CMD cp -f ~/.config/konsolerc.home ~/.config/konsolerc";
|
||||||
|
before = [ ];
|
||||||
|
after = [ "linkGeneration" ];
|
||||||
|
};
|
||||||
|
}
|
19
modules/applications/okular.nix
Normal file
19
modules/applications/okular.nix
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{ pkgs, lib, config, ... }:
|
||||||
|
with import ../../support.nix { inherit lib config; }; {
|
||||||
|
home-manager.users.balsoft.xdg.configFile."okularpartrc".text = genIni {
|
||||||
|
"Dlg Accessibility" = {
|
||||||
|
RecolorBackground = thmDec.bg;
|
||||||
|
RecolorForeground = thmDec.fg;
|
||||||
|
};
|
||||||
|
"Document" = {
|
||||||
|
ChangeColors = true;
|
||||||
|
PaperColor = thmDec.bg;
|
||||||
|
RenderMode = "Recolor";
|
||||||
|
};
|
||||||
|
"Main View" = { ShowLeftPanel = false; };
|
||||||
|
PageView = {
|
||||||
|
BackgroundColor = thmDec.bg;
|
||||||
|
UseCustomBackgroundColor = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
98
modules/applications/packages.nix
Normal file
98
modules/applications/packages.nix
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
{ pkgs, config, lib, ... }: {
|
||||||
|
programs.adb.enable = true;
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs;
|
||||||
|
lib.optionals config.deviceSpecific.goodMachine [
|
||||||
|
kded
|
||||||
|
ntfs3g
|
||||||
|
];
|
||||||
|
|
||||||
|
home-manager.users.balsoft.home.packages = with pkgs;
|
||||||
|
[
|
||||||
|
# Internet
|
||||||
|
wget
|
||||||
|
curl
|
||||||
|
unrar
|
||||||
|
] ++ lib.optionals config.deviceSpecific.goodMachine ([
|
||||||
|
steamcmd
|
||||||
|
steam
|
||||||
|
kdenlive
|
||||||
|
frei0r
|
||||||
|
ffmpeg-full
|
||||||
|
ghc
|
||||||
|
(all-hies.selection {
|
||||||
|
selector = p:
|
||||||
|
let
|
||||||
|
ghcVersion =
|
||||||
|
builtins.concatStringsSep "" (builtins.splitVersion ghc.version);
|
||||||
|
in { ${"ghc${ghcVersion}"} = p.${"ghc${ghcVersion}"}; };
|
||||||
|
})
|
||||||
|
haskellPackages.hoogle
|
||||||
|
haskellPackages.hindent
|
||||||
|
clang
|
||||||
|
clang-tools
|
||||||
|
lldb
|
||||||
|
appimage-run
|
||||||
|
nixfmt
|
||||||
|
niv
|
||||||
|
stdman
|
||||||
|
libqalculate
|
||||||
|
# Messaging
|
||||||
|
libnotify
|
||||||
|
# Audio/Video
|
||||||
|
vlc
|
||||||
|
cantata
|
||||||
|
lxqt.pavucontrol-qt
|
||||||
|
# Tools
|
||||||
|
zip
|
||||||
|
unrar
|
||||||
|
wireshark
|
||||||
|
micro
|
||||||
|
python3
|
||||||
|
qalculate-gtk
|
||||||
|
breeze-qt5
|
||||||
|
gnome3.adwaita-icon-theme
|
||||||
|
papirus-icon-theme
|
||||||
|
breeze-icons
|
||||||
|
ksysguard
|
||||||
|
wl-clipboard
|
||||||
|
grim
|
||||||
|
slurp
|
||||||
|
abiword
|
||||||
|
gnumeric
|
||||||
|
gcalcli
|
||||||
|
google-drive-ocamlfuse
|
||||||
|
kdeconnect
|
||||||
|
trojita
|
||||||
|
nix-zsh-completions
|
||||||
|
papirus-icon-theme
|
||||||
|
breeze-icons
|
||||||
|
kde-cli-tools
|
||||||
|
xdg_utils
|
||||||
|
nheko
|
||||||
|
gitAndTools.hub
|
||||||
|
nix-patch
|
||||||
|
waypipe
|
||||||
|
] ++ (with pkgs.kdeApplications; [
|
||||||
|
ark
|
||||||
|
dolphin
|
||||||
|
dolphin-plugins
|
||||||
|
eventviews
|
||||||
|
ffmpegthumbs
|
||||||
|
filelight
|
||||||
|
gwenview
|
||||||
|
kcachegrind
|
||||||
|
kcolorchooser
|
||||||
|
kdenlive
|
||||||
|
kolourpaint
|
||||||
|
kompare
|
||||||
|
krdc
|
||||||
|
krfb
|
||||||
|
ktnef
|
||||||
|
marble
|
||||||
|
okteta
|
||||||
|
okular
|
||||||
|
print-manager
|
||||||
|
ktorrent
|
||||||
|
]));
|
||||||
|
}
|
59
modules/applications/trojita.nix
Normal file
59
modules/applications/trojita.nix
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
with import ../../support.nix { inherit lib config; }; {
|
||||||
|
home-manager.users.balsoft.xdg.configFile."flaska.net/trojita.conf".text =
|
||||||
|
if !isNull config.secrets.mail then
|
||||||
|
genIni {
|
||||||
|
General = {
|
||||||
|
"app.updates.checkEnabled" = false;
|
||||||
|
"imap.auth.user" = "${config.secrets.mail.user}@${config.secrets.mail.host}";
|
||||||
|
"imap.auth.pass" = config.secrets.mail.password;
|
||||||
|
"imap.host" = config.secrets.mail.host;
|
||||||
|
"imap.archiveFolderName" = "Archive";
|
||||||
|
"imap.startmode" = "ONLINE";
|
||||||
|
"imap.method" = "SSL";
|
||||||
|
"imap.needsNetwork" = true;
|
||||||
|
"imap.numberRefreshInterval" = 300;
|
||||||
|
"imap.port" = 993;
|
||||||
|
"imap.proxy.system" = true;
|
||||||
|
"imap.starttls" = true;
|
||||||
|
"imapIdleRenewal" = 29;
|
||||||
|
"msa.method" = "SMTP";
|
||||||
|
"msa.smtp.auth" = true;
|
||||||
|
"msa.smtp.auth.reuseImapCredentials" = true;
|
||||||
|
"msa.smtp.burl" = false;
|
||||||
|
"msa.smtp.starttls" = true;
|
||||||
|
"msa.smtp.host" = config.secrets.mail.host;
|
||||||
|
"msa.smtp.port" = 25;
|
||||||
|
"offline.cache" = "days";
|
||||||
|
"offline.cache.numDays" = "30";
|
||||||
|
};
|
||||||
|
autoMarkRead = {
|
||||||
|
enabled = true;
|
||||||
|
seconds = 0;
|
||||||
|
};
|
||||||
|
composer = {
|
||||||
|
imapSentName = "Sent";
|
||||||
|
saveToImapEnabled = true;
|
||||||
|
};
|
||||||
|
gui = {
|
||||||
|
"mainWindow.layout" = "compact";
|
||||||
|
preferPlaintextRendering = true;
|
||||||
|
showSystray = false;
|
||||||
|
startMinimized = false;
|
||||||
|
};
|
||||||
|
identities = {
|
||||||
|
"1\\address" = "${config.secrets.mail.user}@${config.secrets.mail.host}";
|
||||||
|
"1\\organisation" = "serokell.io";
|
||||||
|
"1\\realName" = "Alexander Bantyev";
|
||||||
|
"1\\signature" = ''\x410\x43b\x435\x43a\x441\x430\x43d\x434\x440 \x411\x430\x43d\x442\x44c\x435\x432 /Alexander Bantyev/ aka balsoft\n\nNix DevOPS/SRE at serokell.io\n\n<balsoft@balsoft.ru>\n<alexander.bantyev@serokell.io>\n\nmatrix://@balsoft:balsoft.ru \n(https://matrix.to/#/@balsoft:balsoft.ru)\nhttps://t.me/balsoft\nhttps://github.com/balsoft\n'';
|
||||||
|
size = 1;
|
||||||
|
};
|
||||||
|
interoperability.revealVersions = true;
|
||||||
|
plugin = {
|
||||||
|
addressbook = "abookaddressbook";
|
||||||
|
password = "cleartextpassword";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
"";
|
||||||
|
}
|
754
modules/applications/weechat.nix
Normal file
754
modules/applications/weechat.nix
Normal file
@ -0,0 +1,754 @@
|
|||||||
|
{ pkgs, config, ... }:
|
||||||
|
let
|
||||||
|
weechat = pkgs.weechat.override {
|
||||||
|
configure = { availablePlugins, ... }: {
|
||||||
|
scripts = with pkgs.weechatScripts; [ wee-slack ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
home-manager.users.balsoft = {
|
||||||
|
home.file.".weechat/python/autoload/notify_send.py".source =
|
||||||
|
"${(import ../../nix/sources.nix).weechat-notify-send}/notify_send.py";
|
||||||
|
|
||||||
|
home.file.".weechat/perl/autoload/multiline.pl".source =
|
||||||
|
"${pkgs.imports.scripts}/perl/multiline.pl";
|
||||||
|
|
||||||
|
home.file.".weechat/python/autoload/go.py".source =
|
||||||
|
"${pkgs.imports.scripts}/python/go.py";
|
||||||
|
|
||||||
|
home.file.".weechat/plugins.conf".text = ''
|
||||||
|
[var]
|
||||||
|
lua.matrix.autojoin_on_invite = "on"
|
||||||
|
lua.matrix.backlog_lines = "120"
|
||||||
|
lua.matrix.debug = "off"
|
||||||
|
lua.matrix.encrypted_message_color = "lightgreen"
|
||||||
|
lua.matrix.homeserver_url = "https://matrix.balsoft.ru/"
|
||||||
|
lua.matrix.local_echo = "on"
|
||||||
|
lua.matrix.nick_style = "nick"
|
||||||
|
lua.matrix.password = "${config.secrets.matrix.password}"
|
||||||
|
lua.matrix.presence_filter = "on"
|
||||||
|
lua.matrix.read_receipts = "on"
|
||||||
|
lua.matrix.timeout = "20"
|
||||||
|
lua.matrix.typing_notices = "on"
|
||||||
|
lua.matrix.user = "${config.secrets.matrix.user}"
|
||||||
|
python.slack.auto_open_threads = "true"
|
||||||
|
python.slack.background_load_all_history = "true"
|
||||||
|
python.slack.channel_name_typing_indicator = "true"
|
||||||
|
python.slack.color_buflist_muted_channels = "darkgray"
|
||||||
|
python.slack.color_edited_suffix = "095"
|
||||||
|
python.slack.color_reaction_suffix = "darkgray"
|
||||||
|
python.slack.color_thread_suffix = "lightcyan"
|
||||||
|
python.slack.colorize_private_chats = "false"
|
||||||
|
python.slack.debug_level = "3"
|
||||||
|
python.slack.debug_mode = "false"
|
||||||
|
python.slack.distracting_channels = ""
|
||||||
|
python.slack.external_user_suffix = "*"
|
||||||
|
python.slack.files_download_location = "/home/balsoft/Downloads/slack"
|
||||||
|
python.slack.group_name_prefix = "&"
|
||||||
|
python.slack.map_underline_to = "_"
|
||||||
|
python.slack.migrated = "true"
|
||||||
|
python.slack.muted_channels_activity = "personal_highlights"
|
||||||
|
python.slack.never_away = "false"
|
||||||
|
python.slack.notify_usergroup_handle_updated = "false"
|
||||||
|
python.slack.record_events = "false"
|
||||||
|
python.slack.render_bold_as = "bold"
|
||||||
|
python.slack.render_italic_as = "italic"
|
||||||
|
python.slack.send_typing_notice = "true"
|
||||||
|
python.slack.server_aliases = ""
|
||||||
|
python.slack.shared_name_prefix = "%"
|
||||||
|
python.slack.short_buffer_names = "false"
|
||||||
|
python.slack.show_buflist_presence = "true"
|
||||||
|
python.slack.show_reaction_nicks = "true"
|
||||||
|
python.slack.slack_api_token = "${config.secrets.slack-term}"
|
||||||
|
python.slack.slack_timeout = "20000"
|
||||||
|
python.slack.switch_buffer_on_join = "true"
|
||||||
|
python.slack.thread_messages_in_channel = "false"
|
||||||
|
python.slack.unfurl_auto_link_display = "both"
|
||||||
|
python.slack.unfurl_ignore_alt_text = "false"
|
||||||
|
python.slack.unhide_buffers_with_activity = "false"
|
||||||
|
'';
|
||||||
|
|
||||||
|
home.file.".weechat/weechat.conf".text = ''
|
||||||
|
#
|
||||||
|
# weechat -- weechat.conf
|
||||||
|
#
|
||||||
|
# WARNING: It is NOT recommended to edit this file by hand,
|
||||||
|
# especially if WeeChat is running.
|
||||||
|
#
|
||||||
|
# Use /set or similar command to change settings in WeeChat.
|
||||||
|
#
|
||||||
|
# For more info, see: https://weechat.org/doc/quickstart
|
||||||
|
#
|
||||||
|
|
||||||
|
[debug]
|
||||||
|
|
||||||
|
[startup]
|
||||||
|
command_after_plugins = ""
|
||||||
|
command_before_plugins = ""
|
||||||
|
display_logo = on
|
||||||
|
display_version = on
|
||||||
|
sys_rlimit = ""
|
||||||
|
|
||||||
|
[look]
|
||||||
|
align_end_of_lines = message
|
||||||
|
align_multiline_words = on
|
||||||
|
bar_more_down = "++"
|
||||||
|
bar_more_left = "<<"
|
||||||
|
bar_more_right = ">>"
|
||||||
|
bar_more_up = "--"
|
||||||
|
bare_display_exit_on_input = on
|
||||||
|
bare_display_time_format = "%H:%M"
|
||||||
|
buffer_auto_renumber = on
|
||||||
|
buffer_notify_default = all
|
||||||
|
buffer_position = end
|
||||||
|
buffer_search_case_sensitive = off
|
||||||
|
buffer_search_force_default = off
|
||||||
|
buffer_search_regex = off
|
||||||
|
buffer_search_where = prefix_message
|
||||||
|
buffer_time_format = "%H:%M:%S"
|
||||||
|
buffer_time_same = ""
|
||||||
|
color_basic_force_bold = off
|
||||||
|
color_inactive_buffer = on
|
||||||
|
color_inactive_message = on
|
||||||
|
color_inactive_prefix = on
|
||||||
|
color_inactive_prefix_buffer = on
|
||||||
|
color_inactive_time = off
|
||||||
|
color_inactive_window = on
|
||||||
|
color_nick_offline = off
|
||||||
|
color_pairs_auto_reset = 5
|
||||||
|
color_real_white = off
|
||||||
|
command_chars = ""
|
||||||
|
command_incomplete = off
|
||||||
|
confirm_quit = off
|
||||||
|
confirm_upgrade = off
|
||||||
|
day_change = on
|
||||||
|
day_change_message_1date = "-- %a, %d %b %Y --"
|
||||||
|
day_change_message_2dates = "-- %%a, %%d %%b %%Y (%a, %d %b %Y) --"
|
||||||
|
eat_newline_glitch = off
|
||||||
|
emphasized_attributes = ""
|
||||||
|
highlight = ""
|
||||||
|
highlight_regex = ""
|
||||||
|
highlight_tags = ""
|
||||||
|
hotlist_add_conditions = "''${away} || ''${buffer.num_displayed} == 0 || ''${
|
||||||
|
"info:relay_client_count,weechat,connected"
|
||||||
|
} > 0"
|
||||||
|
hotlist_buffer_separator = ", "
|
||||||
|
hotlist_count_max = 2
|
||||||
|
hotlist_count_min_msg = 2
|
||||||
|
hotlist_names_count = 3
|
||||||
|
hotlist_names_length = 0
|
||||||
|
hotlist_names_level = 12
|
||||||
|
hotlist_names_merged_buffers = off
|
||||||
|
hotlist_prefix = "H: "
|
||||||
|
hotlist_remove = merged
|
||||||
|
hotlist_short_names = on
|
||||||
|
hotlist_sort = group_time_asc
|
||||||
|
hotlist_suffix = ""
|
||||||
|
hotlist_unique_numbers = on
|
||||||
|
input_cursor_scroll = 20
|
||||||
|
input_share = none
|
||||||
|
input_share_overwrite = off
|
||||||
|
input_undo_max = 32
|
||||||
|
item_away_message = on
|
||||||
|
item_buffer_filter = "*"
|
||||||
|
item_buffer_zoom = "!"
|
||||||
|
item_mouse_status = "M"
|
||||||
|
item_time_format = "%H:%M"
|
||||||
|
jump_current_to_previous_buffer = on
|
||||||
|
jump_previous_buffer_when_closing = on
|
||||||
|
jump_smart_back_to_buffer = on
|
||||||
|
key_bind_safe = on
|
||||||
|
key_grab_delay = 800
|
||||||
|
mouse = on
|
||||||
|
mouse_timer_delay = 100
|
||||||
|
nick_color_force = ""
|
||||||
|
nick_color_hash = djb2
|
||||||
|
nick_color_stop_chars = "_|["
|
||||||
|
nick_prefix = ""
|
||||||
|
nick_suffix = ""
|
||||||
|
paste_auto_add_newline = on
|
||||||
|
paste_bracketed = on
|
||||||
|
paste_bracketed_timer_delay = 10
|
||||||
|
paste_max_lines = 1
|
||||||
|
prefix_action = " *"
|
||||||
|
prefix_align = right
|
||||||
|
prefix_align_max = 0
|
||||||
|
prefix_align_min = 0
|
||||||
|
prefix_align_more = "+"
|
||||||
|
prefix_align_more_after = on
|
||||||
|
prefix_buffer_align = right
|
||||||
|
prefix_buffer_align_max = 0
|
||||||
|
prefix_buffer_align_more = "+"
|
||||||
|
prefix_buffer_align_more_after = on
|
||||||
|
prefix_error = "=!="
|
||||||
|
prefix_join = "-->"
|
||||||
|
prefix_network = "--"
|
||||||
|
prefix_quit = "<--"
|
||||||
|
prefix_same_nick = ""
|
||||||
|
prefix_same_nick_middle = ""
|
||||||
|
prefix_suffix = "|"
|
||||||
|
quote_nick_prefix = "<"
|
||||||
|
quote_nick_suffix = ">"
|
||||||
|
quote_time_format = "%H:%M:%S"
|
||||||
|
read_marker = line
|
||||||
|
read_marker_always_show = off
|
||||||
|
read_marker_string = "- "
|
||||||
|
save_config_on_exit = on
|
||||||
|
save_config_with_fsync = off
|
||||||
|
save_layout_on_exit = none
|
||||||
|
scroll_amount = 3
|
||||||
|
scroll_bottom_after_switch = off
|
||||||
|
scroll_page_percent = 100
|
||||||
|
search_text_not_found_alert = on
|
||||||
|
separator_horizontal = "-"
|
||||||
|
separator_vertical = ""
|
||||||
|
tab_width = 1
|
||||||
|
time_format = "%a, %d %b %Y %T"
|
||||||
|
window_auto_zoom = off
|
||||||
|
window_separator_horizontal = on
|
||||||
|
window_separator_vertical = on
|
||||||
|
window_title = ""
|
||||||
|
word_chars_highlight = "!\u00A0,-,_,|,alnum"
|
||||||
|
word_chars_input = "!\u00A0,-,_,|,alnum"
|
||||||
|
|
||||||
|
[palette]
|
||||||
|
|
||||||
|
[color]
|
||||||
|
bar_more = lightmagenta
|
||||||
|
chat = default
|
||||||
|
chat_bg = default
|
||||||
|
chat_buffer = white
|
||||||
|
chat_channel = white
|
||||||
|
chat_day_change = cyan
|
||||||
|
chat_delimiters = green
|
||||||
|
chat_highlight = yellow
|
||||||
|
chat_highlight_bg = magenta
|
||||||
|
chat_host = cyan
|
||||||
|
chat_inactive_buffer = default
|
||||||
|
chat_inactive_window = default
|
||||||
|
chat_nick = lightcyan
|
||||||
|
chat_nick_colors = "cyan,magenta,green,brown,lightblue,default,lightcyan,lightmagenta,lightgreen,blue"
|
||||||
|
chat_nick_offline = default
|
||||||
|
chat_nick_offline_highlight = default
|
||||||
|
chat_nick_offline_highlight_bg = blue
|
||||||
|
chat_nick_other = cyan
|
||||||
|
chat_nick_prefix = green
|
||||||
|
chat_nick_self = white
|
||||||
|
chat_nick_suffix = green
|
||||||
|
chat_prefix_action = white
|
||||||
|
chat_prefix_buffer = brown
|
||||||
|
chat_prefix_buffer_inactive_buffer = default
|
||||||
|
chat_prefix_error = yellow
|
||||||
|
chat_prefix_join = lightgreen
|
||||||
|
chat_prefix_more = lightmagenta
|
||||||
|
chat_prefix_network = magenta
|
||||||
|
chat_prefix_quit = lightred
|
||||||
|
chat_prefix_suffix = green
|
||||||
|
chat_read_marker = magenta
|
||||||
|
chat_read_marker_bg = default
|
||||||
|
chat_server = brown
|
||||||
|
chat_tags = red
|
||||||
|
chat_text_found = yellow
|
||||||
|
chat_text_found_bg = lightmagenta
|
||||||
|
chat_time = default
|
||||||
|
chat_time_delimiters = brown
|
||||||
|
chat_value = cyan
|
||||||
|
chat_value_null = blue
|
||||||
|
emphasized = yellow
|
||||||
|
emphasized_bg = magenta
|
||||||
|
input_actions = lightgreen
|
||||||
|
input_text_not_found = red
|
||||||
|
item_away = yellow
|
||||||
|
nicklist_away = cyan
|
||||||
|
nicklist_group = green
|
||||||
|
separator = blue
|
||||||
|
status_count_highlight = magenta
|
||||||
|
status_count_msg = brown
|
||||||
|
status_count_other = default
|
||||||
|
status_count_private = green
|
||||||
|
status_data_highlight = lightmagenta
|
||||||
|
status_data_msg = yellow
|
||||||
|
status_data_other = default
|
||||||
|
status_data_private = lightgreen
|
||||||
|
status_filter = green
|
||||||
|
status_more = yellow
|
||||||
|
status_mouse = green
|
||||||
|
status_name = white
|
||||||
|
status_name_ssl = lightgreen
|
||||||
|
status_nicklist_count = default
|
||||||
|
status_number = yellow
|
||||||
|
status_time = default
|
||||||
|
|
||||||
|
[completion]
|
||||||
|
base_word_until_cursor = on
|
||||||
|
command_inline = on
|
||||||
|
default_template = "%(nicks)|%(irc_channels)"
|
||||||
|
nick_add_space = on
|
||||||
|
nick_case_sensitive = off
|
||||||
|
nick_completer = ": "
|
||||||
|
nick_first_only = off
|
||||||
|
nick_ignore_chars = "[]`_-^"
|
||||||
|
partial_completion_alert = on
|
||||||
|
partial_completion_command = off
|
||||||
|
partial_completion_command_arg = off
|
||||||
|
partial_completion_count = on
|
||||||
|
partial_completion_other = off
|
||||||
|
partial_completion_templates = "config_options"
|
||||||
|
|
||||||
|
[history]
|
||||||
|
display_default = 5
|
||||||
|
max_buffer_lines_minutes = 0
|
||||||
|
max_buffer_lines_number = 4096
|
||||||
|
max_commands = 100
|
||||||
|
max_visited_buffers = 50
|
||||||
|
|
||||||
|
[proxy]
|
||||||
|
|
||||||
|
[network]
|
||||||
|
connection_timeout = 60
|
||||||
|
gnutls_ca_file = "/etc/ssl/certs/ca-certificates.crt"
|
||||||
|
gnutls_handshake_timeout = 30
|
||||||
|
proxy_curl = ""
|
||||||
|
|
||||||
|
[plugin]
|
||||||
|
autoload = "*"
|
||||||
|
debug = off
|
||||||
|
extension = ".so,.dll"
|
||||||
|
path = "%h/plugins"
|
||||||
|
save_config_on_unload = on
|
||||||
|
|
||||||
|
[bar]
|
||||||
|
buflist.color_bg = default
|
||||||
|
buflist.color_delim = default
|
||||||
|
buflist.color_fg = default
|
||||||
|
buflist.conditions = ""
|
||||||
|
buflist.filling_left_right = vertical
|
||||||
|
buflist.filling_top_bottom = columns_vertical
|
||||||
|
buflist.hidden = off
|
||||||
|
buflist.items = "buflist"
|
||||||
|
buflist.position = left
|
||||||
|
buflist.priority = 0
|
||||||
|
buflist.separator = on
|
||||||
|
buflist.size = 0
|
||||||
|
buflist.size_max = 0
|
||||||
|
buflist.type = root
|
||||||
|
fset.color_bg = default
|
||||||
|
fset.color_delim = cyan
|
||||||
|
fset.color_fg = default
|
||||||
|
fset.conditions = "''${buffer.full_name} == fset.fset"
|
||||||
|
fset.filling_left_right = vertical
|
||||||
|
fset.filling_top_bottom = horizontal
|
||||||
|
fset.hidden = off
|
||||||
|
fset.items = "fset"
|
||||||
|
fset.position = top
|
||||||
|
fset.priority = 0
|
||||||
|
fset.separator = on
|
||||||
|
fset.size = 3
|
||||||
|
fset.size_max = 3
|
||||||
|
fset.type = window
|
||||||
|
input.color_bg = default
|
||||||
|
input.color_delim = cyan
|
||||||
|
input.color_fg = default
|
||||||
|
input.conditions = ""
|
||||||
|
input.filling_left_right = vertical
|
||||||
|
input.filling_top_bottom = horizontal
|
||||||
|
input.hidden = off
|
||||||
|
input.items = "[input_prompt]+(away),[input_search],[input_paste],input_text"
|
||||||
|
input.position = bottom
|
||||||
|
input.priority = 1000
|
||||||
|
input.separator = off
|
||||||
|
input.size = 0
|
||||||
|
input.size_max = 0
|
||||||
|
input.type = window
|
||||||
|
nicklist.color_bg = default
|
||||||
|
nicklist.color_delim = cyan
|
||||||
|
nicklist.color_fg = default
|
||||||
|
nicklist.conditions = "''${nicklist}"
|
||||||
|
nicklist.filling_left_right = vertical
|
||||||
|
nicklist.filling_top_bottom = columns_vertical
|
||||||
|
nicklist.hidden = off
|
||||||
|
nicklist.items = "buffer_nicklist"
|
||||||
|
nicklist.position = right
|
||||||
|
nicklist.priority = 200
|
||||||
|
nicklist.separator = on
|
||||||
|
nicklist.size = 0
|
||||||
|
nicklist.size_max = 0
|
||||||
|
nicklist.type = window
|
||||||
|
status.color_bg = blue
|
||||||
|
status.color_delim = cyan
|
||||||
|
status.color_fg = default
|
||||||
|
status.conditions = ""
|
||||||
|
status.filling_left_right = vertical
|
||||||
|
status.filling_top_bottom = horizontal
|
||||||
|
status.hidden = off
|
||||||
|
status.items = "[time],[buffer_last_number],[buffer_plugin],buffer_number+:+buffer_name+(buffer_modes)+{buffer_nicklist_count}+buffer_zoom+buffer_filter,scroll,[lag],[hotlist],completion"
|
||||||
|
status.position = bottom
|
||||||
|
status.priority = 500
|
||||||
|
status.separator = off
|
||||||
|
status.size = 1
|
||||||
|
status.size_max = 0
|
||||||
|
status.type = window
|
||||||
|
title.color_bg = blue
|
||||||
|
title.color_delim = cyan
|
||||||
|
title.color_fg = default
|
||||||
|
title.conditions = ""
|
||||||
|
title.filling_left_right = vertical
|
||||||
|
title.filling_top_bottom = horizontal
|
||||||
|
title.hidden = off
|
||||||
|
title.items = "buffer_title"
|
||||||
|
title.position = top
|
||||||
|
title.priority = 500
|
||||||
|
title.separator = off
|
||||||
|
title.size = 1
|
||||||
|
title.size_max = 0
|
||||||
|
title.type = window
|
||||||
|
|
||||||
|
[layout]
|
||||||
|
|
||||||
|
[notify]
|
||||||
|
|
||||||
|
[filter]
|
||||||
|
|
||||||
|
[key]
|
||||||
|
ctrl-? = "/input delete_previous_char"
|
||||||
|
ctrl-A = "/input move_beginning_of_line"
|
||||||
|
ctrl-B = "/input move_previous_char"
|
||||||
|
ctrl-C_ = "/input insert \x1F"
|
||||||
|
ctrl-Cb = "/input insert \x02"
|
||||||
|
ctrl-Cc = "/input insert \x03"
|
||||||
|
ctrl-Ci = "/input insert \x1D"
|
||||||
|
ctrl-Co = "/input insert \x0F"
|
||||||
|
ctrl-Cv = "/input insert \x16"
|
||||||
|
ctrl-D = "/input delete_next_char"
|
||||||
|
ctrl-E = "/input move_end_of_line"
|
||||||
|
ctrl-F = "/input move_next_char"
|
||||||
|
ctrl-H = "/input delete_previous_char"
|
||||||
|
ctrl-I = "/input complete_next"
|
||||||
|
ctrl-J = "/input return"
|
||||||
|
ctrl-K = "/input delete_end_of_line"
|
||||||
|
ctrl-L = "/window refresh"
|
||||||
|
ctrl-M = "/input return"
|
||||||
|
ctrl-N = "/buffer +1"
|
||||||
|
ctrl-P = "/buffer -1"
|
||||||
|
ctrl-R = "/input search_text_here"
|
||||||
|
ctrl-Sctrl-U = "/input set_unread"
|
||||||
|
ctrl-T = "/input transpose_chars"
|
||||||
|
ctrl-U = "/input delete_beginning_of_line"
|
||||||
|
ctrl-W = "/input delete_previous_word"
|
||||||
|
ctrl-X = "/input switch_active_buffer"
|
||||||
|
ctrl-Y = "/input clipboard_paste"
|
||||||
|
meta-meta-OP = "/bar scroll buflist * b"
|
||||||
|
meta-meta-OQ = "/bar scroll buflist * e"
|
||||||
|
meta-meta2-11~ = "/bar scroll buflist * b"
|
||||||
|
meta-meta2-12~ = "/bar scroll buflist * e"
|
||||||
|
meta-meta2-1~ = "/window scroll_top"
|
||||||
|
meta-meta2-23~ = "/bar scroll nicklist * b"
|
||||||
|
meta-meta2-24~ = "/bar scroll nicklist * e"
|
||||||
|
meta-meta2-4~ = "/window scroll_bottom"
|
||||||
|
meta-meta2-5~ = "/window scroll_up"
|
||||||
|
meta-meta2-6~ = "/window scroll_down"
|
||||||
|
meta-meta2-7~ = "/window scroll_top"
|
||||||
|
meta-meta2-8~ = "/window scroll_bottom"
|
||||||
|
meta-meta2-A = "/buffer -1"
|
||||||
|
meta-meta2-B = "/buffer +1"
|
||||||
|
meta-meta2-C = "/buffer +1"
|
||||||
|
meta-meta2-D = "/buffer -1"
|
||||||
|
meta-- = "/filter toggle @"
|
||||||
|
meta-/ = "/input jump_last_buffer_displayed"
|
||||||
|
meta-0 = "/buffer *10"
|
||||||
|
meta-1 = "/buffer *1"
|
||||||
|
meta-2 = "/buffer *2"
|
||||||
|
meta-3 = "/buffer *3"
|
||||||
|
meta-4 = "/buffer *4"
|
||||||
|
meta-5 = "/buffer *5"
|
||||||
|
meta-6 = "/buffer *6"
|
||||||
|
meta-7 = "/buffer *7"
|
||||||
|
meta-8 = "/buffer *8"
|
||||||
|
meta-9 = "/buffer *9"
|
||||||
|
meta-< = "/input jump_previously_visited_buffer"
|
||||||
|
meta-= = "/filter toggle"
|
||||||
|
meta-> = "/input jump_next_visited_buffer"
|
||||||
|
meta-OA = "/input history_global_previous"
|
||||||
|
meta-OB = "/input history_global_next"
|
||||||
|
meta-OC = "/input move_next_word"
|
||||||
|
meta-OD = "/input move_previous_word"
|
||||||
|
meta-OF = "/input move_end_of_line"
|
||||||
|
meta-OH = "/input move_beginning_of_line"
|
||||||
|
meta-OP = "/bar scroll buflist * -100%"
|
||||||
|
meta-OQ = "/bar scroll buflist * +100%"
|
||||||
|
meta-Oa = "/input history_global_previous"
|
||||||
|
meta-Ob = "/input history_global_next"
|
||||||
|
meta-Oc = "/input move_next_word"
|
||||||
|
meta-Od = "/input move_previous_word"
|
||||||
|
meta2-11^ = "/bar scroll buflist * -100%"
|
||||||
|
meta2-11~ = "/bar scroll buflist * -100%"
|
||||||
|
meta2-12^ = "/bar scroll buflist * +100%"
|
||||||
|
meta2-12~ = "/bar scroll buflist * +100%"
|
||||||
|
meta2-15~ = "/buffer -1"
|
||||||
|
meta2-17~ = "/buffer +1"
|
||||||
|
meta2-18~ = "/window -1"
|
||||||
|
meta2-19~ = "/window +1"
|
||||||
|
meta2-1;3A = "/buffer -1"
|
||||||
|
meta2-1;3B = "/buffer +1"
|
||||||
|
meta2-1;3C = "/buffer +1"
|
||||||
|
meta2-1;3D = "/buffer -1"
|
||||||
|
meta2-1;3F = "/window scroll_bottom"
|
||||||
|
meta2-1;3H = "/window scroll_top"
|
||||||
|
meta2-1;3P = "/bar scroll buflist * b"
|
||||||
|
meta2-1;3Q = "/bar scroll buflist * e"
|
||||||
|
meta2-1;5A = "/input history_global_previous"
|
||||||
|
meta2-1;5B = "/input history_global_next"
|
||||||
|
meta2-1;5C = "/input move_next_word"
|
||||||
|
meta2-1;5D = "/input move_previous_word"
|
||||||
|
meta2-1;5P = "/bar scroll buflist * -100%"
|
||||||
|
meta2-1;5Q = "/bar scroll buflist * +100%"
|
||||||
|
meta2-1~ = "/input move_beginning_of_line"
|
||||||
|
meta2-200~ = "/input paste_start"
|
||||||
|
meta2-201~ = "/input paste_stop"
|
||||||
|
meta2-20~ = "/bar scroll title * -30%"
|
||||||
|
meta2-21~ = "/bar scroll title * +30%"
|
||||||
|
meta2-23;3~ = "/bar scroll nicklist * b"
|
||||||
|
meta2-23;5~ = "/bar scroll nicklist * -100%"
|
||||||
|
meta2-23^ = "/bar scroll nicklist * -100%"
|
||||||
|
meta2-23~ = "/bar scroll nicklist * -100%"
|
||||||
|
meta2-24;3~ = "/bar scroll nicklist * e"
|
||||||
|
meta2-24;5~ = "/bar scroll nicklist * +100%"
|
||||||
|
meta2-24^ = "/bar scroll nicklist * +100%"
|
||||||
|
meta2-24~ = "/bar scroll nicklist * +100%"
|
||||||
|
meta2-3~ = "/input delete_next_char"
|
||||||
|
meta2-4~ = "/input move_end_of_line"
|
||||||
|
meta2-5;3~ = "/window scroll_up"
|
||||||
|
meta2-5~ = "/window page_up"
|
||||||
|
meta2-6;3~ = "/window scroll_down"
|
||||||
|
meta2-6~ = "/window page_down"
|
||||||
|
meta2-7~ = "/input move_beginning_of_line"
|
||||||
|
meta2-8~ = "/input move_end_of_line"
|
||||||
|
meta2-A = "/input history_previous"
|
||||||
|
meta2-B = "/input history_next"
|
||||||
|
meta2-C = "/input move_next_char"
|
||||||
|
meta2-D = "/input move_previous_char"
|
||||||
|
meta2-F = "/input move_end_of_line"
|
||||||
|
meta2-G = "/window page_down"
|
||||||
|
meta2-H = "/input move_beginning_of_line"
|
||||||
|
meta2-I = "/window page_up"
|
||||||
|
meta2-Z = "/input complete_previous"
|
||||||
|
meta2-[E = "/buffer -1"
|
||||||
|
meta-_ = "/input redo"
|
||||||
|
meta-a = "/input jump_smart"
|
||||||
|
meta-b = "/input move_previous_word"
|
||||||
|
meta-d = "/input delete_next_word"
|
||||||
|
meta-f = "/input move_next_word"
|
||||||
|
meta-h = "/input hotlist_clear"
|
||||||
|
meta-jmeta-f = "/buffer -"
|
||||||
|
meta-jmeta-l = "/buffer +"
|
||||||
|
meta-jmeta-r = "/server raw"
|
||||||
|
meta-jmeta-s = "/server jump"
|
||||||
|
meta-j01 = "/buffer *1"
|
||||||
|
meta-j02 = "/buffer *2"
|
||||||
|
meta-j03 = "/buffer *3"
|
||||||
|
meta-j04 = "/buffer *4"
|
||||||
|
meta-j05 = "/buffer *5"
|
||||||
|
meta-j06 = "/buffer *6"
|
||||||
|
meta-j07 = "/buffer *7"
|
||||||
|
meta-j08 = "/buffer *8"
|
||||||
|
meta-j09 = "/buffer *9"
|
||||||
|
meta-j10 = "/buffer *10"
|
||||||
|
meta-j11 = "/buffer *11"
|
||||||
|
meta-j12 = "/buffer *12"
|
||||||
|
meta-j13 = "/buffer *13"
|
||||||
|
meta-j14 = "/buffer *14"
|
||||||
|
meta-j15 = "/buffer *15"
|
||||||
|
meta-j16 = "/buffer *16"
|
||||||
|
meta-j17 = "/buffer *17"
|
||||||
|
meta-j18 = "/buffer *18"
|
||||||
|
meta-j19 = "/buffer *19"
|
||||||
|
meta-j20 = "/buffer *20"
|
||||||
|
meta-j21 = "/buffer *21"
|
||||||
|
meta-j22 = "/buffer *22"
|
||||||
|
meta-j23 = "/buffer *23"
|
||||||
|
meta-j24 = "/buffer *24"
|
||||||
|
meta-j25 = "/buffer *25"
|
||||||
|
meta-j26 = "/buffer *26"
|
||||||
|
meta-j27 = "/buffer *27"
|
||||||
|
meta-j28 = "/buffer *28"
|
||||||
|
meta-j29 = "/buffer *29"
|
||||||
|
meta-j30 = "/buffer *30"
|
||||||
|
meta-j31 = "/buffer *31"
|
||||||
|
meta-j32 = "/buffer *32"
|
||||||
|
meta-j33 = "/buffer *33"
|
||||||
|
meta-j34 = "/buffer *34"
|
||||||
|
meta-j35 = "/buffer *35"
|
||||||
|
meta-j36 = "/buffer *36"
|
||||||
|
meta-j37 = "/buffer *37"
|
||||||
|
meta-j38 = "/buffer *38"
|
||||||
|
meta-j39 = "/buffer *39"
|
||||||
|
meta-j40 = "/buffer *40"
|
||||||
|
meta-j41 = "/buffer *41"
|
||||||
|
meta-j42 = "/buffer *42"
|
||||||
|
meta-j43 = "/buffer *43"
|
||||||
|
meta-j44 = "/buffer *44"
|
||||||
|
meta-j45 = "/buffer *45"
|
||||||
|
meta-j46 = "/buffer *46"
|
||||||
|
meta-j47 = "/buffer *47"
|
||||||
|
meta-j48 = "/buffer *48"
|
||||||
|
meta-j49 = "/buffer *49"
|
||||||
|
meta-j50 = "/buffer *50"
|
||||||
|
meta-j51 = "/buffer *51"
|
||||||
|
meta-j52 = "/buffer *52"
|
||||||
|
meta-j53 = "/buffer *53"
|
||||||
|
meta-j54 = "/buffer *54"
|
||||||
|
meta-j55 = "/buffer *55"
|
||||||
|
meta-j56 = "/buffer *56"
|
||||||
|
meta-j57 = "/buffer *57"
|
||||||
|
meta-j58 = "/buffer *58"
|
||||||
|
meta-j59 = "/buffer *59"
|
||||||
|
meta-j60 = "/buffer *60"
|
||||||
|
meta-j61 = "/buffer *61"
|
||||||
|
meta-j62 = "/buffer *62"
|
||||||
|
meta-j63 = "/buffer *63"
|
||||||
|
meta-j64 = "/buffer *64"
|
||||||
|
meta-j65 = "/buffer *65"
|
||||||
|
meta-j66 = "/buffer *66"
|
||||||
|
meta-j67 = "/buffer *67"
|
||||||
|
meta-j68 = "/buffer *68"
|
||||||
|
meta-j69 = "/buffer *69"
|
||||||
|
meta-j70 = "/buffer *70"
|
||||||
|
meta-j71 = "/buffer *71"
|
||||||
|
meta-j72 = "/buffer *72"
|
||||||
|
meta-j73 = "/buffer *73"
|
||||||
|
meta-j74 = "/buffer *74"
|
||||||
|
meta-j75 = "/buffer *75"
|
||||||
|
meta-j76 = "/buffer *76"
|
||||||
|
meta-j77 = "/buffer *77"
|
||||||
|
meta-j78 = "/buffer *78"
|
||||||
|
meta-j79 = "/buffer *79"
|
||||||
|
meta-j80 = "/buffer *80"
|
||||||
|
meta-j81 = "/buffer *81"
|
||||||
|
meta-j82 = "/buffer *82"
|
||||||
|
meta-j83 = "/buffer *83"
|
||||||
|
meta-j84 = "/buffer *84"
|
||||||
|
meta-j85 = "/buffer *85"
|
||||||
|
meta-j86 = "/buffer *86"
|
||||||
|
meta-j87 = "/buffer *87"
|
||||||
|
meta-j88 = "/buffer *88"
|
||||||
|
meta-j89 = "/buffer *89"
|
||||||
|
meta-j90 = "/buffer *90"
|
||||||
|
meta-j91 = "/buffer *91"
|
||||||
|
meta-j92 = "/buffer *92"
|
||||||
|
meta-j93 = "/buffer *93"
|
||||||
|
meta-j94 = "/buffer *94"
|
||||||
|
meta-j95 = "/buffer *95"
|
||||||
|
meta-j96 = "/buffer *96"
|
||||||
|
meta-j97 = "/buffer *97"
|
||||||
|
meta-j98 = "/buffer *98"
|
||||||
|
meta-j99 = "/buffer *99"
|
||||||
|
meta-k = "/go"
|
||||||
|
meta-l = "/window bare"
|
||||||
|
meta-m = "/mute mouse toggle"
|
||||||
|
meta-n = "/window scroll_next_highlight"
|
||||||
|
meta-p = "/window scroll_previous_highlight"
|
||||||
|
meta-r = "/input delete_line"
|
||||||
|
meta-s = "/mute aspell toggle"
|
||||||
|
meta-u = "/window scroll_unread"
|
||||||
|
meta-wmeta-meta2-A = "/window up"
|
||||||
|
meta-wmeta-meta2-B = "/window down"
|
||||||
|
meta-wmeta-meta2-C = "/window right"
|
||||||
|
meta-wmeta-meta2-D = "/window left"
|
||||||
|
meta-wmeta2-1;3A = "/window up"
|
||||||
|
meta-wmeta2-1;3B = "/window down"
|
||||||
|
meta-wmeta2-1;3C = "/window right"
|
||||||
|
meta-wmeta2-1;3D = "/window left"
|
||||||
|
meta-wmeta-b = "/window balance"
|
||||||
|
meta-wmeta-s = "/window swap"
|
||||||
|
meta-x = "/input zoom_merged_buffer"
|
||||||
|
meta-z = "/window zoom"
|
||||||
|
ctrl-_ = "/input undo"
|
||||||
|
|
||||||
|
[key_search]
|
||||||
|
ctrl-I = "/input search_switch_where"
|
||||||
|
ctrl-J = "/input search_stop_here"
|
||||||
|
ctrl-M = "/input search_stop_here"
|
||||||
|
ctrl-Q = "/input search_stop"
|
||||||
|
ctrl-R = "/input search_switch_regex"
|
||||||
|
meta2-A = "/input search_previous"
|
||||||
|
meta2-B = "/input search_next"
|
||||||
|
meta-c = "/input search_switch_case"
|
||||||
|
|
||||||
|
[key_cursor]
|
||||||
|
ctrl-J = "/cursor stop"
|
||||||
|
ctrl-M = "/cursor stop"
|
||||||
|
meta-meta2-A = "/cursor move area_up"
|
||||||
|
meta-meta2-B = "/cursor move area_down"
|
||||||
|
meta-meta2-C = "/cursor move area_right"
|
||||||
|
meta-meta2-D = "/cursor move area_left"
|
||||||
|
meta2-1;3A = "/cursor move area_up"
|
||||||
|
meta2-1;3B = "/cursor move area_down"
|
||||||
|
meta2-1;3C = "/cursor move area_right"
|
||||||
|
meta2-1;3D = "/cursor move area_left"
|
||||||
|
meta2-A = "/cursor move up"
|
||||||
|
meta2-B = "/cursor move down"
|
||||||
|
meta2-C = "/cursor move right"
|
||||||
|
meta2-D = "/cursor move left"
|
||||||
|
@chat(python.*):D = "hsignal:slack_cursor_delete"
|
||||||
|
@chat(python.*):L = "hsignal:slack_cursor_linkarchive"
|
||||||
|
@chat(python.*):M = "hsignal:slack_cursor_message"
|
||||||
|
@chat(python.*):R = "hsignal:slack_cursor_reply"
|
||||||
|
@chat(python.*):T = "hsignal:slack_cursor_thread"
|
||||||
|
@item(buffer_nicklist):K = "/window ''${_window_number};/kickban ''${nick}"
|
||||||
|
@item(buffer_nicklist):b = "/window ''${_window_number};/ban ''${nick}"
|
||||||
|
@item(buffer_nicklist):k = "/window ''${_window_number};/kick ''${nick}"
|
||||||
|
@item(buffer_nicklist):q = "/window ''${_window_number};/query ''${nick};/cursor stop"
|
||||||
|
@item(buffer_nicklist):w = "/window ''${_window_number};/whois ''${nick}"
|
||||||
|
@chat:Q = "hsignal:chat_quote_time_prefix_message;/cursor stop"
|
||||||
|
@chat:m = "hsignal:chat_quote_message;/cursor stop"
|
||||||
|
@chat:q = "hsignal:chat_quote_prefix_message;/cursor stop"
|
||||||
|
|
||||||
|
[key_mouse]
|
||||||
|
@bar(buflist):ctrl-wheeldown = "hsignal:buflist_mouse"
|
||||||
|
@bar(buflist):ctrl-wheelup = "hsignal:buflist_mouse"
|
||||||
|
@bar(input):button2 = "/input grab_mouse_area"
|
||||||
|
@bar(nicklist):button1-gesture-down = "/bar scroll nicklist ''${_window_number} +100%"
|
||||||
|
@bar(nicklist):button1-gesture-down-long = "/bar scroll nicklist ''${_window_number} e"
|
||||||
|
@bar(nicklist):button1-gesture-up = "/bar scroll nicklist ''${_window_number} -100%"
|
||||||
|
@bar(nicklist):button1-gesture-up-long = "/bar scroll nicklist ''${_window_number} b"
|
||||||
|
@chat(fset.fset):button1 = "/window ''${_window_number};/fset -go ''${_chat_line_y}"
|
||||||
|
@chat(fset.fset):button2* = "hsignal:fset_mouse"
|
||||||
|
@chat(fset.fset):wheeldown = "/fset -down 5"
|
||||||
|
@chat(fset.fset):wheelup = "/fset -up 5"
|
||||||
|
@chat(python.*):button2 = "hsignal:slack_mouse"
|
||||||
|
@chat(script.scripts):button1 = "/window ''${_window_number};/script go ''${_chat_line_y}"
|
||||||
|
@chat(script.scripts):button2 = "/window ''${_window_number};/script go ''${_chat_line_y};/script installremove -q ''${script_name_with_extension}"
|
||||||
|
@chat(script.scripts):wheeldown = "/script down 5"
|
||||||
|
@chat(script.scripts):wheelup = "/script up 5"
|
||||||
|
@item(buffer_nicklist):button1 = "/window ''${_window_number};/query ''${nick}"
|
||||||
|
@item(buffer_nicklist):button1-gesture-left = "/window ''${_window_number};/kick ''${nick}"
|
||||||
|
@item(buffer_nicklist):button1-gesture-left-long = "/window ''${_window_number};/kickban ''${nick}"
|
||||||
|
@item(buffer_nicklist):button2 = "/window ''${_window_number};/whois ''${nick}"
|
||||||
|
@item(buffer_nicklist):button2-gesture-left = "/window ''${_window_number};/ban ''${nick}"
|
||||||
|
@item(buflist):button1* = "hsignal:buflist_mouse"
|
||||||
|
@item(buflist):button2* = "hsignal:buflist_mouse"
|
||||||
|
@item(buflist2):button1* = "hsignal:buflist_mouse"
|
||||||
|
@item(buflist2):button2* = "hsignal:buflist_mouse"
|
||||||
|
@item(buflist3):button1* = "hsignal:buflist_mouse"
|
||||||
|
@item(buflist3):button2* = "hsignal:buflist_mouse"
|
||||||
|
@bar:wheeldown = "/bar scroll ''${_bar_name} ''${_window_number} +20%"
|
||||||
|
@bar:wheelup = "/bar scroll ''${_bar_name} ''${_window_number} -20%"
|
||||||
|
@chat:button1 = "/window ''${_window_number}"
|
||||||
|
@chat:button1-gesture-left = "/window ''${_window_number};/buffer -1"
|
||||||
|
@chat:button1-gesture-left-long = "/window ''${_window_number};/buffer 1"
|
||||||
|
@chat:button1-gesture-right = "/window ''${_window_number};/buffer +1"
|
||||||
|
@chat:button1-gesture-right-long = "/window ''${_window_number};/input jump_last_buffer"
|
||||||
|
@chat:ctrl-wheeldown = "/window scroll_horiz -window ''${_window_number} +10%"
|
||||||
|
@chat:ctrl-wheelup = "/window scroll_horiz -window ''${_window_number} -10%"
|
||||||
|
@chat:wheeldown = "/window scroll_down -window ''${_window_number}"
|
||||||
|
@chat:wheelup = "/window scroll_up -window ''${_window_number}"
|
||||||
|
@*:button3 = "/cursor go ''${_x},''${_y}"
|
||||||
|
'';
|
||||||
|
|
||||||
|
home.packages = [ weechat ];
|
||||||
|
xsession.windowManager.i3.config.startup = [{
|
||||||
|
command =
|
||||||
|
"${config.defaultApplications.term.cmd} -e ${weechat}/bin/weechat";
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
}
|
15
modules/applications/yt-utilities.nix
Normal file
15
modules/applications/yt-utilities.nix
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{ pkgs, config, lib, ... }: {
|
||||||
|
home-manager.users.balsoft = lib.mkIf (config.deviceSpecific.goodMachine) {
|
||||||
|
home.file.".yt.yaml".text = builtins.toJSON {
|
||||||
|
yt-token = config.secrets.yt-utilities.token;
|
||||||
|
user = config.secrets.yt-utilities.user;
|
||||||
|
from = {
|
||||||
|
org = "/home/balsoft/cloud/Google Drive/serokell.org";
|
||||||
|
full-file = true;
|
||||||
|
};
|
||||||
|
since = "1997-11-19";
|
||||||
|
severity = "Info";
|
||||||
|
};
|
||||||
|
home.packages = [ pkgs.yt-utilities ];
|
||||||
|
};
|
||||||
|
}
|
45
modules/default.nix
Executable file
45
modules/default.nix
Executable file
@ -0,0 +1,45 @@
|
|||||||
|
device:
|
||||||
|
{ pkgs, lib, ... }: {
|
||||||
|
imports = [
|
||||||
|
./applications/packages.nix
|
||||||
|
./applications/emacs
|
||||||
|
./applications/konsole.nix
|
||||||
|
./applications/trojita.nix
|
||||||
|
./applications/weechat.nix
|
||||||
|
./applications/okular.nix
|
||||||
|
./applications/yt-utilities.nix
|
||||||
|
./applications/firefox.nix
|
||||||
|
./workspace/autofs.nix
|
||||||
|
./workspace/i3
|
||||||
|
./workspace/i3blocks
|
||||||
|
./workspace/zsh.nix
|
||||||
|
./workspace/gtk.nix
|
||||||
|
./workspace/misc.nix
|
||||||
|
./workspace/kde
|
||||||
|
./workspace/ssh.nix
|
||||||
|
./workspace/locale.nix
|
||||||
|
./workspace/fonts.nix
|
||||||
|
./workspace/light.nix
|
||||||
|
./workspace/mako.nix
|
||||||
|
./workspace/mopidy.nix
|
||||||
|
./workspace/gcalcli.nix
|
||||||
|
./workspace/rclone.nix
|
||||||
|
./workspace/xresources.nix
|
||||||
|
./themes.nix
|
||||||
|
./applications.nix
|
||||||
|
./secrets.nix
|
||||||
|
./devices.nix
|
||||||
|
./packages.nix
|
||||||
|
./users.nix
|
||||||
|
./hardware.nix
|
||||||
|
./services.nix
|
||||||
|
./power.nix
|
||||||
|
./network.nix
|
||||||
|
] ++ lib.optionals (device == "AMD-Workstation") [
|
||||||
|
./mailserver.nix
|
||||||
|
./matrix-synapse.nix
|
||||||
|
./workspace/kanshi.nix
|
||||||
|
./openvpn.nix
|
||||||
|
./nginx.nix
|
||||||
|
];
|
||||||
|
}
|
112
modules/devices.nix
Normal file
112
modules/devices.nix
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
{ pkgs, lib, config, ... }:
|
||||||
|
with lib;
|
||||||
|
with types; {
|
||||||
|
options = {
|
||||||
|
device = mkOption { type = strMatching "[A-z|0-9]*-(Laptop|Workstation|VM)"; };
|
||||||
|
devices = mkOption { type = attrs; };
|
||||||
|
deviceSpecific = mkOption { type = attrs; };
|
||||||
|
};
|
||||||
|
config = {
|
||||||
|
deviceSpecific = let
|
||||||
|
device = config.device;
|
||||||
|
devInfo = config.devices.${config.device};
|
||||||
|
in rec {
|
||||||
|
isLaptop = (!isNull (builtins.match ".*Laptop" device));
|
||||||
|
smallScreen = (device == "Prestigio-Laptop");
|
||||||
|
isShared = device == "Lenovo-Workstation";
|
||||||
|
cpu = devInfo.cpu.vendor;
|
||||||
|
inherit devInfo;
|
||||||
|
isSSD = devInfo.drive.type == "ssd";
|
||||||
|
# Whether machine is powerful enough for heavy stuff
|
||||||
|
goodMachine = devInfo.cpu.clock * devInfo.cpu.cores >= 4000
|
||||||
|
&& devInfo.drive.size >= 100 && devInfo.ram >= 8;
|
||||||
|
isHost = isSSD;
|
||||||
|
bigScreen = devInfo ? bigScreen;
|
||||||
|
};
|
||||||
|
|
||||||
|
devices = {
|
||||||
|
T490s-Laptop = {
|
||||||
|
cpu = {
|
||||||
|
vendor = "intel";
|
||||||
|
|
||||||
|
clock = 4600;
|
||||||
|
cores = 4;
|
||||||
|
};
|
||||||
|
drive = {
|
||||||
|
type = "ssd";
|
||||||
|
speed = 2000;
|
||||||
|
size = 250;
|
||||||
|
};
|
||||||
|
ram = 16;
|
||||||
|
};
|
||||||
|
T420-Laptop = {
|
||||||
|
legacy = false;
|
||||||
|
cpu = {
|
||||||
|
vendor = "intel";
|
||||||
|
clock = 2500;
|
||||||
|
cores = 2;
|
||||||
|
};
|
||||||
|
drive = {
|
||||||
|
type = "ssd";
|
||||||
|
speed = 1000;
|
||||||
|
size = 120;
|
||||||
|
};
|
||||||
|
ram = 8;
|
||||||
|
};
|
||||||
|
Lenovo-Workstation = {
|
||||||
|
legacy = true;
|
||||||
|
cpu = {
|
||||||
|
vendor = "intel";
|
||||||
|
clock = 2500;
|
||||||
|
cores = 2;
|
||||||
|
};
|
||||||
|
drive = {
|
||||||
|
type = "ssd";
|
||||||
|
speed = 250;
|
||||||
|
size = 120;
|
||||||
|
};
|
||||||
|
ram = 8;
|
||||||
|
};
|
||||||
|
AMD-Workstation = {
|
||||||
|
cpu = {
|
||||||
|
vendor = "amd";
|
||||||
|
clock = 4200;
|
||||||
|
cores = 8;
|
||||||
|
};
|
||||||
|
drive = {
|
||||||
|
type = "ssd";
|
||||||
|
speed = 6000;
|
||||||
|
size = 250;
|
||||||
|
};
|
||||||
|
bigScreen = true;
|
||||||
|
ram = 32;
|
||||||
|
};
|
||||||
|
Prestigio-Laptop = {
|
||||||
|
cpu = {
|
||||||
|
vendor = "intel";
|
||||||
|
clock = 1400;
|
||||||
|
cores = 2;
|
||||||
|
};
|
||||||
|
drive = {
|
||||||
|
type = "flash";
|
||||||
|
speed = 100;
|
||||||
|
size = 32;
|
||||||
|
};
|
||||||
|
ram = 2;
|
||||||
|
};
|
||||||
|
NixOS-VM = {
|
||||||
|
cpu = {
|
||||||
|
vendor = "intel";
|
||||||
|
clock = 1000;
|
||||||
|
cores = 1;
|
||||||
|
};
|
||||||
|
drive = {
|
||||||
|
type = "ssd";
|
||||||
|
speed = 50;
|
||||||
|
size = 1;
|
||||||
|
};
|
||||||
|
ram = 4;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
149
modules/hardware.nix
Normal file
149
modules/hardware.nix
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
|
||||||
|
with rec { inherit (config) device devices deviceSpecific; };
|
||||||
|
with deviceSpecific; {
|
||||||
|
|
||||||
|
hardware.sensor.iio.enable = (device == "HP-Laptop");
|
||||||
|
hardware.cpu.${devices.${device}.cpu.vendor}.updateMicrocode =
|
||||||
|
true; # Update microcode
|
||||||
|
|
||||||
|
hardware.enableRedistributableFirmware = true; # For some unfree drivers
|
||||||
|
|
||||||
|
hardware.opengl.enable = true;
|
||||||
|
hardware.opengl.driSupport = true;
|
||||||
|
hardware.opengl.driSupport32Bit = true; # For steam
|
||||||
|
|
||||||
|
hardware.bluetooth.enable = true;
|
||||||
|
hardware.bluetooth.package = pkgs.bluezFull;
|
||||||
|
|
||||||
|
hardware.sane.enable = true;
|
||||||
|
|
||||||
|
services.throttled = {
|
||||||
|
enable = device == "T490s-Laptop";
|
||||||
|
extraConfig = ''
|
||||||
|
[GENERAL]
|
||||||
|
# Enable or disable the script execution
|
||||||
|
Enabled: True
|
||||||
|
# SYSFS path for checking if the system is running on AC power
|
||||||
|
Sysfs_Power_Path: /sys/class/power_supply/AC*/online
|
||||||
|
|
||||||
|
## Settings to apply while connected to Battery power
|
||||||
|
[BATTERY]
|
||||||
|
# Update the registers every this many seconds
|
||||||
|
Update_Rate_s: 30
|
||||||
|
# Max package power for time window #1
|
||||||
|
PL1_Tdp_W: 29
|
||||||
|
# Time window #1 duration
|
||||||
|
PL1_Duration_s: 28
|
||||||
|
# Max package power for time window #2
|
||||||
|
PL2_Tdp_W: 44
|
||||||
|
# Time window #2 duration
|
||||||
|
PL2_Duration_S: 0.002
|
||||||
|
# Max allowed temperature before throttling
|
||||||
|
Trip_Temp_C: 85
|
||||||
|
# Set cTDP to normal=0, down=1 or up=2 (EXPERIMENTAL)
|
||||||
|
cTDP: 1
|
||||||
|
|
||||||
|
## Settings to apply while connected to AC power
|
||||||
|
[AC]
|
||||||
|
# Update the registers every this many seconds
|
||||||
|
Update_Rate_s: 5
|
||||||
|
# Max package power for time window #1
|
||||||
|
PL1_Tdp_W: 44
|
||||||
|
# Time window #1 duration
|
||||||
|
PL1_Duration_s: 28
|
||||||
|
# Max package power for time window #2
|
||||||
|
PL2_Tdp_W: 44
|
||||||
|
# Time window #2 duration
|
||||||
|
PL2_Duration_S: 0.002
|
||||||
|
# Max allowed temperature before throttling
|
||||||
|
Trip_Temp_C: 95
|
||||||
|
# Set HWP energy performance hints to 'performance' on high load (EXPERIMENTAL)
|
||||||
|
HWP_Mode: True
|
||||||
|
# Set cTDP to normal=0, down=1 or up=2 (EXPERIMENTAL)
|
||||||
|
cTDP: 2
|
||||||
|
|
||||||
|
[UNDERVOLT]
|
||||||
|
# CPU core voltage offset (mV)
|
||||||
|
CORE: -200
|
||||||
|
# Integrated GPU voltage offset (mV)
|
||||||
|
GPU: -60
|
||||||
|
# CPU cache voltage offset (mV)
|
||||||
|
CACHE: -50
|
||||||
|
# System Agent voltage offset (mV)
|
||||||
|
UNCORE: 0
|
||||||
|
# Analog I/O voltage offset (mV)
|
||||||
|
ANALOGIO: 0
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
systemd.services.thinkpad_leds = {
|
||||||
|
enable = config.device == "T490s-Laptop";
|
||||||
|
description = "Set up thinkpad leds";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
script = ''
|
||||||
|
modprobe -r ec_sys
|
||||||
|
modprobe ec_sys write_support=1
|
||||||
|
echo -n -e "\x0e" | dd of="/sys/kernel/debug/ec/ec0/io" bs=1 seek=12 count=1 conv=notrunc 2> /dev/null
|
||||||
|
modprobe -r ec_sys
|
||||||
|
'';
|
||||||
|
serviceConfig.Type = "oneshot";
|
||||||
|
};
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
loader = {
|
||||||
|
grub.enable = true;
|
||||||
|
grub.version = 2;
|
||||||
|
grub.useOSProber = true;
|
||||||
|
timeout = 1;
|
||||||
|
} // (if deviceSpecific.devInfo.legacy or false then { # Non-UEFI config
|
||||||
|
grub.device = "/dev/sda";
|
||||||
|
} else { # UEFI config
|
||||||
|
grub.efiSupport = true;
|
||||||
|
grub.device = "nodev";
|
||||||
|
grub.efiInstallAsRemovable = true; # NVRAM is unreliable
|
||||||
|
});
|
||||||
|
consoleLogLevel = 3;
|
||||||
|
blacklistedKernelModules = lib.optionals (device == "Prestigio-Laptop") [
|
||||||
|
"axp288_charger"
|
||||||
|
"axp288_fuel_gauge"
|
||||||
|
"axp288_adc"
|
||||||
|
]; # Disable battery driver as it hangs this piece of shit
|
||||||
|
extraModulePackages = [ pkgs.linuxPackages.v4l2loopback ];
|
||||||
|
extraModprobeConfig = if (device == "ASUS-Laptop") then
|
||||||
|
"options iwlwifi swcrypto=1 power_save=0 power_level=5 11n_disable=8 bt_coex_active=1"
|
||||||
|
else
|
||||||
|
""; # Attempt to fix broken wireless
|
||||||
|
kernel.sysctl."vm.swappiness" = 0;
|
||||||
|
kernelPackages = pkgs.linuxPackages;
|
||||||
|
kernel.sysctl."kernel/sysrq" = 1;
|
||||||
|
kernelParams = [
|
||||||
|
"quiet"
|
||||||
|
"scsi_mod.use_blk_mq=1"
|
||||||
|
"modeset"
|
||||||
|
"nofb"
|
||||||
|
"rd.systemd.show_status=auto"
|
||||||
|
"rd.udev.log_priority=3"
|
||||||
|
"pti=off"
|
||||||
|
"spectre_v2=off"
|
||||||
|
] ++ lib.optionals (device == "Prestigio-Laptop") [
|
||||||
|
"intel_idle.max_cstate=1" # Otherwise it hangs
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.logind.lidSwitchExternalPower = "ignore";
|
||||||
|
|
||||||
|
services.logind.extraConfig = "HandlePowerKey=suspend";
|
||||||
|
sound.enable = true;
|
||||||
|
hardware.pulseaudio = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.pulseaudioFull;
|
||||||
|
support32Bit = true;
|
||||||
|
# systemWide = true;
|
||||||
|
extraConfig = ''
|
||||||
|
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1
|
||||||
|
'';
|
||||||
|
extraModules = [ pkgs.pulseaudio-modules-bt ];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.dbus.packages = [ pkgs.blueman ];
|
||||||
|
}
|
29
modules/mailserver.nix
Normal file
29
modules/mailserver.nix
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
let
|
||||||
|
module = toString (import ../nix/sources.nix).simple-nixos-mailserver;
|
||||||
|
readCommandResult = command:
|
||||||
|
builtins.readFile (pkgs.runCommand "cmd" { preferLocalBuild = true; }
|
||||||
|
"echo -n $(${command}) > $out");
|
||||||
|
hashedPassword = readCommandResult
|
||||||
|
"${pkgs.mkpasswd}/bin/mkpasswd -m sha-512 '${config.secrets.mail.password}'";
|
||||||
|
in {
|
||||||
|
imports = [ module ];
|
||||||
|
mailserver = {
|
||||||
|
enable = true;
|
||||||
|
fqdn = config.secrets.mail.host;
|
||||||
|
domains = [ config.secrets.mail.host ];
|
||||||
|
loginAccounts = {
|
||||||
|
"balsoft@balsoft.ru" = {
|
||||||
|
aliases = [ "balsoft" ];
|
||||||
|
inherit hashedPassword;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
localDnsResolver = false;
|
||||||
|
certificateScheme = 1;
|
||||||
|
certificateFile = builtins.toFile "balsoft.crt" config.secrets.ssl.cert;
|
||||||
|
keyFile = builtins.toFile "balsoft.key" config.secrets.ssl.priv;
|
||||||
|
enableImap = true;
|
||||||
|
enableImapSsl = true;
|
||||||
|
virusScanning = false;
|
||||||
|
};
|
||||||
|
}
|
122
modules/matrix-synapse.nix
Normal file
122
modules/matrix-synapse.nix
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
{ pkgs, config, lib, ... }: {
|
||||||
|
services.matrix-synapse = {
|
||||||
|
enable = true;
|
||||||
|
allow_guest_access = true;
|
||||||
|
listeners = [{
|
||||||
|
bind_address = "0.0.0.0";
|
||||||
|
port = 13748;
|
||||||
|
resources = [
|
||||||
|
{
|
||||||
|
compress = true;
|
||||||
|
names = [ "client" ];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
compress = false;
|
||||||
|
names = [ "federation" ];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
tls = true;
|
||||||
|
type = "http";
|
||||||
|
x_forwarded = false;
|
||||||
|
}];
|
||||||
|
registration_shared_secret = config.secrets.matrix.shared_secret;
|
||||||
|
public_baseurl = "https://balsoft.ru:13748/";
|
||||||
|
server_name = "balsoft.ru";
|
||||||
|
tls_certificate_path = toString (pkgs.writeTextFile {
|
||||||
|
name = "matrix.crt";
|
||||||
|
text = config.secrets.ssl.cert;
|
||||||
|
});
|
||||||
|
tls_private_key_path = toString (pkgs.writeTextFile {
|
||||||
|
name = "matrix_rsa";
|
||||||
|
text = config.secrets.ssl.priv;
|
||||||
|
});
|
||||||
|
app_service_config_files = [
|
||||||
|
(builtins.toFile "registration_tg.yaml"
|
||||||
|
(builtins.toJSON config.secrets.matrix.mautrix-telegram.registration))
|
||||||
|
(builtins.toFile "registration_wa.yaml"
|
||||||
|
(builtins.toJSON config.secrets.matrix.mautrix-whatsapp.registration))
|
||||||
|
];
|
||||||
|
};
|
||||||
|
systemd.services.whatsapp-vm = {
|
||||||
|
description = "Android VM with WhatsApp";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
requires = [ "network-online.target" ];
|
||||||
|
preStart = "mkdir -p /var/lib/whatsapp";
|
||||||
|
path = [ pkgs.coreutils ];
|
||||||
|
serviceConfig = {
|
||||||
|
Restart = "always";
|
||||||
|
RestartSec = 1;
|
||||||
|
TimeoutStartSec = "60";
|
||||||
|
Type = "forking";
|
||||||
|
};
|
||||||
|
script = ''
|
||||||
|
NIX_ANDROID_EMULATOR_FLAGS="-no-audio -no-window -read-only" ${
|
||||||
|
with import (import ../nix/sources.nix).nixpkgs {
|
||||||
|
config.android_sdk.accept_license = true;
|
||||||
|
};
|
||||||
|
androidenv.emulateApp {
|
||||||
|
name = "WhatsApp";
|
||||||
|
app = fetchurl {
|
||||||
|
name = "WhatsApp.apk";
|
||||||
|
url =
|
||||||
|
"https://scontent.whatsapp.net/v/t61/69881048_788414318339970_5200101795019358208_n.apk/WhatsApp.apk?_nc_ohc=KuY9gcFeMBEAX_CssFG&_nc_ht=scontent.whatsapp.net&oh=ccfa509a03cd16f148e62b2ee5aa47cc&oe=5E3F4CBC";
|
||||||
|
sha256 = "1gc4lilpf2gaa61hbqiafnhqy3xvcnvjr6bmyb59cmmx8b4zmql1";
|
||||||
|
};
|
||||||
|
platformVersion = "18";
|
||||||
|
abiVersion = "x86";
|
||||||
|
|
||||||
|
package = "com.whatsapp";
|
||||||
|
activity = ".HomeActivity";
|
||||||
|
|
||||||
|
avdHomeDir = "/var/lib/whatsapp";
|
||||||
|
}
|
||||||
|
}/bin/run-test-emulator
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
systemd.services.mautrix-whatsapp = {
|
||||||
|
description = "A bridge between whatsapp and matrix";
|
||||||
|
path = with pkgs; [ coreutils mautrix-whatsapp ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
requires = [
|
||||||
|
"matrix-synapse.service"
|
||||||
|
"whatsapp-vm.service"
|
||||||
|
"network-online.target"
|
||||||
|
];
|
||||||
|
serviceConfig = {
|
||||||
|
Restart = "always";
|
||||||
|
RestartSec = 1;
|
||||||
|
};
|
||||||
|
script = ''
|
||||||
|
mkdir -p /var/lib/mautrix-whatsapp
|
||||||
|
cd /var/lib/mautrix-whatsapp
|
||||||
|
sleep 5
|
||||||
|
timeout 900 mautrix-whatsapp -c ${
|
||||||
|
builtins.toFile "config_wa.yaml"
|
||||||
|
(builtins.toJSON config.secrets.matrix.mautrix-whatsapp.config)
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
systemd.services.mautrix-telegram = {
|
||||||
|
description = "A bridge between telegram and matrix";
|
||||||
|
requires = [ "matrix-synapse.service" "openvpn-client.service" ];
|
||||||
|
path = with pkgs; [ coreutils mautrix-telegram ];
|
||||||
|
serviceConfig = {
|
||||||
|
Restart = "always";
|
||||||
|
RestartSec = 1;
|
||||||
|
};
|
||||||
|
wantedBy = [ "network-online.target" ];
|
||||||
|
script = ''
|
||||||
|
mkdir -p /var/lib/mautrix-telegram
|
||||||
|
cp -r ${pkgs.mautrix-telegram}/* /var/lib/mautrix-telegram
|
||||||
|
cd /var/lib/mautrix-telegram
|
||||||
|
alembic upgrade head || echo "update failed"
|
||||||
|
sleep 5
|
||||||
|
cp ${
|
||||||
|
builtins.toFile "config.yaml"
|
||||||
|
(builtins.toJSON config.secrets.matrix.mautrix-telegram.config)
|
||||||
|
} ./config.yaml
|
||||||
|
timeout 900 mautrix-telegram
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
users.users.matrix-synapse.name = lib.mkForce "matrix-synapse";
|
||||||
|
}
|
14
modules/mpd-mpris.patch
Normal file
14
modules/mpd-mpris.patch
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
diff --git a/mpd/file.go b/mpd/file.go
|
||||||
|
index 340338e..b0d6634 100644
|
||||||
|
--- a/mpd/file.go
|
||||||
|
+++ b/mpd/file.go
|
||||||
|
@@ -67,6 +67,9 @@ func FileFromAttrs(attr mpd.Attrs) (s File, err error) {
|
||||||
|
// metadata field
|
||||||
|
durationF := 0.0
|
||||||
|
p.Float("duration", &durationF, true)
|
||||||
|
+ if durationF == 0.0 {
|
||||||
|
+ p.Float("Time", &durationF, true)
|
||||||
|
+ }
|
||||||
|
s.Duration = time.Duration(durationF * float64(time.Second))
|
||||||
|
|
||||||
|
err = p.Err
|
27
modules/network.nix
Normal file
27
modules/network.nix
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{ pkgs, lib, config, ... }: {
|
||||||
|
networking = {
|
||||||
|
networkmanager.enable = true;
|
||||||
|
firewall = {
|
||||||
|
enable = true;
|
||||||
|
allowedTCPPorts = [ 13748 13722 5000 22 80 443 ];
|
||||||
|
allowedTCPPortRanges = [{
|
||||||
|
from = 1714;
|
||||||
|
to = 1764;
|
||||||
|
}];
|
||||||
|
allowedUDPPortRanges = [{
|
||||||
|
from = 1714;
|
||||||
|
to = 1764;
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
resolvconf.extraConfig = ''
|
||||||
|
local_nameservers=""
|
||||||
|
name_server_blacklist="0.0.0.0 127.0.0.1"
|
||||||
|
resolv_conf_local_only=NO
|
||||||
|
'';
|
||||||
|
usePredictableInterfaceNames = false;
|
||||||
|
hostName = config.device;
|
||||||
|
};
|
||||||
|
systemd.services.ModemManager.wantedBy =
|
||||||
|
lib.optional (config.device == "ThinkPad-Laptop") "network.target";
|
||||||
|
|
||||||
|
}
|
30
modules/nginx.nix
Normal file
30
modules/nginx.nix
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
{ pkgs, config, lib, ... }: {
|
||||||
|
services.nginx = {
|
||||||
|
enable = true;
|
||||||
|
appendHttpConfig = "charset utf-8;";
|
||||||
|
virtualHosts = let
|
||||||
|
default = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
"balsoft.ru" = {
|
||||||
|
locations."/" = { root = "/var/lib/balsoft.ru"; index = "index.txt"; };
|
||||||
|
enableACME = true;
|
||||||
|
addSSL = true;
|
||||||
|
};
|
||||||
|
"cache.balsoft.ru" = {
|
||||||
|
locations."/" = { proxyPass = "http://localhost:5000"; };
|
||||||
|
} // default;
|
||||||
|
"matrix.balsoft.ru" = {
|
||||||
|
locations."/" = { proxyPass = "https://localhost:13748"; };
|
||||||
|
} // default;
|
||||||
|
"mai.balsoft.ru" = {
|
||||||
|
locations."/" = { root = "/var/lib/important"; };
|
||||||
|
} // default;
|
||||||
|
"share.balsoft.ru" = {
|
||||||
|
locations."/" = { root = "/var/lib/share"; };
|
||||||
|
} // default;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
92
modules/openvpn.nix
Normal file
92
modules/openvpn.nix
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
{
|
||||||
|
services.openvpn = {
|
||||||
|
servers = {
|
||||||
|
client = {
|
||||||
|
config = ''
|
||||||
|
proto tcp-client
|
||||||
|
|
||||||
|
|
||||||
|
remote cz2.getstaticip.com 443 # non-stadard port for OpenVPN
|
||||||
|
dev tun
|
||||||
|
|
||||||
|
nobind
|
||||||
|
persist-key
|
||||||
|
|
||||||
|
tls-client
|
||||||
|
remote-cert-tls server
|
||||||
|
#uncomment following line and comment verify-x509-name line if older OpenVPN version is installed on your device
|
||||||
|
#tls-remote eu3.finevpn.com
|
||||||
|
verify-x509-name eu3.finevpn.com name
|
||||||
|
|
||||||
|
verb 3
|
||||||
|
|
||||||
|
cipher AES-256-CBC
|
||||||
|
auth SHA1
|
||||||
|
pull
|
||||||
|
|
||||||
|
auth-user-pass
|
||||||
|
|
||||||
|
#if connection is terminated, it will attempt to connect without promting username and pass
|
||||||
|
auth-retry nointeract
|
||||||
|
|
||||||
|
# redirect-gateway def1
|
||||||
|
#dhcp-option DNS 8.8.8.8
|
||||||
|
#dhcp-option DNS 8.8.4.4
|
||||||
|
|
||||||
|
route 149.154.160.0 255.255.240.0
|
||||||
|
route 149.154.164.0 255.255.252.0
|
||||||
|
route 91.108.4.0 255.255.252.0
|
||||||
|
route 91.108.56.0 255.255.252.0
|
||||||
|
route 91.108.8.0 255.255.252.0
|
||||||
|
|
||||||
|
<ca>
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIEyzCCA7OgAwIBAgIJAKPYkg7opAaCMA0GCSqGSIb3DQEBCwUAMIGaMQswCQYD
|
||||||
|
VQQGEwJDWjEVMBMGA1UECBMMVXN0ZWNreSBLcmFqMRcwFQYDVQQHEw5Vc3RpIG5h
|
||||||
|
ZCBMYWJlbTEUMBIGA1UEChMLRmluZVZQTi5jb20xCzAJBgNVBAsTAklUMRcwFQYD
|
||||||
|
VQQDEw5GaW5lVlBOLmNvbSBDQTEfMB0GCSqGSIb3DQEJARYQaW5mb0BmaW5ldnBu
|
||||||
|
LmNvbTAeFw0xODAyMjYxMjIzMzVaFw0yODAyMjQxMjIzMzVaMIGaMQswCQYDVQQG
|
||||||
|
EwJDWjEVMBMGA1UECBMMVXN0ZWNreSBLcmFqMRcwFQYDVQQHEw5Vc3RpIG5hZCBM
|
||||||
|
YWJlbTEUMBIGA1UEChMLRmluZVZQTi5jb20xCzAJBgNVBAsTAklUMRcwFQYDVQQD
|
||||||
|
Ew5GaW5lVlBOLmNvbSBDQTEfMB0GCSqGSIb3DQEJARYQaW5mb0BmaW5ldnBuLmNv
|
||||||
|
bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALyWG6suxMedT1coO5Gc
|
||||||
|
F/lTCARRK3vh6I5HWb9Rhbxq0fkxHn8vp3haHX2uJXf/udv7wR43Z+1p+nhdwGMD
|
||||||
|
5rNUVf7AqSYAWprWI4GB5twuYQnh+Iqoj+T527WlYG0kEl47W0Yk/8EortcQtCg7
|
||||||
|
yvM4+CF5LC9Kfy1rWGtcxWohYSw4KrDRbL8EVE7cJSGC/Mxphkfe3Vwop+Moa9ww
|
||||||
|
b9USOocxHzI2hGq9M0hNtXUcMxwzhNVek+4JEKTm5cf28X0DIPvVOLRFbUBHAYXA
|
||||||
|
L0/WqkZiW8A56h6Agwg8dgm7n9qsHY51A36Es5X05QVaL0XCJ7pVDQzDkkejTZpZ
|
||||||
|
cl8CAwEAAaOCARAwggEMMB0GA1UdDgQWBBTb+GbEL1EZefoHABF/VZsw5UGy6zCB
|
||||||
|
zwYDVR0jBIHHMIHEgBTb+GbEL1EZefoHABF/VZsw5UGy66GBoKSBnTCBmjELMAkG
|
||||||
|
A1UEBhMCQ1oxFTATBgNVBAgTDFVzdGVja3kgS3JhajEXMBUGA1UEBxMOVXN0aSBu
|
||||||
|
YWQgTGFiZW0xFDASBgNVBAoTC0ZpbmVWUE4uY29tMQswCQYDVQQLEwJJVDEXMBUG
|
||||||
|
A1UEAxMORmluZVZQTi5jb20gQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9AZmluZXZw
|
||||||
|
bi5jb22CCQCj2JIO6KQGgjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkq
|
||||||
|
hkiG9w0BAQsFAAOCAQEANZNy+OEKNoAFNo0TjBCCyaXL6Pr3rD++I8C2X6QtGY1E
|
||||||
|
+754H3h4/vfSDMZFT8QvVrfOXnYrN+anjM5wGXLuYlECZ69zaINdkA5NCjoFSnhG
|
||||||
|
EnArMcDeOfuCJJEIN9hsILvRdS+WW/UrMjF/minrACAAnwQInB0AVXinglzqvnYf
|
||||||
|
WOogFS9WvQeNn+moWzEkpBipdpXn7flgrPQsU29kK8HEI3bek2YRJoCjhe5S3rGB
|
||||||
|
73mS0NORGcpDwlUuQeU54Qtl9i/cs6PrbGia9AvrKcHipLJC9dTq1mMKvmEupDBm
|
||||||
|
DtHIEdmbuqGBHTJvKERSSdPiqfwUP11hfXyCfoty5g==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
</ca>
|
||||||
|
|
||||||
|
'';
|
||||||
|
up = ''
|
||||||
|
ip route delete 0.0.0.0/1
|
||||||
|
ip route delete 128.0.0.0/1
|
||||||
|
|
||||||
|
ip route add table 42 default via 93.190.51.91
|
||||||
|
# When we recieve traffic from our VPN ip, reply to it there
|
||||||
|
ip rule add from 93.190.51.91 table 42
|
||||||
|
# Also send all smtp traffic via VPN ip
|
||||||
|
ip rule add dport 25 table 42
|
||||||
|
ip rule add dport 465 table 42
|
||||||
|
ip rule add dport 587 table 42
|
||||||
|
'';
|
||||||
|
authUserPass.username = config.secrets.openvpn.user;
|
||||||
|
authUserPass.password = config.secrets.openvpn.password;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
193
modules/packages.nix
Normal file
193
modules/packages.nix
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
let
|
||||||
|
imports = import ../nix/sources.nix;
|
||||||
|
new = import imports.nixpkgs-unstable { config.allowUnfree = true; };
|
||||||
|
filterGit =
|
||||||
|
builtins.filterSource (type: name: name != ".git" || type != "directory");
|
||||||
|
old = import imports.nixpkgs-old { };
|
||||||
|
in { pkgs, config, lib, ... }: {
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(self: super:
|
||||||
|
rec {
|
||||||
|
inherit imports;
|
||||||
|
|
||||||
|
unstable = new;
|
||||||
|
|
||||||
|
nur = (import imports.NUR { pkgs = old; }).repos;
|
||||||
|
|
||||||
|
inherit (nur.balsoft.pkgs) termNote lambda-launcher nix-patch;
|
||||||
|
|
||||||
|
nixfmt = self.callPackage imports.nixfmt { };
|
||||||
|
|
||||||
|
inherit (import imports.niv { }) niv;
|
||||||
|
|
||||||
|
all-hies = import imports.all-hies { };
|
||||||
|
|
||||||
|
firefox-wayland = old.firefox-wayland.overrideAttrs (oa: {
|
||||||
|
meta = oa.meta // { platforms = [ "x86_64-linux" ]; };
|
||||||
|
});
|
||||||
|
|
||||||
|
yt-utilities =
|
||||||
|
import (self.fetchgit config.secrets.yt-utilities.source) { };
|
||||||
|
|
||||||
|
mtxclient = super.mtxclient.overrideAttrs (oa: rec {
|
||||||
|
name = "${pname}-${version}";
|
||||||
|
buildInputs = with self; [
|
||||||
|
boost170
|
||||||
|
nlohmann_json
|
||||||
|
openssl
|
||||||
|
zlib
|
||||||
|
libsodium
|
||||||
|
olm
|
||||||
|
];
|
||||||
|
pname = "mtxclient";
|
||||||
|
cmakeFlags = oa.cmakeFlags ++ [
|
||||||
|
"-DBoost_NO_BOOST_CMAKE=ON"
|
||||||
|
"-DBoost_LIBRARY_DIR_RELEASE=${pkgs.boost170}"
|
||||||
|
];
|
||||||
|
version = "0.3.0";
|
||||||
|
src = imports.mtxclient;
|
||||||
|
});
|
||||||
|
|
||||||
|
nheko = super.nheko.overrideAttrs (oa: rec {
|
||||||
|
name = "${pname}-${version}";
|
||||||
|
buildInputs = with self; [
|
||||||
|
nlohmann_json
|
||||||
|
qt5.qtquickcontrols2
|
||||||
|
mtxclient
|
||||||
|
olm
|
||||||
|
boost170
|
||||||
|
lmdb
|
||||||
|
spdlog
|
||||||
|
cmark
|
||||||
|
qt5.qtbase
|
||||||
|
qt5.qtmultimedia
|
||||||
|
qt5.qttools
|
||||||
|
qt5.qtgraphicaleffects
|
||||||
|
];
|
||||||
|
cmakeFlags = oa.cmakeFlags ++ [
|
||||||
|
"-DBUILD_SHARED_LIBS=ON"
|
||||||
|
"-DBoost_NO_BOOST_CMAKE=ON"
|
||||||
|
"-DBoost_LIBRARY_DIR_RELEASE=${pkgs.boost170}"
|
||||||
|
];
|
||||||
|
pname = "nheko";
|
||||||
|
version = "0.7.0";
|
||||||
|
src = imports.nheko;
|
||||||
|
});
|
||||||
|
|
||||||
|
sway-unwrapped = (new.sway-unwrapped.override { wlroots = wlroots'; }).overrideAttrs
|
||||||
|
(oa: rec {
|
||||||
|
name = "${pname}-${version}";
|
||||||
|
pname = "sway";
|
||||||
|
version = "master";
|
||||||
|
patches = [ ];
|
||||||
|
src = imports.sway;
|
||||||
|
});
|
||||||
|
|
||||||
|
wlroots' = new.wlroots.overrideAttrs (oa: rec {
|
||||||
|
name = "${pname}-${version}";
|
||||||
|
outputs = [ "out" ];
|
||||||
|
postFixup = "true";
|
||||||
|
postInstall = "true";
|
||||||
|
pname = "wlroots";
|
||||||
|
patches = [ ];
|
||||||
|
version = "master";
|
||||||
|
src = imports.wlroots;
|
||||||
|
});
|
||||||
|
|
||||||
|
wl-clipboard = new.wl-clipboard.overrideAttrs (oa: rec {
|
||||||
|
name = "${pname}-${version}";
|
||||||
|
pname = "wl-clipboard";
|
||||||
|
version = "master";
|
||||||
|
src = imports.wl-clipboard;
|
||||||
|
});
|
||||||
|
|
||||||
|
inherit (new) kanshi mautrix-whatsapp;
|
||||||
|
|
||||||
|
nerdfonts = nur.balsoft.pkgs.roboto-mono-nerd;
|
||||||
|
|
||||||
|
mopidy = super.mopidy.overridePythonAttrs (oa: {
|
||||||
|
src = imports.mopidy;
|
||||||
|
propagatedBuildInputs = with self.pythonPackages; [
|
||||||
|
gst-python
|
||||||
|
pygobject3
|
||||||
|
pykka2
|
||||||
|
tornado_4
|
||||||
|
requests
|
||||||
|
setuptools
|
||||||
|
dbus-python
|
||||||
|
protobuf
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
mopidy-youtube = super.mopidy-youtube.overridePythonAttrs (oa: {
|
||||||
|
propagatedBuildInputs = oa.propagatedBuildInputs
|
||||||
|
++ (with self.pythonPackages; [ cachetools requests-cache ]);
|
||||||
|
src = imports.mopidy-youtube;
|
||||||
|
});
|
||||||
|
mopidy-gmusic = super.mopidy-gmusic.overridePythonAttrs (oa: {
|
||||||
|
propagatedBuildInputs = oa.propagatedBuildInputs ++ [ self.pythonPackages.protobuf ];
|
||||||
|
});
|
||||||
|
mpd-mpris = super.mpd-mpris.overrideAttrs (oa: {
|
||||||
|
patches = [ ./mpd-mpris.patch ];
|
||||||
|
});
|
||||||
|
|
||||||
|
mautrix-telegram = old.mautrix-telegram;
|
||||||
|
|
||||||
|
pythonPackages = super.pythonPackages.override {
|
||||||
|
overrides = (self: super: {
|
||||||
|
pykka2 = super.pykka.overridePythonAttrs (oa: {
|
||||||
|
src = imports.pykka;
|
||||||
|
version = "2.0.1";
|
||||||
|
name = "pykka-2.0.1";
|
||||||
|
});
|
||||||
|
backports_functools_lru_cache =
|
||||||
|
super.backports_functools_lru_cache.overrideAttrs
|
||||||
|
(oldAttrs: oldAttrs // { meta.priority = 1000; });
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ebtables = old.ebtables;
|
||||||
|
} // (if config.device == "Prestigio-Laptop" then {
|
||||||
|
grub2 = super.pkgsi686Linux.grub2;
|
||||||
|
} else
|
||||||
|
{ }))
|
||||||
|
];
|
||||||
|
nixpkgs.pkgs = import imports.nixpkgs {
|
||||||
|
config.allowUnfree = true;
|
||||||
|
config.android_sdk.accept_license = true;
|
||||||
|
config.firefox.enablePlasmaBrowserIntegration = true;
|
||||||
|
} // config.nixpkgs.config;
|
||||||
|
|
||||||
|
systemd.services.setup_root = {
|
||||||
|
serviceConfig.User = "root";
|
||||||
|
script = ''
|
||||||
|
mkdir -p /root/.ssh
|
||||||
|
cat << EOF > /root/.ssh/id_rsa
|
||||||
|
${config.secrets.id_rsa}
|
||||||
|
EOF
|
||||||
|
chmod 100 /root/.ssh/id_rsa
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
environment.etc.nixpkgs.source = imports.nixpkgs;
|
||||||
|
nix = rec {
|
||||||
|
nixPath = lib.mkForce [
|
||||||
|
"nixpkgs=/etc/nixpkgs"
|
||||||
|
"nixos-config=/etc/nixos/configuration.nix"
|
||||||
|
];
|
||||||
|
binaryCaches = [
|
||||||
|
"https://cache.nixos.org"
|
||||||
|
"https://all-hies.cachix.org"
|
||||||
|
"https://cache.balsoft.ru"
|
||||||
|
];
|
||||||
|
|
||||||
|
trustedUsers = [ "root" "balsoft" "@wheel" ];
|
||||||
|
|
||||||
|
optimise.automatic = true;
|
||||||
|
|
||||||
|
binaryCachePublicKeys = [
|
||||||
|
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
|
||||||
|
"all-hies.cachix.org-1:JjrzAOEUsD9ZMt8fdFbzo3jNAyEWlPAwdVuHw4RD43k="
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
55
modules/power.nix
Normal file
55
modules/power.nix
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
|
||||||
|
with rec {
|
||||||
|
inherit (config) device devices deviceSpecific;
|
||||||
|
};
|
||||||
|
with deviceSpecific; {
|
||||||
|
services.udev.extraRules = if isLaptop then
|
||||||
|
''
|
||||||
|
ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/scheduler}="bfq"
|
||||||
|
ACTION=="change", SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="${
|
||||||
|
pkgs.systemd
|
||||||
|
}/bin/systemctl start battery"
|
||||||
|
ACTION=="change", SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="${
|
||||||
|
pkgs.systemd
|
||||||
|
}/bin/systemctl start ac"
|
||||||
|
ACTION=="add|change", SUBSYSTEM=="backlight", MODE:="0777"
|
||||||
|
'' + (if device == "ASUS-Laptop" then ''
|
||||||
|
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="wlan*" RUN+="${
|
||||||
|
pkgs.iw
|
||||||
|
}/bin/iw dev %k set power_save off"
|
||||||
|
'' else
|
||||||
|
"")
|
||||||
|
else
|
||||||
|
"";
|
||||||
|
systemd.services.battery = {
|
||||||
|
enable = isLaptop;
|
||||||
|
description = "Executes commands needed on battery power";
|
||||||
|
script = ''
|
||||||
|
${
|
||||||
|
pkgs.linuxPackages_latest.cpupower
|
||||||
|
}/bin/cpupower frequency-set -g powersave
|
||||||
|
${pkgs.hdparm}/bin/hdparm -B 1 /dev/sda
|
||||||
|
echo "500" > /sys/class/backlight/*/brightness
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
systemd.services.ac = {
|
||||||
|
enable = isLaptop;
|
||||||
|
description = "Executes commands needed on ac power";
|
||||||
|
script = ''
|
||||||
|
${
|
||||||
|
pkgs.linuxPackages_latest.cpupower
|
||||||
|
}/bin/cpupower frequency-set -g performance
|
||||||
|
${pkgs.hdparm}/bin/hdparm -B 255 /dev/sda
|
||||||
|
echo "900" > /sys/class/backlight/*/brightness
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
systemd.services.leds_setup = {
|
||||||
|
enable = (device == "ASUS-Laptop");
|
||||||
|
description = "Set up leds triggers";
|
||||||
|
wantedBy = ["multi-user.target"];
|
||||||
|
script = ''
|
||||||
|
echo "phy0rx" > /sys/class/leds/asus-wireless\:\:airplane/trigger
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
102
modules/secrets.nix
Executable file
102
modules/secrets.nix
Executable file
@ -0,0 +1,102 @@
|
|||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
with lib;
|
||||||
|
with types;
|
||||||
|
let
|
||||||
|
secret = description:
|
||||||
|
mkOption {
|
||||||
|
inherit description;
|
||||||
|
type = nullOr str;
|
||||||
|
};
|
||||||
|
mkCredOption = service: extra:
|
||||||
|
mkOption {
|
||||||
|
description = "Credentials for ${service}";
|
||||||
|
type = nullOr (submodule {
|
||||||
|
options = {
|
||||||
|
user = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "Username for ${service}";
|
||||||
|
};
|
||||||
|
password = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "Password for ${service}";
|
||||||
|
};
|
||||||
|
} // extra;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
in rec {
|
||||||
|
options.secrets = {
|
||||||
|
owm-key = secret "OpenWeatherMap key";
|
||||||
|
irc = mkCredOption "IRC (konversation)" { };
|
||||||
|
slack-term = mkOption { type = str; };
|
||||||
|
yt-utilities = {
|
||||||
|
user = secret "youtrack user";
|
||||||
|
url = secret "youtrack url";
|
||||||
|
token = secret "youtrack token";
|
||||||
|
source = {
|
||||||
|
url = secret "A url to yt-utilities source";
|
||||||
|
rev = secret "revision";
|
||||||
|
sha256 = secret "sha256";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
wage = secret "wage (sum CURRENCY/TIME, like 10EUR/h)";
|
||||||
|
gcal = {
|
||||||
|
email = mkOption { type = lib.types.str; };
|
||||||
|
client-id = mkOption { type = lib.types.str; };
|
||||||
|
client-secret = mkOption { type = lib.types.str; };
|
||||||
|
refresh-token = mkOption { type = lib.types.str; };
|
||||||
|
};
|
||||||
|
mail = mkCredOption "email" {
|
||||||
|
host = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "Mail server";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
gpmusic = mkCredOption "Google Play Music (mopidy)" {
|
||||||
|
deviceid = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "Android device ID";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
openvpn = mkCredOption "openvpn" {};
|
||||||
|
rclone = mkOption {
|
||||||
|
type = nullOr str;
|
||||||
|
description = "Rclone config";
|
||||||
|
};
|
||||||
|
id_rsa = mkOption {
|
||||||
|
type = nullOr str;
|
||||||
|
description = "SSH RSA private key";
|
||||||
|
};
|
||||||
|
ssl = rec {
|
||||||
|
cert = mkOption {
|
||||||
|
type = nullOr str;
|
||||||
|
description = "SSL certificate";
|
||||||
|
};
|
||||||
|
priv = mkOption {
|
||||||
|
type = nullOr str;
|
||||||
|
description = "SSL RSA private key";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
matrix = mkCredOption "matrix" rec {
|
||||||
|
shared_secret = mkOption {
|
||||||
|
type = nullOr str;
|
||||||
|
description = "A shared secret for matrix instance";
|
||||||
|
};
|
||||||
|
mautrix-whatsapp = {
|
||||||
|
config = mkOption {
|
||||||
|
type = attrs;
|
||||||
|
};
|
||||||
|
registration = mkOption {
|
||||||
|
type = attrs;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
mautrix-telegram = mautrix-whatsapp;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config = let
|
||||||
|
secretnix = import ../secret.nix;
|
||||||
|
secrets = if isNull secretnix then
|
||||||
|
mapAttrs (n: v: null) options.secrets
|
||||||
|
else
|
||||||
|
secretnix;
|
||||||
|
in { inherit secrets; };
|
||||||
|
}
|
43
modules/services.nix
Normal file
43
modules/services.nix
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
{ config, lib, pkgs, ... }: {
|
||||||
|
|
||||||
|
services.acpid.enable = true;
|
||||||
|
programs.ssh.startAgent = true;
|
||||||
|
|
||||||
|
services.apcupsd = { enable = config.device == "AMD-Workstation"; };
|
||||||
|
|
||||||
|
services.earlyoom = {
|
||||||
|
enable = config.devices.${config.device}.ram < 16;
|
||||||
|
freeMemThreshold = 5;
|
||||||
|
freeSwapThreshold = 100;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.printing = {
|
||||||
|
enable = true;
|
||||||
|
drivers = [ pkgs.gutenprint ];
|
||||||
|
};
|
||||||
|
programs.dconf.enable = true;
|
||||||
|
|
||||||
|
services.tor = {
|
||||||
|
enable = true;
|
||||||
|
client.enable = true;
|
||||||
|
client.privoxy.enable = true;
|
||||||
|
torsocks.enable = true;
|
||||||
|
client.socksListenAddressFaster = "127.0.0.1:9063";
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.mosh.enable = true;
|
||||||
|
|
||||||
|
services.fwupd.enable = true;
|
||||||
|
|
||||||
|
services.avahi.enable = true;
|
||||||
|
|
||||||
|
systemd.services.systemd-udev-settle.enable = false;
|
||||||
|
|
||||||
|
services.nix-serve.enable = config.device == "AMD-Workstation";
|
||||||
|
|
||||||
|
services.upower.enable = true;
|
||||||
|
virtualisation.docker.enable = config.deviceSpecific.isHost;
|
||||||
|
virtualisation.libvirtd = {
|
||||||
|
enable = config.deviceSpecific.isHost;
|
||||||
|
};
|
||||||
|
}
|
84
modules/themes.nix
Executable file
84
modules/themes.nix
Executable file
@ -0,0 +1,84 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
colorType = types.str;
|
||||||
|
color = (name:
|
||||||
|
(mkOption {
|
||||||
|
description = "${name} color of palette";
|
||||||
|
type = colorType;
|
||||||
|
}));
|
||||||
|
fromBase16 = { base00, base01, base02, base03, base04, base05, base06, base07
|
||||||
|
, base08, base09, base0A, base0B, base0C, base0D, base0E, base0F, ... }:
|
||||||
|
builtins.mapAttrs (_: v: "#" + v) {
|
||||||
|
bg = base00;
|
||||||
|
fg = base07;
|
||||||
|
|
||||||
|
gray = base03;
|
||||||
|
alt = base02;
|
||||||
|
dark = base01;
|
||||||
|
|
||||||
|
red = base08;
|
||||||
|
orange = base09;
|
||||||
|
yellow = base0A;
|
||||||
|
green = base0B;
|
||||||
|
cyan = base0C;
|
||||||
|
blue = base0D;
|
||||||
|
purple = base0E;
|
||||||
|
};
|
||||||
|
|
||||||
|
fromYAML = yaml:
|
||||||
|
builtins.fromJSON (builtins.readFile (pkgs.stdenv.mkDerivation {
|
||||||
|
name = "fromYAML";
|
||||||
|
phases = [ "buildPhase" ];
|
||||||
|
buildPhase = "echo '${yaml}' | ${pkgs.yaml2json}/bin/yaml2json > $out";
|
||||||
|
}));
|
||||||
|
in {
|
||||||
|
options = {
|
||||||
|
themes = {
|
||||||
|
colors = mkOption {
|
||||||
|
description =
|
||||||
|
"Set of colors from which the themes for various applications will be generated";
|
||||||
|
type = with types;
|
||||||
|
submodule {
|
||||||
|
options = {
|
||||||
|
bg = color "background";
|
||||||
|
fg = color "foreground";
|
||||||
|
gray = color "gray";
|
||||||
|
|
||||||
|
alt = color "alternative";
|
||||||
|
dark = color "darker";
|
||||||
|
|
||||||
|
blue = color "blue";
|
||||||
|
green = color "green";
|
||||||
|
red = color "red";
|
||||||
|
orange = color "orange";
|
||||||
|
yellow = color "yellow";
|
||||||
|
cyan = color "cyan";
|
||||||
|
purple = color "purple";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config = {
|
||||||
|
themes.colors = fromBase16 (fromYAML (builtins.readFile
|
||||||
|
"${pkgs.imports.base16-unclaimed-schemes}/irblack.yaml"));
|
||||||
|
# themes.colors = {
|
||||||
|
# bg = "#114c00";
|
||||||
|
# bg = "#000000";
|
||||||
|
# fg = "#ffffff";
|
||||||
|
#
|
||||||
|
# gray = "#9bb953";
|
||||||
|
# alt = "#27a6a2";
|
||||||
|
# dark = "#169300";
|
||||||
|
#
|
||||||
|
# red = "#d12d17";
|
||||||
|
# orange = "#cf7a02";
|
||||||
|
# yellow = "#386c34";
|
||||||
|
# green = "#386c34";
|
||||||
|
# cyan = "#09d0a5";
|
||||||
|
# blue = "#a5d048";
|
||||||
|
# purple = "#d083be";
|
||||||
|
# };
|
||||||
|
};
|
||||||
|
}
|
47
modules/users.nix
Normal file
47
modules/users.nix
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
{ config, pkgs, lib, ... }: {
|
||||||
|
security.apparmor.enable = true;
|
||||||
|
programs.firejail.enable = true;
|
||||||
|
users.mutableUsers = false;
|
||||||
|
users.users.balsoft = {
|
||||||
|
isNormalUser = true;
|
||||||
|
extraGroups = [
|
||||||
|
"sudo"
|
||||||
|
"wheel"
|
||||||
|
"networkmanager"
|
||||||
|
"disk"
|
||||||
|
"dbus"
|
||||||
|
"audio"
|
||||||
|
"docker"
|
||||||
|
"sound"
|
||||||
|
"pulse"
|
||||||
|
"adbusers"
|
||||||
|
"input"
|
||||||
|
"libvirtd"
|
||||||
|
"vboxusers"
|
||||||
|
"wireshark"
|
||||||
|
];
|
||||||
|
description = "Александр Бантьев";
|
||||||
|
uid = 1000;
|
||||||
|
password = "";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
systemd.services."user@" = {
|
||||||
|
serviceConfig = {
|
||||||
|
Restart = "always";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home-manager.users.balsoft.home.sessionVariables.XDG_RUNTIME_DIR = "/run/user/1000";
|
||||||
|
|
||||||
|
security.sudo = {
|
||||||
|
enable = true;
|
||||||
|
extraConfig = ''
|
||||||
|
balsoft ALL = (root) NOPASSWD: /run/current-system/sw/bin/nixos-rebuild switch
|
||||||
|
balsoft ALL = (root) NOPASSWD: ${pkgs.light}/bin/light -A 5
|
||||||
|
balsoft ALL = (root) NOPASSWD: ${pkgs.light}/bin/light -U 5
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
nix.requireSignedBinaryCaches = false;
|
||||||
|
home-manager.useUserPackages = true;
|
||||||
|
}
|
14
modules/workspace/autofs.nix
Normal file
14
modules/workspace/autofs.nix
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{ pkgs, config, lib, ... }: rec {
|
||||||
|
services.autofs.enable = true;
|
||||||
|
services.autofs.autoMaster = let
|
||||||
|
mapConf = pkgs.writeText "auto" (builtins.concatStringsSep "\n" (map (n:
|
||||||
|
"${n} -fstype=fuse,rw,nodev,noatime,allow_other,max_read=65536 :sshfs#balsoft@${n}:")
|
||||||
|
([ "balsoft.ru" ]
|
||||||
|
++ builtins.map (n: "${n}.lan") (builtins.attrNames config.devices))));
|
||||||
|
in ''
|
||||||
|
/auto file:${mapConf} uid=1000,gid=100,--timeout=30,--ghost
|
||||||
|
'';
|
||||||
|
environment.etc."autofs.conf".text = services.autofs.autoMaster;
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [ fuse sshfs ];
|
||||||
|
}
|
42
modules/workspace/autorandr.nix
Normal file
42
modules/workspace/autorandr.nix
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
{ pkgs, config, lib, ... }: {
|
||||||
|
home-manager.users.balsoft.xsession.windowManager.i3.config.startup = [{
|
||||||
|
command = "${pkgs.autorandr}/bin/autorandr -c --force --default horizontal";
|
||||||
|
always = true;
|
||||||
|
}];
|
||||||
|
home-manager.users.balsoft.xsession.windowManager.i3.config.keybindings."${
|
||||||
|
config.home-manager.users.balsoft.xsession.windowManager.i3.config.modifier
|
||||||
|
}+p" = "exec ${pkgs.autorandr}/bin/autorandr -c --default horizontal";
|
||||||
|
home-manager.users.balsoft.programs.autorandr = {
|
||||||
|
enable = true;
|
||||||
|
profiles = {
|
||||||
|
dacha = {
|
||||||
|
fingerprint = {
|
||||||
|
HDMI1 =
|
||||||
|
"00ffffffffffff0010ac14a0505441322e0f010380221b782ec5c6a3574a9c23124f54a54b00714f8180010101010101010101010101302a009851002a4030701300520e1100001e000000fd003c4b1f500e000a202020202020000000fc0044454c4c204531373646500a20000000ff004d43303433354248324154500a013a02031b61230907078301000067030c002000802d43908402e2000f8c0ad08a20e02d10103e9600a05a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029";
|
||||||
|
HDMI2 =
|
||||||
|
"00ffffffffffff0006b3cc24010101011a1a010380351e78ea0565a756529c270f5054afcf80714f8180818fb30081409500a9408bc0023a801871382d40582c45000f282100001e000000fd00304b1e5311000a202020202020000000fc00565a3234390a20202020202020000000ff0047364c4d52533034383636390a018902031df14a900403011412051f1013230907078301000065030c001000023a801871382d40582c45000f282100001e011d8018711c1620582c25000f282100009e011d007251d01e206e2855000f282100001e8c0ad08a20e02d10103e96000f282100001800000000000000000000000000000000000000000000000000004a";
|
||||||
|
eDP1 =
|
||||||
|
"00ffffffffffff000dae61130000000007180104a51d117802ce85a3574e9d2612505400000001010101010101010101010101010101363680a0703820402e1e240025a510000018242480a0703820402e1e240025a510000018000000fe00434d4e0a202020202020202020000000fe004e3133334853452d4541330a2000a1";
|
||||||
|
};
|
||||||
|
config = {
|
||||||
|
eDP1 = {
|
||||||
|
enable = true;
|
||||||
|
position = "0x1024";
|
||||||
|
mode = "1368x768";
|
||||||
|
};
|
||||||
|
HDMI1 = {
|
||||||
|
enable = true;
|
||||||
|
position = "0x0";
|
||||||
|
mode = "1280x1024";
|
||||||
|
};
|
||||||
|
HDMI2 = {
|
||||||
|
enable = true;
|
||||||
|
position = "1368x1024";
|
||||||
|
mode = "1920x1080";
|
||||||
|
primary = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
14
modules/workspace/compton.nix
Normal file
14
modules/workspace/compton.nix
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{ pkgs, lib, config, ... }: {
|
||||||
|
home-manager.users.balsoft = {
|
||||||
|
programs.autorandr.hooks.preswitch.compton = "systemctl --user stop compton";
|
||||||
|
programs.autorandr.hooks.postswitch.compton = "systemctl --user start compton";
|
||||||
|
services.compton = {
|
||||||
|
enable = true;
|
||||||
|
backend = "glx";
|
||||||
|
noDNDShadow = false;
|
||||||
|
shadow = true;
|
||||||
|
shadowExclude = [ "!(I3_FLOATING_WINDOW@:c = 1)" ];
|
||||||
|
vSync = "opengl-swc";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
50
modules/workspace/dunst.nix
Normal file
50
modules/workspace/dunst.nix
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
let thm = config.themes.colors;
|
||||||
|
|
||||||
|
in {
|
||||||
|
home-manager.users.balsoft = {
|
||||||
|
services.dunst = {
|
||||||
|
enable = true;
|
||||||
|
iconTheme = {
|
||||||
|
name = "Papirus-Dark";
|
||||||
|
package = pkgs.papirus-icon-theme;
|
||||||
|
};
|
||||||
|
settings = {
|
||||||
|
global = {
|
||||||
|
geometry = "500x5-30+50";
|
||||||
|
transparency = 10;
|
||||||
|
frame_color = thm.blue;
|
||||||
|
font = "Roboto 13";
|
||||||
|
padding = 15;
|
||||||
|
horizontal_padding = 17;
|
||||||
|
word_wrap = true;
|
||||||
|
follow = "keyboard";
|
||||||
|
format = ''
|
||||||
|
%s %p %I
|
||||||
|
%b'';
|
||||||
|
markup = "full";
|
||||||
|
};
|
||||||
|
|
||||||
|
urgency_low = {
|
||||||
|
background = thm.bg;
|
||||||
|
foreground = thm.fg;
|
||||||
|
timeout = 5;
|
||||||
|
};
|
||||||
|
|
||||||
|
urgency_normal = {
|
||||||
|
background = thm.alt;
|
||||||
|
foreground = thm.fg;
|
||||||
|
timeout = 10;
|
||||||
|
};
|
||||||
|
|
||||||
|
urgency_critical = {
|
||||||
|
background = thm.fg;
|
||||||
|
foreground = thm.bg;
|
||||||
|
timeout = 15;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
xsession.windowManager.i3.config.startup =
|
||||||
|
[{ command = "${pkgs.dunst}/bin/dunst"; }];
|
||||||
|
};
|
||||||
|
}
|
51
modules/workspace/email.nix
Normal file
51
modules/workspace/email.nix
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
{ pkgs, config, ... }: {
|
||||||
|
home-manager.users.balsoft = {
|
||||||
|
accounts.email.accounts."${config.secrets.gmail.user}@gmail.com" = {
|
||||||
|
address = "${config.secrets.gmail.user}@gmail.com";
|
||||||
|
flavor = "gmail.com";
|
||||||
|
passwordCommand = "${pkgs.coreutils}/bin/echo ${config.secrets.gmail.password}";
|
||||||
|
realName = "Alexander Bantyev";
|
||||||
|
primary = true;
|
||||||
|
userName = config.secrets.gmail.user;
|
||||||
|
getmail = {
|
||||||
|
readAll = false;
|
||||||
|
enable = true;
|
||||||
|
mailboxes = [ "INBOX" "Junk" "Trash" ];
|
||||||
|
};
|
||||||
|
msmtp = { enable = true; };
|
||||||
|
imapnotify = {
|
||||||
|
enable = true;
|
||||||
|
boxes = [ "INBOX" ];
|
||||||
|
onNotifyPost = "${pkgs.libnotify}/bin/notify-send 'New mail in %s'";
|
||||||
|
};
|
||||||
|
notmuch.enable = true;
|
||||||
|
signature = {
|
||||||
|
showSignature = "append";
|
||||||
|
text = ''
|
||||||
|
Александр Бантьев /Alexander Bantyev/ aka balsoft
|
||||||
|
|
||||||
|
Nix, NixOS DevOPS/SRE at serokell.io
|
||||||
|
|
||||||
|
<balsoft75@gmail.com>
|
||||||
|
<alexander.bantyev@serokell.io>
|
||||||
|
|
||||||
|
https://matrix.to/#/@balsoft:balsoft.ru
|
||||||
|
https://t.me/balsoft
|
||||||
|
https://github.com/balsoft
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
services = {
|
||||||
|
getmail = {
|
||||||
|
enable = true;
|
||||||
|
frequency = "*-*-* *:*:00,15,30,45";
|
||||||
|
};
|
||||||
|
imapnotify.enable = true;
|
||||||
|
};
|
||||||
|
programs = {
|
||||||
|
msmtp.enable = true;
|
||||||
|
notmuch.enable = true;
|
||||||
|
alot.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
26
modules/workspace/fonts.nix
Normal file
26
modules/workspace/fonts.nix
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{ pkgs, config, lib, ... }: {
|
||||||
|
fonts = {
|
||||||
|
fonts = with pkgs; [
|
||||||
|
terminus_font
|
||||||
|
opensans-ttf
|
||||||
|
roboto
|
||||||
|
roboto-mono
|
||||||
|
roboto-slab
|
||||||
|
nerdfonts
|
||||||
|
noto-fonts
|
||||||
|
noto-fonts-emoji
|
||||||
|
hasklig
|
||||||
|
material-design-icons
|
||||||
|
material-icons
|
||||||
|
];
|
||||||
|
fontconfig = {
|
||||||
|
enable = true;
|
||||||
|
defaultFonts = {
|
||||||
|
monospace = ["Roboto Mono 13"];
|
||||||
|
sansSerif = ["Roboto 13"];
|
||||||
|
serif = ["Roboto Slab 13"];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
enableDefaultFonts = true;
|
||||||
|
};
|
||||||
|
}
|
37
modules/workspace/gcalcli.nix
Normal file
37
modules/workspace/gcalcli.nix
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{ pkgs, lib, config, ... }: {
|
||||||
|
home-manager.users.balsoft = {
|
||||||
|
home.file.".gcalcli_oauth.home".text = lib.optionals
|
||||||
|
(!(isNull config.secrets.gcal)) (builtins.toJSON {
|
||||||
|
access_token = "";
|
||||||
|
client_id = config.secrets.gcal.client-id;
|
||||||
|
client_secret = config.secrets.gcal.client-secret;
|
||||||
|
refresh_token = config.secrets.gcal.refresh-token;
|
||||||
|
token_expiry = "2019-03-31T11:26:27Z";
|
||||||
|
token_uri = https://oauth2.googleapis.com/token;
|
||||||
|
user_agent = "gcalcli/v4.0.4";
|
||||||
|
revoke_uri = "https=//oauth2.googleapis.com/revoke";
|
||||||
|
id_token = null;
|
||||||
|
id_token_jwt = null;
|
||||||
|
token_response = {
|
||||||
|
access_token = "";
|
||||||
|
expires_in = 0;
|
||||||
|
scope =
|
||||||
|
"https=//www.googleapis.com/auth/urlshortener https=//www.googleapis.com/auth/calendar";
|
||||||
|
token_type = "Bearer";
|
||||||
|
};
|
||||||
|
scopes = [
|
||||||
|
"https=//www.googleapis.com/auth/calendar"
|
||||||
|
"https=//www.googleapis.com/auth/urlshortener"
|
||||||
|
];
|
||||||
|
token_info_uri = "https=//oauth2.googleapis.com/tokeninfo";
|
||||||
|
invalid = false;
|
||||||
|
_class = "OAuth2Credentials";
|
||||||
|
_module = "oauth2client.client";
|
||||||
|
});
|
||||||
|
home.activation.gcalcli = {
|
||||||
|
after = ["linkGeneration"];
|
||||||
|
before = [];
|
||||||
|
data = "cp .gcalcli_oauth.home .gcalcli_oauth";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
69
modules/workspace/gtk.nix
Normal file
69
modules/workspace/gtk.nix
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
let
|
||||||
|
thm = config.themes.colors;
|
||||||
|
thm' = builtins.mapAttrs (name: value: builtins.substring 1 7 value) thm;
|
||||||
|
materia_colors = pkgs.writeTextFile {
|
||||||
|
name = "gtk-generated-colors";
|
||||||
|
text = ''
|
||||||
|
BG=${thm'.bg}
|
||||||
|
FG=${thm'.fg}
|
||||||
|
BTN_BG=${thm'.bg}
|
||||||
|
BTN_FG=${thm'.fg}
|
||||||
|
MENU_BG=${thm'.bg}
|
||||||
|
MENU_FG=${thm'.fg}
|
||||||
|
ACCENT_BG=${thm'.blue}
|
||||||
|
SEL_BG=${thm'.blue}
|
||||||
|
SEL_FG=${thm'.bg}
|
||||||
|
TXT_BG=${thm'.bg}
|
||||||
|
TXT_FG=${thm'.fg}
|
||||||
|
HDR_BTN_BG=${thm'.bg}
|
||||||
|
HDR_BTN_FG=${thm'.fg}
|
||||||
|
WM_BORDER_FOCUS=${thm'.blue}
|
||||||
|
WM_BORDER_UNFOCUS=${thm'.alt}
|
||||||
|
MATERIA_STYLE_COMPACT=True
|
||||||
|
MATERIA_COLOR_VARIANT=dark
|
||||||
|
UNITY_DEFAULT_LAUNCHER_STYLE=False
|
||||||
|
NAME=generated
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
nixpkgs.overlays = [(self: super: {
|
||||||
|
generated-gtk-theme = self.stdenv.mkDerivation rec {
|
||||||
|
name = "generated-gtk-theme";
|
||||||
|
src = pkgs.imports.materia-theme;
|
||||||
|
buildInputs = with self; [ sassc bc which inkscape optipng ];
|
||||||
|
installPhase = ''
|
||||||
|
HOME=/build
|
||||||
|
chmod 777 -R .
|
||||||
|
patchShebangs .
|
||||||
|
mkdir -p $out/share/themes
|
||||||
|
substituteInPlace change_color.sh --replace "\$HOME/.themes" "$out/share/themes"
|
||||||
|
echo "Changing colours:"
|
||||||
|
./change_color.sh -o Generated ${materia_colors}
|
||||||
|
chmod 555 -R .
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
})];
|
||||||
|
home-manager.users.balsoft = {
|
||||||
|
home.packages = [pkgs.generated-gtk-theme];
|
||||||
|
gtk = {
|
||||||
|
enable = true;
|
||||||
|
iconTheme = {
|
||||||
|
name = "Papirus-Dark";
|
||||||
|
package = pkgs.papirus-icon-theme;
|
||||||
|
};
|
||||||
|
theme = {
|
||||||
|
name = "Generated";
|
||||||
|
package = pkgs.generated-gtk-theme;
|
||||||
|
};
|
||||||
|
font =
|
||||||
|
{
|
||||||
|
package = pkgs.roboto;
|
||||||
|
name = "Roboto 11";
|
||||||
|
};
|
||||||
|
gtk3.extraConfig.gtk-cursor-theme-name = "breeze";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
environment.sessionVariables.GTK_THEME = "Generated";
|
||||||
|
environment.sessionVariables.GDK_BACKEND = "x11";
|
||||||
|
}
|
208
modules/workspace/i3/default.nix
Executable file
208
modules/workspace/i3/default.nix
Executable file
@ -0,0 +1,208 @@
|
|||||||
|
{ pkgs, lib, config, ... }:
|
||||||
|
let
|
||||||
|
thm = config.themes.colors;
|
||||||
|
apps = config.defaultApplications;
|
||||||
|
in {
|
||||||
|
environment.sessionVariables._JAVA_AWT_WM_NONREPARENTING = "1";
|
||||||
|
|
||||||
|
home-manager.users.balsoft.xsession.windowManager.i3 = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.i3-gaps;
|
||||||
|
config = rec {
|
||||||
|
assigns = {
|
||||||
|
"" = [ { class = "Chromium"; } { app_id = "firefox"; } { class = "Firefox"; } ];
|
||||||
|
"" = [
|
||||||
|
{ app_id = "org.kde.trojita"; }
|
||||||
|
{ title = "balsoft : weechat.*"; }
|
||||||
|
{ title = "nheko"; }
|
||||||
|
{ title = "Slack"; }
|
||||||
|
];
|
||||||
|
"ﱘ" = [{ app_id = "cantata"; }];
|
||||||
|
};
|
||||||
|
fonts = [ "RobotoMono 9" ];
|
||||||
|
|
||||||
|
bars = [ ];
|
||||||
|
|
||||||
|
colors = rec {
|
||||||
|
background = thm.bg;
|
||||||
|
unfocused = {
|
||||||
|
text = thm.alt;
|
||||||
|
border = thm.dark;
|
||||||
|
background = thm.bg;
|
||||||
|
childBorder = thm.dark;
|
||||||
|
indicator = thm.fg;
|
||||||
|
};
|
||||||
|
focusedInactive = unfocused;
|
||||||
|
urgent = unfocused // {
|
||||||
|
text = thm.fg;
|
||||||
|
border = thm.orange;
|
||||||
|
childBorder = thm.orange;
|
||||||
|
};
|
||||||
|
focused = unfocused // {
|
||||||
|
childBorder = thm.blue;
|
||||||
|
border = thm.blue;
|
||||||
|
background = thm.dark;
|
||||||
|
text = thm.fg;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
gaps = {
|
||||||
|
inner = 6;
|
||||||
|
smartGaps = true;
|
||||||
|
smartBorders = "on";
|
||||||
|
};
|
||||||
|
focus.followMouse = false;
|
||||||
|
modifier = "Mod4";
|
||||||
|
window = {
|
||||||
|
border = 1;
|
||||||
|
titlebar = true;
|
||||||
|
commands = [
|
||||||
|
{
|
||||||
|
command = "border pixel 2px";
|
||||||
|
criteria = { window_role = "popup"; };
|
||||||
|
}
|
||||||
|
{
|
||||||
|
command = "floating enable";
|
||||||
|
criteria = { app_id = "org.kde.polkit-kde-authentication-1"; };
|
||||||
|
}
|
||||||
|
{
|
||||||
|
command = "sticky enable";
|
||||||
|
criteria = { floating = ""; };
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
startup = map (a: { notification = false; } // a) [
|
||||||
|
{ command = apps.browser.cmd; }
|
||||||
|
{ command = "${pkgs.kdeconnect}/libexec/kdeconnectd"; }
|
||||||
|
{
|
||||||
|
command =
|
||||||
|
"${pkgs.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
command =
|
||||||
|
"${pkgs.keepassxc}/bin/keepassxc /home/balsoft/projects/nixos-config/misc/Passwords.kdbx";
|
||||||
|
}
|
||||||
|
{ command = "${pkgs.trojita}/bin/trojita"; }
|
||||||
|
{ command = "${pkgs.termNote}/bin/noted"; }
|
||||||
|
{ command = "${pkgs.nheko}/bin/nheko"; }
|
||||||
|
{ command = "${pkgs.xorg.xrdb}/bin/xrdb -merge ~/.Xresources"; }
|
||||||
|
|
||||||
|
{ command = "${pkgs.cantata}/bin/cantata"; }
|
||||||
|
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
keybindings = let
|
||||||
|
script = name: content: "exec ${pkgs.writeScript name content}";
|
||||||
|
workspaces = (builtins.genList (x: [ (toString x) (toString x) ]) 10)
|
||||||
|
++ [ [ "c" "" ] [ "t" "" ] [ "m" "ﱘ" ] ];
|
||||||
|
moveMouse = ''
|
||||||
|
exec "sh -c 'eval `${pkgs.xdotool}/bin/xdotool \
|
||||||
|
getactivewindow \
|
||||||
|
getwindowgeometry --shell`; ${pkgs.xdotool}/bin/xdotool \
|
||||||
|
mousemove \
|
||||||
|
$((X+WIDTH/2)) $((Y+HEIGHT/2))'"'';
|
||||||
|
in ({
|
||||||
|
"${modifier}+q" = "kill";
|
||||||
|
"${modifier}+Return" = "exec ${apps.term.cmd}";
|
||||||
|
"${modifier}+e" = "exec ${apps.editor.cmd}";
|
||||||
|
"${modifier}+l" = "layout toggle all";
|
||||||
|
|
||||||
|
"${modifier}+Left" = "focus child; focus left; ${moveMouse}";
|
||||||
|
"${modifier}+Right" = "focus child; focus right; ${moveMouse}";
|
||||||
|
"${modifier}+Up" = "focus child; focus up; ${moveMouse}";
|
||||||
|
"${modifier}+Down" = "focus child; focus down; ${moveMouse}";
|
||||||
|
"${modifier}+Control+Left" = "focus parent; focus left; ${moveMouse}";
|
||||||
|
"${modifier}+Control+Right" = "focus parent; focus right; ${moveMouse}";
|
||||||
|
"${modifier}+Control+Up" = "focus parent; focus up; ${moveMouse}";
|
||||||
|
"${modifier}+Control+Down" = "focus parent; focus down; ${moveMouse}";
|
||||||
|
"${modifier}+Shift+Up" = "move up";
|
||||||
|
"${modifier}+Shift+Down" = "move down";
|
||||||
|
"${modifier}+Shift+Right" = "move right";
|
||||||
|
"${modifier}+Shift+Left" = "move left";
|
||||||
|
|
||||||
|
"${modifier}+a" = "focus child; focus left; ${moveMouse}";
|
||||||
|
"${modifier}+d" = "focus child; focus right; ${moveMouse}";
|
||||||
|
"${modifier}+w" = "focus child; focus up; ${moveMouse}";
|
||||||
|
"${modifier}+s" = "focus child; focus down; ${moveMouse}";
|
||||||
|
"${modifier}+Control+a" = "focus parent; focus left; ${moveMouse}";
|
||||||
|
"${modifier}+Control+d" = "focus parent; focus right; ${moveMouse}";
|
||||||
|
"${modifier}+Control+w" = "focus parent; focus up; ${moveMouse}";
|
||||||
|
"${modifier}+Control+s" = "focus parent; focus down; ${moveMouse}";
|
||||||
|
"${modifier}+Shift+w" = "move up";
|
||||||
|
"${modifier}+Shift+s" = "move down";
|
||||||
|
"${modifier}+Shift+d" = "move right";
|
||||||
|
"${modifier}+Shift+a" = "move left";
|
||||||
|
|
||||||
|
"${modifier}+f" = "fullscreen toggle; floating toggle";
|
||||||
|
"${modifier}+r" = "mode resize";
|
||||||
|
"${modifier}+Shift+f" = "floating toggle";
|
||||||
|
|
||||||
|
"${modifier}+j" = "focus mode_toggle";
|
||||||
|
"${modifier}+Escape" = "exec ${apps.monitor.cmd}";
|
||||||
|
|
||||||
|
"${modifier}+Print" = script "screenshot"
|
||||||
|
"${pkgs.grim}/bin/grim Pictures/$(date +'%Y-%m-%d+%H:%M:%S').png";
|
||||||
|
|
||||||
|
"${modifier}+Control+Print" = script "screenshot-copy"
|
||||||
|
"${pkgs.grim}/bin/grim - | ${pkgs.wl-clipboard}/bin/wl-copy";
|
||||||
|
|
||||||
|
"--release ${modifier}+Shift+Print" = script "screenshot-area" ''
|
||||||
|
${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)" Pictures/$(date +'%Y-%m-%d+%H:%M:%S').png'';
|
||||||
|
|
||||||
|
"--release ${modifier}+Control+Shift+Print" =
|
||||||
|
script "screenshot-area-copy" ''
|
||||||
|
${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)" - | ${pkgs.wl-clipboard}/bin/wl-copy'';
|
||||||
|
|
||||||
|
"${modifier}+x" = "move workspace to output right";
|
||||||
|
"${modifier}+k" = "exec '${pkgs.xorg.xkill}/bin/xkill'";
|
||||||
|
"${modifier}+F5" = "reload";
|
||||||
|
"${modifier}+Shift+F5" = "exit";
|
||||||
|
"${modifier}+Shift+h" = "layout splith";
|
||||||
|
"${modifier}+Shift+v" = "layout splitv";
|
||||||
|
"${modifier}+h" = "split h";
|
||||||
|
"${modifier}+v" = "split v";
|
||||||
|
"${modifier}+F1" = "move to scratchpad";
|
||||||
|
"${modifier}+F2" = "scratchpad show";
|
||||||
|
"${modifier}+F11" = "output * dpms off";
|
||||||
|
"${modifier}+F12" = "output * dpms on";
|
||||||
|
"${modifier}+p" = "sticky toggle";
|
||||||
|
"${modifier}+i" =
|
||||||
|
script "0x0" ''wl-paste | curl -F"file=@-" https://0x0.st | wl-copy'';
|
||||||
|
"${modifier}+b" = "focus mode_toggle";
|
||||||
|
"${modifier}+z" = script "lambda-launcher"
|
||||||
|
"${pkgs.lambda-launcher}/bin/lambda-launcher";
|
||||||
|
"XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
|
||||||
|
"XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next";
|
||||||
|
"XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous";
|
||||||
|
"button2" = "kill";
|
||||||
|
"--whole-window ${modifier}+button2" = "kill";
|
||||||
|
} // builtins.listToAttrs (builtins.map (x: {
|
||||||
|
name = "${modifier}+${builtins.elemAt x 0}";
|
||||||
|
value = "workspace ${builtins.elemAt x 1}";
|
||||||
|
}) workspaces) // builtins.listToAttrs (builtins.map (x: {
|
||||||
|
name = "${modifier}+Shift+${builtins.elemAt x 0}";
|
||||||
|
value = "move container to workspace ${builtins.elemAt x 1}";
|
||||||
|
}) workspaces));
|
||||||
|
keycodebindings = {
|
||||||
|
"122" = "exec ${pkgs.pamixer}/bin/pamixer -d 2";
|
||||||
|
"123" = "exec ${pkgs.pamixer}/bin/pamixer -i 2";
|
||||||
|
"121" = "exec ${pkgs.pamixer}/bin/pamixer -t";
|
||||||
|
};
|
||||||
|
workspaceLayout = "tabbed";
|
||||||
|
};
|
||||||
|
extraConfig = ''
|
||||||
|
output * bg ${thm.bg} solid_color
|
||||||
|
input 2:14:ETPS/2_Elantech_Touchpad {
|
||||||
|
tap enabled
|
||||||
|
natural_scroll enabled
|
||||||
|
dwt enabled
|
||||||
|
}
|
||||||
|
input 2:14:ETPS/2_Elantech_TrackPoint pointer_accel -0.7
|
||||||
|
default_border pixel 1
|
||||||
|
mouse_warping container
|
||||||
|
hide_edge_borders --i3 smart
|
||||||
|
exec pkill swaynag
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
54
modules/workspace/i3/workspace-layouts.pl
Executable file
54
modules/workspace/i3/workspace-layouts.pl
Executable file
@ -0,0 +1,54 @@
|
|||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#!nix-shell -p perlPackages.AnyEvent perlPackages.AnyEventI3 perl -i perl
|
||||||
|
# vim:ts=4:sw=4:expandtab
|
||||||
|
# © 2012 Michael Stapelberg
|
||||||
|
# Licensed under BSD license, see https://github.com/i3/i3/blob/next/LICENSE
|
||||||
|
#
|
||||||
|
# Append this line to your i3 config file:
|
||||||
|
# exec_always ~/per-workspace-layout.pl
|
||||||
|
#
|
||||||
|
# Then, change the %layouts hash like you want your workspaces to be set up.
|
||||||
|
# This script requires i3 >= v4.4 for the extended workspace event.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use AnyEvent;
|
||||||
|
use AnyEvent::I3;
|
||||||
|
use v5.10;
|
||||||
|
use utf8;
|
||||||
|
|
||||||
|
my %layouts = (
|
||||||
|
'' => 'tabbed',
|
||||||
|
'' => 'tabbed',
|
||||||
|
);
|
||||||
|
|
||||||
|
my $i3 = i3();
|
||||||
|
|
||||||
|
die "Could not connect to i3: $!" unless $i3->connect->recv();
|
||||||
|
|
||||||
|
die "Could not subscribe to the workspace event: $!" unless
|
||||||
|
$i3->subscribe({
|
||||||
|
workspace => sub {
|
||||||
|
my ($msg) = @_;
|
||||||
|
return unless $msg->{change} eq 'focus';
|
||||||
|
die "Your version of i3 is too old. You need >= v4.4"
|
||||||
|
unless exists($msg->{current});
|
||||||
|
my $ws = $msg->{current};
|
||||||
|
|
||||||
|
my $name = $ws->{name};
|
||||||
|
my $con_id = $ws->{id};
|
||||||
|
|
||||||
|
return unless exists $layouts{$name};
|
||||||
|
|
||||||
|
$i3->command(qq|[con_id="$con_id"] layout | . $layouts{$name});
|
||||||
|
},
|
||||||
|
_error => sub {
|
||||||
|
my ($msg) = @_;
|
||||||
|
say "AnyEvent::I3 error: $msg";
|
||||||
|
say "Exiting.";
|
||||||
|
exit 1;
|
||||||
|
},
|
||||||
|
})->recv->{success};
|
||||||
|
|
||||||
|
# Run forever.
|
||||||
|
AnyEvent->condvar->recv
|
61
modules/workspace/i3blocks/default.nix
Normal file
61
modules/workspace/i3blocks/default.nix
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
with import ../../../support.nix { inherit pkgs config lib; };
|
||||||
|
with lib;
|
||||||
|
let scripts = import ./scripts pkgs config;
|
||||||
|
in {
|
||||||
|
home-manager.users.balsoft.xsession.windowManager.i3.extraConfig = ''
|
||||||
|
bar {
|
||||||
|
id top
|
||||||
|
font pango:Material Icons 11, Roboto Mono 11
|
||||||
|
mode dock
|
||||||
|
hidden_state hide
|
||||||
|
position top
|
||||||
|
status_command ${pkgs.i3blocks}/bin/i3blocks
|
||||||
|
workspace_buttons yes
|
||||||
|
strip_workspace_numbers no
|
||||||
|
tray_output none
|
||||||
|
colors {
|
||||||
|
background ${config.themes.colors.bg}
|
||||||
|
statusline ${config.themes.colors.fg}
|
||||||
|
separator ${config.themes.colors.alt}
|
||||||
|
focused_workspace ${config.themes.colors.bg} ${config.themes.colors.bg} ${config.themes.colors.blue}
|
||||||
|
active_workspace ${config.themes.colors.bg} ${config.themes.colors.bg} ${config.themes.colors.green}
|
||||||
|
inactive_workspace ${config.themes.colors.bg} ${config.themes.colors.bg} ${config.themes.colors.fg}
|
||||||
|
urgent_workspace ${config.themes.colors.bg} ${config.themes.colors.bg} ${config.themes.colors.orange}
|
||||||
|
binding_mode ${config.themes.colors.bg} ${config.themes.colors.bg} ${config.themes.colors.yellow}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
home-manager.users.balsoft.xdg.configFile."i3blocks/config".text = let
|
||||||
|
scr = x: {
|
||||||
|
name = x;
|
||||||
|
command = scripts.${x};
|
||||||
|
};
|
||||||
|
scrint = x: interval: (scr x) // { inherit interval; };
|
||||||
|
in ''
|
||||||
|
interval=60
|
||||||
|
markup=pango
|
||||||
|
'' + genIniOrdered (
|
||||||
|
optional (config.secrets ? mail) (scr "email") ++ [
|
||||||
|
(scrint "weather" 600)
|
||||||
|
(scr "calendar")
|
||||||
|
(scr "emacs")
|
||||||
|
(scrint "youtrack-wage" 3600)
|
||||||
|
(scrint "music" 10)
|
||||||
|
(scrint "sound" 5)
|
||||||
|
] ++ [
|
||||||
|
(scrint "cpu" 5)
|
||||||
|
(scrint "freq" 10)
|
||||||
|
(scr "temperature")
|
||||||
|
(scrint "free" 10)
|
||||||
|
] ++ optionals config.deviceSpecific.isLaptop [
|
||||||
|
(scr "battery")
|
||||||
|
(scrint "brightness" 5)
|
||||||
|
] ++ [
|
||||||
|
(scrint "connections" 10)
|
||||||
|
(scr "df")
|
||||||
|
(scr "date")
|
||||||
|
(scrint "time" 1)
|
||||||
|
]);
|
||||||
|
}
|
48
modules/workspace/i3blocks/scripts/battery.nix
Normal file
48
modules/workspace/i3blocks/scripts/battery.nix
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
{ acpi, bash, iconfont, low_threshold ? 10, ... }: ''
|
||||||
|
#!${bash}/bin/bash
|
||||||
|
BATTERY="`${acpi}/bin/acpi -b | grep --invert-match unavailable | head -1`"
|
||||||
|
STATUS=`awk -F'[,:] ' '{print $2}' <<< "$BATTERY"`
|
||||||
|
CHARGE=`awk -F'[,%] ' '{print $2}' <<< "$BATTERY" | tr -d "%"`
|
||||||
|
TIME=`awk -F', ' '{print $3}' <<< "$BATTERY" | cut -d " " -f 1 | cut -d: -f1-2`
|
||||||
|
case "$STATUS" in
|
||||||
|
Full) ;& "Not charging") icon=; TEXT="FULL"; status=0
|
||||||
|
;;
|
||||||
|
Charging)
|
||||||
|
TEXT="$CHARGE% ($TIME)"
|
||||||
|
status=0
|
||||||
|
case $CHARGE in
|
||||||
|
[2-3]*) icon=;;
|
||||||
|
[4-5]*) icon=;;
|
||||||
|
[6-7]*) icon=;;
|
||||||
|
[8-9]*) icon=;;
|
||||||
|
100) icon=;;
|
||||||
|
*) icon=;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
Discharging)
|
||||||
|
if [[ $CHARGE -gt ${toString low_threshold} ]]
|
||||||
|
then
|
||||||
|
status=0
|
||||||
|
else
|
||||||
|
status=33
|
||||||
|
fi
|
||||||
|
TEXT="$CHARGE% ($TIME)";
|
||||||
|
case $CHARGE in
|
||||||
|
1?) icon=;;
|
||||||
|
2?) icon=;;
|
||||||
|
3?) icon=;;
|
||||||
|
4?) icon=;;
|
||||||
|
5?) icon=;;
|
||||||
|
6?) icon=;;
|
||||||
|
7?) icon=;;
|
||||||
|
8?) icon=;;
|
||||||
|
9?) icon=;;
|
||||||
|
100) icon=;;
|
||||||
|
*) ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
[[ -n $BLOCK_BUTTON ]] && text=" $TEXT"
|
||||||
|
echo "<span font=\"${iconfont}\">$icon</span>$text"
|
||||||
|
exit $status
|
||||||
|
''
|
27
modules/workspace/i3blocks/scripts/brightness.nix
Normal file
27
modules/workspace/i3blocks/scripts/brightness.nix
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{ iconfont, light, config, ... }: ''
|
||||||
|
case $BLOCK_BUTTON in
|
||||||
|
4) sudo ${light}/bin/light -A 5;;
|
||||||
|
5) sudo ${light}/bin/light -U 5;;
|
||||||
|
esac
|
||||||
|
LIGHT=`${light}/bin/light | cut -f 1 -d '.'`
|
||||||
|
if [[ $LIGHT -lt 33 ]]
|
||||||
|
then
|
||||||
|
icon=
|
||||||
|
else
|
||||||
|
if [[ $LIGHT -lt 66 ]]
|
||||||
|
then
|
||||||
|
icon=
|
||||||
|
else
|
||||||
|
icon=
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
${if config.device == "ASUS-Laptop" then ''
|
||||||
|
if [[ `cat /sys/devices/platform/asus-nb-wmi/als_enable` -eq 1 ]]
|
||||||
|
then
|
||||||
|
icon=""
|
||||||
|
fi
|
||||||
|
'' else
|
||||||
|
""}
|
||||||
|
[[ -n $BLOCK_BUTTON ]] && text=" $LIGHT"
|
||||||
|
echo "<span font='${iconfont}'>$icon</span>$text"
|
||||||
|
''
|
26
modules/workspace/i3blocks/scripts/calendar.nix
Normal file
26
modules/workspace/i3blocks/scripts/calendar.nix
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{ config, gcalcli, bash, iconfont, ... }: ''
|
||||||
|
#!${bash}/bin/bash
|
||||||
|
ping -c 1 calendar.google.com &> /dev/null || exit 1
|
||||||
|
AGENDA_NEXT="`PYTHONIOENCODING=utf8 ${
|
||||||
|
gcalcli
|
||||||
|
}/bin/gcalcli --nocolor search "*" 'now' 'now+6d' --nostarted --tsv | head -1`"
|
||||||
|
DATE="`awk '{print $1 " " $2}' <<< "$AGENDA_NEXT"`"
|
||||||
|
echo -n "<span font='${iconfont}'></span> "
|
||||||
|
if [[ `date -d "$DATE" +'%u'` -eq `date +'%u'` ]]
|
||||||
|
then
|
||||||
|
echo -n `date -d "$DATE" +'%H:%M'`
|
||||||
|
else
|
||||||
|
echo -n `date -d "$DATE" +'%H:%M %a'`
|
||||||
|
fi
|
||||||
|
if [[ $BLOCK_BUTTON == "1" ]]
|
||||||
|
then
|
||||||
|
${config.defaultApplications.term.cmd} --hold -e "${gcalcli}/bin/gcalcli agenda"
|
||||||
|
fi
|
||||||
|
if [[ $((`date -d "$DATE" +%s`-`date +%s`)) -lt 1800 ]]
|
||||||
|
then
|
||||||
|
code=33
|
||||||
|
else
|
||||||
|
code=0
|
||||||
|
fi
|
||||||
|
echo ":`awk '{$1=""; $2=""; $3=""; $4=""; print}' <<< "$AGENDA_NEXT" | tr -s " " | tr -s " "`"
|
||||||
|
''
|
63
modules/workspace/i3blocks/scripts/connections.nix
Normal file
63
modules/workspace/i3blocks/scripts/connections.nix
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
{ bash, networkmanager, iconfont, config, modemmanager, ... }: ''
|
||||||
|
#!${bash}/bin/bash
|
||||||
|
[[ $BLOCK_BUTTON -eq 1 ]] && ${config.defaultApplications.term.cmd} -e ${networkmanager}/bin/nmtui-connect
|
||||||
|
CONNECTIONS=$(${networkmanager}/bin/nmcli con show --active | tail +2 | tr -s ' ' | rev | cut -d' ' -f3 | rev)
|
||||||
|
text=""
|
||||||
|
for connection in $CONNECTIONS
|
||||||
|
do
|
||||||
|
grep wifi <<< $connection > /dev/null && {
|
||||||
|
SIGNAL=$(${networkmanager}/bin/nmcli d w | grep '^\*' | tr -s ' ' | cut -d' ' -f7)
|
||||||
|
if [[ $SIGNAL -lt 20 ]]
|
||||||
|
then
|
||||||
|
text+=冷
|
||||||
|
elif [[ $SIGNAL -lt 40 ]]
|
||||||
|
then
|
||||||
|
text+=爛
|
||||||
|
elif [[ $SIGNAL -lt 60 ]]
|
||||||
|
then
|
||||||
|
text+=嵐
|
||||||
|
elif [[ $SIGNAL -lt 80 ]]
|
||||||
|
then
|
||||||
|
text+=襤
|
||||||
|
else
|
||||||
|
text+=蠟
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
grep gsm <<< $connection >/dev/null && {
|
||||||
|
MODEM=$(${modemmanager}/bin/mmcli -K -L | tail -1 | cut -d: -f2 | tr -d ' ')
|
||||||
|
STATUS=$(${modemmanager}/bin/mmcli -K -m $MODEM)
|
||||||
|
TECH=$(grep "modem.generic.access-technologies.value\[1\]" <<< $STATUS | cut -d: -f2 | tr -d ' ')
|
||||||
|
|
||||||
|
SIGNAL=$(grep "modem.generic.signal-quality.value" <<< $STATUS | cut -d: -f2 | tr -d ' ')
|
||||||
|
if [[ $SIGNAL -lt 20 ]]
|
||||||
|
then
|
||||||
|
text+=""
|
||||||
|
elif [[ $SIGNAL -lt 40 ]]
|
||||||
|
then
|
||||||
|
text+=""
|
||||||
|
elif [[ $SIGNAL -lt 60 ]]
|
||||||
|
then
|
||||||
|
text+=""
|
||||||
|
elif [[ $SIGNAL -lt 80 ]]
|
||||||
|
then
|
||||||
|
text+=""
|
||||||
|
else
|
||||||
|
text+=""
|
||||||
|
fi
|
||||||
|
if [[ $TECH == lte ]]
|
||||||
|
then
|
||||||
|
text+=""
|
||||||
|
else
|
||||||
|
text+=""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
grep ethernet <<< $connection > /dev/null && text+=""
|
||||||
|
done
|
||||||
|
code=0
|
||||||
|
[[ $text == "" ]] && {
|
||||||
|
text=
|
||||||
|
code=33
|
||||||
|
}
|
||||||
|
echo "<span font='${iconfont}'>$text</span>"
|
||||||
|
exit $code
|
||||||
|
''
|
43
modules/workspace/i3blocks/scripts/default.nix
Normal file
43
modules/workspace/i3blocks/scripts/default.nix
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
p: c:
|
||||||
|
with p;
|
||||||
|
builtins.mapAttrs (name: value:
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
inherit name;
|
||||||
|
src = value;
|
||||||
|
unpackPhase = "true";
|
||||||
|
buildInputs = [ghc];
|
||||||
|
buildPhase = "ghc -o $out $src";
|
||||||
|
installPhase = "true";
|
||||||
|
}) {
|
||||||
|
free = ./free.hs;
|
||||||
|
temperature = ./temperature.hs;
|
||||||
|
network = ./network.hs;
|
||||||
|
} // builtins.mapAttrs (name: value:
|
||||||
|
writeTextFile {
|
||||||
|
inherit name;
|
||||||
|
text = callPackage value {
|
||||||
|
iconfont = "Material Design Icons";
|
||||||
|
config = c;
|
||||||
|
};
|
||||||
|
executable = true;
|
||||||
|
checkPhase =
|
||||||
|
"${bash}/bin/bash -n $src || ${python3}/bin/python3 -m compileall $src";
|
||||||
|
}) {
|
||||||
|
battery = ./battery.nix;
|
||||||
|
brightness = ./brightness.nix;
|
||||||
|
calendar = ./calendar.nix;
|
||||||
|
email = ./email.nix;
|
||||||
|
emacs = ./emacs.nix;
|
||||||
|
connections = ./connections.nix;
|
||||||
|
weather = ./weather.nix;
|
||||||
|
sound = ./sound.nix;
|
||||||
|
music = ./music.nix;
|
||||||
|
youtrack-wage = ./youtrack-wage.nix;
|
||||||
|
cpu = {...}: ''top -b -n1 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }' '';
|
||||||
|
freq = {...}: ''echo $(${pkgs.bc}/bin/bc -l <<< "scale=2; `cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq|sort|tail -1`/1000000") GHz'';
|
||||||
|
df = {...}: ''echo '<span font="Material Icons 11"></span>' `df / | tail -1 | grep -o '..%'`'';
|
||||||
|
date = {...}: "${pkgs.coreutils}/bin/date +'<span font=\"Material Icons 11\"></span> %a %y-%m-%d'";
|
||||||
|
time = {...}: "${pkgs.coreutils}/bin/date +'<span font=\"Material Icons 11\"></span> %T'";
|
||||||
|
#temperature = ./temperature.nix;
|
||||||
|
#free = ./free.nix;
|
||||||
|
}
|
4
modules/workspace/i3blocks/scripts/emacs.nix
Normal file
4
modules/workspace/i3blocks/scripts/emacs.nix
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{...}: ''
|
||||||
|
[[ $BLOCK_BUTTON -eq 2 ]] && emacsclient --eval "(org-clock-out)" > /dev/null
|
||||||
|
emacsclient --eval "org-mode-line-string" | head -1 | cut -d\" -f 2
|
||||||
|
''
|
10
modules/workspace/i3blocks/scripts/email.nix
Normal file
10
modules/workspace/i3blocks/scripts/email.nix
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{ python3, iconfont, config, ... }: ''
|
||||||
|
#!${python3}/bin/python3
|
||||||
|
import imaplib
|
||||||
|
obj = imaplib.IMAP4_SSL('imap.${config.secrets.mail.host}', 993)
|
||||||
|
obj.login("${config.secrets.mail.user}@${config.secrets.mail.host}", "${config.secrets.mail.password}")
|
||||||
|
obj.select()
|
||||||
|
l = len(obj.search(None, 'unseen')[1][0].split())
|
||||||
|
print('<span font="${iconfont}"></span> %s' % str(l))
|
||||||
|
exit(33 if l != 0 else 0)
|
||||||
|
''
|
10
modules/workspace/i3blocks/scripts/free.hs
Normal file
10
modules/workspace/i3blocks/scripts/free.hs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import System.Exit
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
freeMemory <- read
|
||||||
|
<$> (!!1) <$> words
|
||||||
|
<$> (!!2) <$> lines
|
||||||
|
<$> readFile "/proc/meminfo"
|
||||||
|
putStrLn $ (take 5 $ show $ freeMemory / 1000000) ++ "GB"
|
||||||
|
exitWith $ if freeMemory > 500000 then ExitSuccess else ExitFailure 33
|
5
modules/workspace/i3blocks/scripts/free.nix
Normal file
5
modules/workspace/i3blocks/scripts/free.nix
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{ bc, ... }: ''
|
||||||
|
echo `free | tail -2 | head -1 | awk '{print "scale=3; "$7"/1000000"}' | ${
|
||||||
|
bc
|
||||||
|
}/bin/bc -l`GB
|
||||||
|
''
|
14
modules/workspace/i3blocks/scripts/hydra-status.nix
Normal file
14
modules/workspace/i3blocks/scripts/hydra-status.nix
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{ bash, curl, libnotify, sox, iconfont, ... }:
|
||||||
|
''
|
||||||
|
#!${bash}/bin/bash
|
||||||
|
STATUS=$(${curl}/bin/curl -sw "%{http_code}" https://hydra.typeable.io/ping)
|
||||||
|
if [ $STATUS -eq 200 ]
|
||||||
|
then
|
||||||
|
echo '<span font="${iconfont}">🐍</span>'
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
msg="HYDRA DOWN"
|
||||||
|
echo $msg
|
||||||
|
exit 33
|
||||||
|
fi
|
||||||
|
''
|
19
modules/workspace/i3blocks/scripts/music.nix
Normal file
19
modules/workspace/i3blocks/scripts/music.nix
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{ python3, playerctl, iconfont, ...}: ''
|
||||||
|
#!${python3}/bin/python
|
||||||
|
from subprocess import getoutput, call
|
||||||
|
from os import environ
|
||||||
|
status = getoutput("${playerctl}/bin/playerctl status")
|
||||||
|
if "BLOCK_BUTTON" in environ:
|
||||||
|
BLOCK_BUTTON = environ["BLOCK_BUTTON"]
|
||||||
|
if BLOCK_BUTTON == "1": call(["${playerctl}/bin/playerctl", "play-pause"])
|
||||||
|
if BLOCK_BUTTON == "2": call(["${playerctl}/bin/playerctl", "stop"])
|
||||||
|
if BLOCK_BUTTON == "3": call(["${playerctl}/bin/playerctl", "next"])
|
||||||
|
if status == "Paused":
|
||||||
|
icon=""
|
||||||
|
elif status == "Playing":
|
||||||
|
icon=""
|
||||||
|
else:
|
||||||
|
icon = ""
|
||||||
|
text = getoutput("${playerctl}/bin/playerctl metadata title")[:20:]
|
||||||
|
print("<span font='${iconfont}'>%s</span> %s" % (icon, text.replace('&', '&')))
|
||||||
|
''
|
39
modules/workspace/i3blocks/scripts/network.hs
Normal file
39
modules/workspace/i3blocks/scripts/network.hs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{-# LANGUAGE BangPatterns #-}
|
||||||
|
|
||||||
|
import Control.Concurrent (threadDelay)
|
||||||
|
import Control.Monad (mapM)
|
||||||
|
import System.Directory (listDirectory)
|
||||||
|
import Data.Bool (bool)
|
||||||
|
|
||||||
|
path :: String
|
||||||
|
path = "/sys/class/net/"
|
||||||
|
|
||||||
|
data Statistics = Statistics !Float !Float
|
||||||
|
|
||||||
|
instance Semigroup Statistics where
|
||||||
|
Statistics a b <> Statistics c d = Statistics (a + c) (b + d)
|
||||||
|
|
||||||
|
instance Monoid Statistics where
|
||||||
|
mempty = Statistics 0 0
|
||||||
|
|
||||||
|
icon :: String -> String
|
||||||
|
icon i = "<span font='Material Icons 11'>" ++ i ++ "</span>"
|
||||||
|
|
||||||
|
readInterface :: FilePath -> IO Statistics
|
||||||
|
readInterface interface = do
|
||||||
|
rx <- read <$> readFile (path ++ interface ++ "/statistics/rx_bytes")
|
||||||
|
tx <- read <$> readFile (path ++ interface ++ "/statistics/tx_bytes")
|
||||||
|
return $ Statistics rx tx
|
||||||
|
|
||||||
|
readInterfaces :: [FilePath] -> IO Statistics
|
||||||
|
readInterfaces interfaces = mconcat <$> (mapM readInterface interfaces)
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
interfaces <- listDirectory path
|
||||||
|
Statistics rx tx <- readInterfaces interfaces
|
||||||
|
threadDelay 1000000
|
||||||
|
Statistics rx' tx' <- readInterfaces interfaces
|
||||||
|
putStrLn
|
||||||
|
$ (bool (icon "\58052") "" (rx' - rx > 100))
|
||||||
|
++ (bool (icon "\58054") "" (tx' - tx > 100))
|
33
modules/workspace/i3blocks/scripts/sound.nix
Normal file
33
modules/workspace/i3blocks/scripts/sound.nix
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
{ pamixer, lxqt, iconfont, ... }: ''
|
||||||
|
case $BLOCK_BUTTON in
|
||||||
|
2) ${pamixer}/bin/pamixer -t;;
|
||||||
|
3) ${lxqt.pavucontrol-qt}/bin/pavucontrol-qt & ;;
|
||||||
|
4) ${pamixer}/bin/pamixer -i 5;;
|
||||||
|
5) ${pamixer}/bin/pamixer -d 5;;
|
||||||
|
esac
|
||||||
|
code=0
|
||||||
|
if [[ `${pamixer}/bin/pamixer --get-mute` = "true" ]]
|
||||||
|
then
|
||||||
|
volume=""
|
||||||
|
end=""
|
||||||
|
icon=""
|
||||||
|
else
|
||||||
|
volume=`${pamixer}/bin/pamixer --get-volume`
|
||||||
|
end="%"
|
||||||
|
if [[ $volume -lt 33 ]]
|
||||||
|
then
|
||||||
|
icon=""
|
||||||
|
else
|
||||||
|
if [[ $volume -lt 66 ]]
|
||||||
|
then
|
||||||
|
icon=""
|
||||||
|
else
|
||||||
|
icon=""
|
||||||
|
code=33
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
[[ -n $BLOCK_BUTTON ]] && text=" $volume$end"
|
||||||
|
echo "<span font='${iconfont}'>$icon</span>$text"
|
||||||
|
exit $code
|
||||||
|
''
|
47
modules/workspace/i3blocks/scripts/temperature.hs
Normal file
47
modules/workspace/i3blocks/scripts/temperature.hs
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import System.Directory
|
||||||
|
import System.FilePath
|
||||||
|
import Control.Monad (forM)
|
||||||
|
import System.Posix.Files
|
||||||
|
import Data.List (isPrefixOf, isInfixOf)
|
||||||
|
import System.Exit
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- | Traverse from 'top' directory and return all the files by
|
||||||
|
-- filtering with 'include' predicate.
|
||||||
|
traverseDir :: FilePath -> (FilePath -> Bool) -> IO [FilePath]
|
||||||
|
traverseDir top include = do
|
||||||
|
ds <- getDirectoryContents top
|
||||||
|
paths <- forM (filter include ds) $ \d -> do
|
||||||
|
let path = top </> d
|
||||||
|
s <- getFileStatus path
|
||||||
|
if isDirectory s
|
||||||
|
then traverseDir path include
|
||||||
|
else return [path]
|
||||||
|
return $ concat paths
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- | Get temperatures from hardware sensors in </sys/class/hwmon>
|
||||||
|
getTemps :: IO [Int]
|
||||||
|
getTemps = do
|
||||||
|
hwmons <- traverseDir "/sys/class/hwmon"
|
||||||
|
(
|
||||||
|
\name
|
||||||
|
-> ("hwmon" `isPrefixOf` name)
|
||||||
|
|| ("temp" `isInfixOf` name) && ("input" `isInfixOf` name)
|
||||||
|
)
|
||||||
|
fmap (round .(/1000) . read) <$> traverse (readFile) hwmons
|
||||||
|
|
||||||
|
-- | Get a symbol corresponding to the temperature
|
||||||
|
getSymbol :: Integral n => n -> String
|
||||||
|
getSymbol t
|
||||||
|
| t < 50 = "\57868" --
|
||||||
|
| t < 80 = "\57866" --
|
||||||
|
| otherwise = "\57867" --
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
maxTemp <- maximum <$> getTemps
|
||||||
|
putStrLn $ (getSymbol <> show) maxTemp <> "°"
|
||||||
|
exitWith $ if maxTemp < 80 then ExitSuccess else ExitFailure 33
|
6
modules/workspace/i3blocks/scripts/temperature.nix
Normal file
6
modules/workspace/i3blocks/scripts/temperature.nix
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{ ... }:
|
||||||
|
''
|
||||||
|
temp=$((`cat /sys/class/thermal/thermal_zone*/temp | sort | tail -1`/1000))
|
||||||
|
echo $temp °
|
||||||
|
[[ $temp -gt 80 ]] && exit 33
|
||||||
|
''
|
10
modules/workspace/i3blocks/scripts/weather.nix
Normal file
10
modules/workspace/i3blocks/scripts/weather.nix
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{ bash, config, curl, iconfont, ... }: ''
|
||||||
|
#!${bash}/bin/bash
|
||||||
|
WTTR=$(curl wttr.in/?format=1)
|
||||||
|
echo "<span font=\"Roboto Mono 11\">$WTTR</span>"
|
||||||
|
if [[ $BLOCK_BUTTON == 1 ]]
|
||||||
|
then
|
||||||
|
${config.defaultApplications.term.cmd} --hold -e "${curl}/bin/curl wttr.in"
|
||||||
|
fi
|
||||||
|
''
|
||||||
|
|
16
modules/workspace/i3blocks/scripts/youtrack-wage.nix
Normal file
16
modules/workspace/i3blocks/scripts/youtrack-wage.nix
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{ bash, yt-utilities, libqalculate, config, lib, ... }:
|
||||||
|
''
|
||||||
|
#!${bash}/bin/bash
|
||||||
|
HOURS_DAY=$(yt org local --since $(date +'%Y-%m-%d') | tail -1)
|
||||||
|
HOURS_MONTH=$(yt org local --since $(date +'%Y-%m-01') | tail -1)
|
||||||
|
HOURS_YEAR=$(yt org local --since $(date +'%Y-01-01') | tail -1)
|
||||||
|
HOURS_TASK=$(emacsclient --eval "org-mode-line-string" | head -1 | cut -d\" -f 2 | cut -d\[ -f2 | cut -d\] -f1)h
|
||||||
|
MONEY_TASK=$(qalc -t -e "$HOURS_TASK * (${config.secrets.wage})" )
|
||||||
|
MONEY_DAY=$(qalc -t "($HOURS_DAY) * (${config.secrets.wage})")
|
||||||
|
MONEY_MONTH=$(qalc -t "($HOURS_MONTH) * (${config.secrets.wage})")
|
||||||
|
MONEY_YEAR=$(qalc -t "($HOURS_YEAR) * (${config.secrets.wage})")
|
||||||
|
'' + (if config.deviceSpecific.bigScreen then ''
|
||||||
|
echo "$MONEY_TASK/$MONEY_DAY($HOURS_DAY)/$MONEY_MONTH($HOURS_MONTH)/$MONEY_YEAR"
|
||||||
|
'' else ''
|
||||||
|
echo "$MONEY_MONTH($HOURS_MONTH)"
|
||||||
|
'')
|
18
modules/workspace/kanshi.nix
Normal file
18
modules/workspace/kanshi.nix
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{ config, pkgs, lib, ... }: {
|
||||||
|
home-manager.users.balsoft = {
|
||||||
|
xsession.windowManager.i3.config.startup = [{
|
||||||
|
command = "${pkgs.kanshi}/bin/kanshi";
|
||||||
|
notification = false;
|
||||||
|
always = true;
|
||||||
|
}];
|
||||||
|
xdg.configFile."kanshi/config".text = ''
|
||||||
|
{
|
||||||
|
output "Samsung Electric Company C27JG5x HTOM901267" position 0,1025
|
||||||
|
output "Dell Inc. DELL E176FP MC0435BH2ATP" position 1400,0
|
||||||
|
}
|
||||||
|
{
|
||||||
|
output "Samsung Electric Company C27JG5x HTOM901267" position 0,0
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
139
modules/workspace/kde/default.nix
Normal file
139
modules/workspace/kde/default.nix
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
{ pkgs, lib, config, ... }:
|
||||||
|
with import ../../../support.nix { inherit lib config; }; {
|
||||||
|
xdg.portal.enable = true;
|
||||||
|
# services.flatpak.enable = true;
|
||||||
|
xdg.portal.extraPortals = [pkgs.plasma5.xdg-desktop-portal-kde];
|
||||||
|
services.dbus.packages =
|
||||||
|
[ pkgs.plasma5.xdg-desktop-portal-kde pkgs.flatpak pkgs.firefox pkgs.systemd ];
|
||||||
|
nixpkgs.config.firefox.enablePlasmaBrowserIntegration = true;
|
||||||
|
home-manager.users.balsoft.home.packages = [pkgs.qt5ct];
|
||||||
|
environment.sessionVariables = {
|
||||||
|
DESKTOP_SESSION = "kde";
|
||||||
|
QT_XFT = "true";
|
||||||
|
QT_SELECT = "5";
|
||||||
|
XDG_CURRENT_DESKTOP = "KDE";
|
||||||
|
KDE_SESSION_VERSION = "5";
|
||||||
|
QT_SCALE_FACTOR = "1";
|
||||||
|
QT_AUTO_SCREEN_SCALE_FACTOR = "0";
|
||||||
|
GTK_USE_PORTAL = "1";
|
||||||
|
DE = "kde";
|
||||||
|
QT_QPA_PLATFORMTHEME="kde";
|
||||||
|
};
|
||||||
|
#home-manager.users.balsoft.xdg.configFile."qt5ct/qt5ct.conf".source = ./qt5ct.conf;
|
||||||
|
home-manager.users.balsoft.xdg.configFile."kdeglobals".text = genIni {
|
||||||
|
"Colors:Button" = {
|
||||||
|
BackgroundAlternate = thmDec.dark;
|
||||||
|
BackgroundNormal = thmDec.bg;
|
||||||
|
DecorationFocus = thmDec.blue;
|
||||||
|
DecorationHover = thmDec.blue;
|
||||||
|
ForegroundActive = thmDec.blue;
|
||||||
|
ForegroundInactive = thmDec.alt;
|
||||||
|
ForegroundLink = thmDec.blue;
|
||||||
|
ForegroundNegative = thmDec.red;
|
||||||
|
ForegroundNeutral = thmDec.orange;
|
||||||
|
ForegroundNormal = thmDec.fg;
|
||||||
|
ForegroundPositive = thmDec.green;
|
||||||
|
ForegroundVisited = thmDec.gray;
|
||||||
|
};
|
||||||
|
"Colors:Complementary" = {
|
||||||
|
BackgroundAlternate = thmDec.dark;
|
||||||
|
BackgroundNormal = thmDec.bg;
|
||||||
|
DecorationFocus = thmDec.blue;
|
||||||
|
DecorationHover = thmDec.blue;
|
||||||
|
ForegroundActive = thmDec.orange;
|
||||||
|
ForegroundInactive = thmDec.alt;
|
||||||
|
ForegroundLink = thmDec.blue;
|
||||||
|
ForegroundNegative = thmDec.red;
|
||||||
|
ForegroundNeutral = thmDec.yellow;
|
||||||
|
ForegroundNormal = thmDec.fg;
|
||||||
|
ForegroundPositive = thmDec.green;
|
||||||
|
ForegroundVisited = thmDec.blue;
|
||||||
|
};
|
||||||
|
"Colors:Selection" = {
|
||||||
|
BackgroundAlternate = thmDec.blue;
|
||||||
|
BackgroundNormal = thmDec.blue;
|
||||||
|
DecorationFocus = thmDec.blue;
|
||||||
|
DecorationHover = thmDec.blue;
|
||||||
|
ForegroundActive = thmDec.fg;
|
||||||
|
ForegroundInactive = thmDec.fg;
|
||||||
|
ForegroundLink = thmDec.blue;
|
||||||
|
ForegroundNegative = thmDec.red;
|
||||||
|
ForegroundNeutral = thmDec.orange;
|
||||||
|
ForegroundNormal = thmDec.fg;
|
||||||
|
ForegroundPositive = thmDec.green;
|
||||||
|
ForegroundVisited = thmDec.alt;
|
||||||
|
};
|
||||||
|
"Colors:Tooltip" = {
|
||||||
|
BackgroundAlternate = thmDec.dark;
|
||||||
|
BackgroundNormal = thmDec.bg;
|
||||||
|
DecorationFocus = thmDec.blue;
|
||||||
|
DecorationHover = thmDec.blue;
|
||||||
|
ForegroundActive = thmDec.blue;
|
||||||
|
ForegroundInactive = thmDec.alt;
|
||||||
|
ForegroundLink = thmDec.blue;
|
||||||
|
ForegroundNegative = thmDec.red;
|
||||||
|
ForegroundNeutral = thmDec.orange;
|
||||||
|
ForegroundNormal = thmDec.fg;
|
||||||
|
ForegroundPositive = thmDec.green;
|
||||||
|
ForegroundVisited = thmDec.gray;
|
||||||
|
};
|
||||||
|
"Colors:View" = {
|
||||||
|
BackgroundAlternate = thmDec.dark;
|
||||||
|
BackgroundNormal = thmDec.bg;
|
||||||
|
DecorationFocus = thmDec.blue;
|
||||||
|
DecorationHover = thmDec.blue;
|
||||||
|
ForegroundActive = thmDec.blue;
|
||||||
|
ForegroundInactive = thmDec.alt;
|
||||||
|
ForegroundLink = thmDec.blue;
|
||||||
|
ForegroundNegative = thmDec.red;
|
||||||
|
ForegroundNeutral = thmDec.orange;
|
||||||
|
ForegroundNormal = thmDec.fg;
|
||||||
|
ForegroundPositive = thmDec.green;
|
||||||
|
ForegroundVisited = thmDec.gray;
|
||||||
|
};
|
||||||
|
"Colors:Window" = {
|
||||||
|
BackgroundAlternate = thmDec.dark;
|
||||||
|
BackgroundNormal = thmDec.bg;
|
||||||
|
DecorationFocus = thmDec.blue;
|
||||||
|
DecorationHover = thmDec.blue;
|
||||||
|
ForegroundActive = thmDec.blue;
|
||||||
|
ForegroundInactive = thmDec.alt;
|
||||||
|
ForegroundLink = thmDec.blue;
|
||||||
|
ForegroundNegative = thmDec.red;
|
||||||
|
ForegroundNeutral = thmDec.orange;
|
||||||
|
ForegroundNormal = thmDec.fg;
|
||||||
|
ForegroundPositive = thmDec.green;
|
||||||
|
ForegroundVisited = thmDec.gray;
|
||||||
|
};
|
||||||
|
General = {
|
||||||
|
ColorScheme = "Generated";
|
||||||
|
Name = "Generated";
|
||||||
|
fixed = "Roboto Mono,11,-1,5,50,0,0,0,0,0";
|
||||||
|
font = "Roboto,11,-1,5,50,0,0,0,0,0";
|
||||||
|
menuFont = "Roboto,11,-1,5,50,0,0,0,0,0";
|
||||||
|
shadeSortColumn = true;
|
||||||
|
smallestReadableFont = "Roboto,8,-1,5,57,0,0,0,0,0,Medium";
|
||||||
|
toolBarFont = "Roboto,11,-1,5,50,0,0,0,0,0";
|
||||||
|
};
|
||||||
|
KDE = {
|
||||||
|
DoubleClickInterval = 400;
|
||||||
|
ShowDeleteCommand = true;
|
||||||
|
SingleClick = false;
|
||||||
|
StartDragDist = 4;
|
||||||
|
StartDragTime = 500;
|
||||||
|
WheelScrollLines = 3;
|
||||||
|
contrast = 4;
|
||||||
|
widgetStyle = "Breeze";
|
||||||
|
};
|
||||||
|
Icons = { Theme = "Papirus-Dark"; };
|
||||||
|
};
|
||||||
|
home-manager.users.balsoft.home.activation."user-places.xbel" = {
|
||||||
|
data = ''
|
||||||
|
$DRY_RUN_CMD rm -f ~/.local/share/user-places.xbel
|
||||||
|
$DRY_RUN_CMD cp ${./user-places.xbel} ~/.local/share/user-places.xbel
|
||||||
|
$DRY_RUN_CMD chmod 777 ~/.local/share/user-places.xbel
|
||||||
|
'';
|
||||||
|
before = [];
|
||||||
|
after = ["linkGeneration"];
|
||||||
|
};
|
||||||
|
}
|
23
modules/workspace/kde/qt5ct.conf
Normal file
23
modules/workspace/kde/qt5ct.conf
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
[Appearance]
|
||||||
|
color_scheme_path=/home/balsoft/.nix-profile/share/qt5ct/colors/airy.conf
|
||||||
|
custom_palette=false
|
||||||
|
icon_theme=Papirus-Dark
|
||||||
|
standard_dialogs=kde
|
||||||
|
style=Breeze
|
||||||
|
|
||||||
|
[Fonts]
|
||||||
|
fixed=@Variant(\0\0\0@\0\0\0\x16\0R\0o\0\x62\0o\0t\0o\0 \0M\0o\0n\0o@&\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x32\x10)
|
||||||
|
general=@Variant(\0\0\0@\0\0\0\f\0R\0o\0\x62\0o\0t\0o@&\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x32\x10)
|
||||||
|
|
||||||
|
[Interface]
|
||||||
|
activate_item_on_single_click=0
|
||||||
|
buttonbox_layout=0
|
||||||
|
cursor_flash_time=1000
|
||||||
|
dialog_buttons_have_icons=1
|
||||||
|
double_click_interval=400
|
||||||
|
gui_effects=@Invalid()
|
||||||
|
menus_have_icons=true
|
||||||
|
stylesheets=@Invalid()
|
||||||
|
toolbutton_style=4
|
||||||
|
underline_shortcut=1
|
||||||
|
wheel_scroll_lines=1
|
351
modules/workspace/kde/user-places.xbel
Normal file
351
modules/workspace/kde/user-places.xbel
Normal file
@ -0,0 +1,351 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE xbel>
|
||||||
|
<xbel xmlns:kdepriv="http://www.kde.org/kdepriv" xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks" xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info">
|
||||||
|
<bookmark href="file:///home/balsoft">
|
||||||
|
<title>Home</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="user-home"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1539244233/0</ID>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="file:///home/balsoft/cloud/Google Drive">
|
||||||
|
<title>Google Drive</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="google-drive"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540478729/2</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="file:///home/balsoft/cloud/Yandex Disk/">
|
||||||
|
<title>Yandex Disk</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="yandex-disk"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1554507064/0</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="remote:/">
|
||||||
|
<title>Network</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="network-workgroup"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1539244233/2</ID>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="file:///">
|
||||||
|
<title>Root</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="folder-red"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1539244233/3</ID>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="trash:/">
|
||||||
|
<title>Trash</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="user-trash-full"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1539244233/4</ID>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="file:///home/balsoft/Downloads">
|
||||||
|
<title>Downloads</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="folder-downloads"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1539244233/1</ID>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="file:///home/balsoft/Documents/">
|
||||||
|
<title>Documents</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="folder-documents-symbolic"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540414173/0</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<GroupState-Places-IsHidden>false</GroupState-Places-IsHidden>
|
||||||
|
<GroupState-Remote-IsHidden>false</GroupState-Remote-IsHidden>
|
||||||
|
<GroupState-Devices-IsHidden>false</GroupState-Devices-IsHidden>
|
||||||
|
<GroupState-RemovableDevices-IsHidden>false</GroupState-RemovableDevices-IsHidden>
|
||||||
|
<withBaloo>true</withBaloo>
|
||||||
|
<GroupState-SearchFor-IsHidden>false</GroupState-SearchFor-IsHidden>
|
||||||
|
<GroupState-RecentlySaved-IsHidden>false</GroupState-RecentlySaved-IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
<bookmark href="timeline:/today">
|
||||||
|
<title>Today</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="go-jump-today"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1539244233/5</ID>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="timeline:/yesterday">
|
||||||
|
<title>Yesterday</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="view-calendar-day"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1539244233/6</ID>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="search:/documents">
|
||||||
|
<title>Documents</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="folder-text"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1539244233/7</ID>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="search:/images">
|
||||||
|
<title>Images</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="folder-images"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1539244233/8</ID>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="search:/audio">
|
||||||
|
<title>Audio Files</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="folder-sound"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1539244233/9</ID>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="search:/videos">
|
||||||
|
<title>Videos</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="folder-videos"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1539244233/10</ID>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="">
|
||||||
|
<title>Project Folder</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="folder-favorites"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<OnlyInApp>kdenlive</OnlyInApp>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<separator href="file:///">
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<UDI>/org/freedesktop/UDisks2/block_devices/sda2</UDI>
|
||||||
|
<isSystemItem>true</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="drive-harddisk-root"/>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
<title>Linux filesystem</title>
|
||||||
|
</separator>
|
||||||
|
<bookmark href="file:///home/balsoft/Videos/">
|
||||||
|
<title>Videos</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="folder-videos-symbolic"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540409511/0</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="file:///home/balsoft/Pictures">
|
||||||
|
<title>Pictures</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="folder-pictures-symbolic"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540409539/1</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="file:///home/balsoft/projects">
|
||||||
|
<title>projects</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="user-bookmarks-symbolic"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540463794/11</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="timeline:/calendar/">
|
||||||
|
<title>Calendar</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="view-calendar-timeline"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540478496/0</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="fish://asus-laptop">
|
||||||
|
<title>ASUS</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="laptop"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540585036/0</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="fish://hp-laptop">
|
||||||
|
<title>HP</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="laptop"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540585062/1</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="fish://prestigio-laptop">
|
||||||
|
<title>Prestigio</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="laptop"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540585084/2</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="fish://lenovo-workstation">
|
||||||
|
<title>Lenovo</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="computer"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540585120/3</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="fish://amd-workstation">
|
||||||
|
<title>AMD</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="computer"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540585120/3</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
<bookmark href="fish://192.168.1.1">
|
||||||
|
<title>Router</title>
|
||||||
|
<info>
|
||||||
|
<metadata owner="http://freedesktop.org">
|
||||||
|
<bookmark:icon name="network-server-symbolic"/>
|
||||||
|
</metadata>
|
||||||
|
<metadata owner="http://www.kde.org">
|
||||||
|
<ID>1540585202/4</ID>
|
||||||
|
<isSystemItem>false</isSystemItem>
|
||||||
|
<IsHidden>false</IsHidden>
|
||||||
|
</metadata>
|
||||||
|
</info>
|
||||||
|
</bookmark>
|
||||||
|
</xbel>
|
35
modules/workspace/light.nix
Normal file
35
modules/workspace/light.nix
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
{ config, pkgs, lib, ... }: {
|
||||||
|
programs.light.enable = config.deviceSpecific.isLaptop;
|
||||||
|
services.actkbd = {
|
||||||
|
enable = config.deviceSpecific.isLaptop;
|
||||||
|
bindings = map (x:
|
||||||
|
x // {
|
||||||
|
events = [ "key" ];
|
||||||
|
attributes = [ "exec" ];
|
||||||
|
}) [
|
||||||
|
{
|
||||||
|
keys = [ 225 ];
|
||||||
|
command = "${pkgs.light}/bin/light -A 10";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
keys = [ 224 ];
|
||||||
|
command = "${pkgs.light}/bin/light -U 10";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
keys = [ 431 ];
|
||||||
|
command = (toString (pkgs.writeTextFile {
|
||||||
|
name = "dark-script";
|
||||||
|
text = ''
|
||||||
|
if [[ `${pkgs.light}/bin/light` -eq 0 ]]
|
||||||
|
then
|
||||||
|
${pkgs.light}/bin/light -I
|
||||||
|
else
|
||||||
|
${pkgs.light}/bin/light -O
|
||||||
|
${pkgs.light}/bin/light -S 0
|
||||||
|
fi'';
|
||||||
|
executable = true;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
19
modules/workspace/locale.nix
Normal file
19
modules/workspace/locale.nix
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{ pkgs, config, lib, ... }: {
|
||||||
|
i18n = {
|
||||||
|
defaultLocale = "en_GB.UTF-8";
|
||||||
|
consoleFont = "cyr-sun16";
|
||||||
|
consoleKeyMap = "ruwin_cplk-UTF-8";
|
||||||
|
};
|
||||||
|
|
||||||
|
time.timeZone = "Europe/Moscow"; # Mother Russia
|
||||||
|
home-manager.users.balsoft.home.language = let
|
||||||
|
en = "en_GB.UTF-8";
|
||||||
|
ru = "ru_RU.UTF-8";
|
||||||
|
in {
|
||||||
|
address = ru;
|
||||||
|
monetary = ru;
|
||||||
|
paper = ru;
|
||||||
|
time = en;
|
||||||
|
base = en;
|
||||||
|
};
|
||||||
|
}
|
4
modules/workspace/mako.nix
Normal file
4
modules/workspace/mako.nix
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{ pkgs, config, ...}:
|
||||||
|
{
|
||||||
|
home-manager.users.balsoft.xsession.windowManager.i3.config.startup = [ { command = "${pkgs.mako}/bin/mako --layer overlay --font 'Roboto 13' --width 500 --height 80 --default-timeout 10000 --max-visible 10 --background-color '${config.themes.colors.bg}' --text-color '${config.themes.colors.fg}' --border-color '${config.themes.colors.blue}'"; } ];
|
||||||
|
}
|
59
modules/workspace/misc.nix
Normal file
59
modules/workspace/misc.nix
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
{ pkgs, lib, config, ... }: {
|
||||||
|
programs.sway.enable = true;
|
||||||
|
users.users.balsoft.extraGroups = [ "sway" ];
|
||||||
|
systemd.coredump.enable = true;
|
||||||
|
programs.ssh.askPassword = "${pkgs.plasma5.ksshaskpass}/bin/ksshaskpass";
|
||||||
|
environment.sessionVariables = {
|
||||||
|
EDITOR = config.defaultApplications.editor.cmd;
|
||||||
|
VISUAL = config.defaultApplications.editor.cmd;
|
||||||
|
LESS = "-asrRix8";
|
||||||
|
XDG_SESSION_TYPE = "wayland";
|
||||||
|
XKB_DEFAULT_LAYOUT = "us,ru";
|
||||||
|
XKB_DEFAULT_OPTIONS = "grp:lctrl_toggle,grp_led:caps,ctrl:nocaps";
|
||||||
|
QT_QPA_PLATFORM = "wayland";
|
||||||
|
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
|
||||||
|
NIX_AUTO_RUN = "1";
|
||||||
|
};
|
||||||
|
services.atd.enable = true;
|
||||||
|
home-manager.users.balsoft = {
|
||||||
|
xdg.enable = true;
|
||||||
|
|
||||||
|
home.activation."mimeapps-remove" = {
|
||||||
|
before = [ "linkGeneration" ];
|
||||||
|
after = [ ];
|
||||||
|
data = "rm -f /home/balsoft/.config/mimeapps.list";
|
||||||
|
};
|
||||||
|
programs.gpg.enable = true;
|
||||||
|
services.gpg-agent = {
|
||||||
|
enable = true;
|
||||||
|
extraConfig = ''
|
||||||
|
pinentry-program ${pkgs.pinentry}/bin/pinentry
|
||||||
|
allow-emacs-pinentry
|
||||||
|
allow-loopback-pinentry
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
services.udiskie.enable = true;
|
||||||
|
programs.git = {
|
||||||
|
enable = true;
|
||||||
|
userEmail = "balsoft@balsoft.ru";
|
||||||
|
userName = "Alexander Bantyev";
|
||||||
|
extraConfig.pull.rebase = true;
|
||||||
|
signing = {
|
||||||
|
signByDefault = true;
|
||||||
|
key = "687558B21E04FE92B255BED0E081FF12ADCB4AD5";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
news.display = "silent";
|
||||||
|
programs.command-not-found = {
|
||||||
|
enable = true;
|
||||||
|
dbPath = ../../misc/programs.sqlite;
|
||||||
|
};
|
||||||
|
home.keyboard = {
|
||||||
|
options = [ "grp:win_space_toggle,grp_led:caps,ctrl:nocaps" ];
|
||||||
|
layout = "us,ru";
|
||||||
|
};
|
||||||
|
home.file.".icons/default".source =
|
||||||
|
"${pkgs.breeze-qt5}/share/icons/breeze_cursors";
|
||||||
|
systemd.user.startServices = true;
|
||||||
|
};
|
||||||
|
}
|
25
modules/workspace/mopidy.nix
Normal file
25
modules/workspace/mopidy.nix
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
{
|
||||||
|
services.mopidy = {
|
||||||
|
enable = true;
|
||||||
|
extensionPackages = with pkgs; [ mopidy-gmusic mopidy-youtube ];
|
||||||
|
configuration = (if (!isNull config.secrets.gpmusic) then ''
|
||||||
|
[gmusic]
|
||||||
|
username = ${config.secrets.gpmusic.user}
|
||||||
|
password = ${config.secrets.gpmusic.password}
|
||||||
|
deviceid = ${config.secrets.gpmusic.deviceid}
|
||||||
|
bitrate = 128
|
||||||
|
'' else
|
||||||
|
"") + ''
|
||||||
|
[mpd]
|
||||||
|
hostname = 0.0.0.0
|
||||||
|
[audio]
|
||||||
|
output = pulsesink server=127.0.0.1
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.mopidy = {
|
||||||
|
after = [ "network-online.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
31
modules/workspace/rclone.nix
Normal file
31
modules/workspace/rclone.nix
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{ pkgs, config, lib, ... }: {
|
||||||
|
home-manager.users.balsoft = {
|
||||||
|
xdg.configFile."rclone/rclone.conf.home".text = config.secrets.rclone;
|
||||||
|
home.activation."rclone" = {
|
||||||
|
after = [ "linkGeneration" ];
|
||||||
|
before = [ ];
|
||||||
|
data = ''
|
||||||
|
cp ./.config/rclone/rclone.conf.home ./.config/rclone/rclone.conf
|
||||||
|
chmod 700 ./.config/rclone/rclone.conf
|
||||||
|
mkdir -p cloud; cd cloud
|
||||||
|
mkdir -p 'Google Drive' || true
|
||||||
|
mkdir -p 'Yandex Disk' || true
|
||||||
|
mkdir -p 'Dropbox' || true
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
xsession.windowManager.i3.config.startup = [
|
||||||
|
{
|
||||||
|
command =
|
||||||
|
"${pkgs.rclone}/bin/rclone mount google:/ '/home/balsoft/cloud/Google Drive' --daemon";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
command =
|
||||||
|
"${pkgs.rclone}/bin/rclone mount Yandex:/ '/home/balsoft/cloud/Yandex Disk' --daemon";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
command =
|
||||||
|
"${pkgs.rclone}/bin/rclone mount Dropbox:/ '/home/balsoft/cloud/Dropbox' --daemon";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
27
modules/workspace/ssh.nix
Normal file
27
modules/workspace/ssh.nix
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{ pkgs, config, lib, ... }: {
|
||||||
|
services.openssh = {
|
||||||
|
enable = true;
|
||||||
|
passwordAuthentication = false;
|
||||||
|
permitRootLogin = "no";
|
||||||
|
forwardX11 = true;
|
||||||
|
ports = [ 22 13722 ];
|
||||||
|
};
|
||||||
|
|
||||||
|
users.users.balsoft.openssh.authorizedKeys.keys =
|
||||||
|
["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDd2OdcSHUsgezuV+cpFqk9+Svtup6PxIolv1zokVZdqvS8qxLsA/rwYmQgTnuq4/zK/GIxcUCH4OxYlW6Or4M4G7qrDKcLAUrRPWkectqEooWRflZXkfHduMJhzeOAsBdMfYZQ9024GwKr/4yriw2BGa8GbbAnQxiSeTipzvXHoXuRME+/2GsMFAfHFvxzXRG7dNOiLtLaXEjUPUTcw/fffKy55kHtWxMkEvvcdyR53/24fmO3kLVpEuoI+Mp1XFtX3DvRM9ulgfwZUn8/CLhwSLwWX4Xf9iuzVi5vJOJtMOktQj/MwGk4tY/NPe+sIk+nAUKSdVf0y9k9JrJT98S/ comment"];
|
||||||
|
|
||||||
|
home-manager.users.balsoft.programs.ssh =
|
||||||
|
if (!isNull config.secrets.id_rsa) then {
|
||||||
|
enable = true;
|
||||||
|
matchBlocks = {
|
||||||
|
"*" = {
|
||||||
|
identityFile = toString (pkgs.writeTextFile {
|
||||||
|
name = "id_rsa";
|
||||||
|
text = config.secrets.id_rsa;
|
||||||
|
});
|
||||||
|
compression = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} else
|
||||||
|
{ };
|
||||||
|
}
|
28
modules/workspace/synergy.nix
Normal file
28
modules/workspace/synergy.nix
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
{ pkgs, config, lib, ... }: {
|
||||||
|
services.synergy = if config.device == "AMD-Workstation" then {
|
||||||
|
server.enable = true;
|
||||||
|
server.configFile = pkgs.writeTextFile {
|
||||||
|
name = "synergy.conf";
|
||||||
|
text = ''
|
||||||
|
section: screens
|
||||||
|
AMD-Workstation
|
||||||
|
ASUS-Laptop:
|
||||||
|
HP-Laptop:
|
||||||
|
end
|
||||||
|
section: links
|
||||||
|
ASUS-Laptop:
|
||||||
|
right = AMD-Workstation
|
||||||
|
HP-Laptop:
|
||||||
|
left = AMD-Workstation
|
||||||
|
end
|
||||||
|
section: options
|
||||||
|
keystroke(super+alt+left) = switchInDirection(left)
|
||||||
|
keystroke(super+alt+right) = switchInDirection(right)
|
||||||
|
end
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
client.enable = true;
|
||||||
|
client.serverAddress = "AMD-Workstation";
|
||||||
|
};
|
||||||
|
}
|
48
modules/workspace/xresources.nix
Normal file
48
modules/workspace/xresources.nix
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
{
|
||||||
|
home-manager.users.balsoft = {
|
||||||
|
xresources.properties = with config.themes.colors; {
|
||||||
|
"*background" = bg;
|
||||||
|
"*foreground" = fg;
|
||||||
|
"*color0" = dark;
|
||||||
|
"*color1" = red;
|
||||||
|
"*color2" = green;
|
||||||
|
"*color3" = yellow;
|
||||||
|
"*color4" = blue;
|
||||||
|
"*color5" = purple;
|
||||||
|
"*color6" = cyan;
|
||||||
|
"*color7" = fg;
|
||||||
|
"*color8" = dark;
|
||||||
|
"*color9" = red;
|
||||||
|
"*color10" = green;
|
||||||
|
"*color11" = yellow;
|
||||||
|
"*color12" = blue;
|
||||||
|
"*color13" = purple;
|
||||||
|
"*color14" = cyan;
|
||||||
|
"*color15" = fg;
|
||||||
|
|
||||||
|
# "emacs.color0" = dark;
|
||||||
|
# "emacs.color1" = green;
|
||||||
|
# "emacs.color2" = alt;
|
||||||
|
# "emacs.color3" = yellow;
|
||||||
|
# "emacs.color4" = gray;
|
||||||
|
# "emacs.color5" = purple;
|
||||||
|
# "emacs.color6" = cyan;
|
||||||
|
# "emacs.color7" = gray;
|
||||||
|
# "emacs.color8" = alt;
|
||||||
|
# "emacs.color9" = green;
|
||||||
|
# "emacs.color10" = green;
|
||||||
|
# "emacs.color11" = yellow;
|
||||||
|
# "emacs.color12" = green;
|
||||||
|
# "emacs.color13" = purple;
|
||||||
|
# "emacs.color14" = cyan;
|
||||||
|
# "emacs.color15" = fg;
|
||||||
|
|
||||||
|
};
|
||||||
|
home.activation.xrdb = {
|
||||||
|
after = ["linkGeneration"];
|
||||||
|
before = [];
|
||||||
|
data = "DISPLAY=:0 ${pkgs.xorg.xrdb}/bin/xrdb -merge ${config.users.users.balsoft.home}/.Xresources";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
98
modules/workspace/zsh.nix
Executable file
98
modules/workspace/zsh.nix
Executable file
@ -0,0 +1,98 @@
|
|||||||
|
{ pkgs, config, ... }: {
|
||||||
|
|
||||||
|
environment.pathsToLink = [ "/share/zsh" ];
|
||||||
|
environment.sessionVariables.SHELL = "zsh";
|
||||||
|
home-manager.users.balsoft.programs.zsh = {
|
||||||
|
enable = true;
|
||||||
|
enableAutosuggestions = true;
|
||||||
|
enableCompletion = true;
|
||||||
|
oh-my-zsh = {
|
||||||
|
enable = true;
|
||||||
|
theme = "agnoster";
|
||||||
|
plugins = [ "git" "dirhistory" ];
|
||||||
|
};
|
||||||
|
plugins = [
|
||||||
|
{
|
||||||
|
name = "zsh-nix-shell";
|
||||||
|
file = "nix-shell.plugin.zsh";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "chisui";
|
||||||
|
repo = "zsh-nix-shell";
|
||||||
|
rev = "b2609ca787803f523a18bb9f53277d0121e30389";
|
||||||
|
sha256 = "01w59zzdj12p4ag9yla9ycxx58pg3rah2hnnf3sw4yk95w3hlzi6";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "zsh-autosuggestions";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "zsh-users";
|
||||||
|
repo = "zsh-autosuggestions";
|
||||||
|
rev = "v0.4.0";
|
||||||
|
sha256 = "0z6i9wjjklb4lvr7zjhbphibsyx51psv50gm07mbb0kj9058j6kc";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "you-should-use";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "MichaelAquilina";
|
||||||
|
repo = "zsh-you-should-use";
|
||||||
|
rev = "2be37f376c13187c445ae9534550a8a5810d4361";
|
||||||
|
sha256 = "0yhwn6av4q6hz9s34h4m3vdk64ly6s28xfd8ijgdbzic8qawj5p1";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
shellAliases = {
|
||||||
|
"b" = ''nix-build "<nixpkgs>" --no-out-link -A'';
|
||||||
|
"p" = "nix-shell --run zsh -p";
|
||||||
|
"o" = "xdg-open";
|
||||||
|
"post" = ''curl -F"file=@-" https://0x0.st'';
|
||||||
|
"clip" = "${pkgs.xclip}/bin/xclip -selection clipboard";
|
||||||
|
};
|
||||||
|
initExtra = ''
|
||||||
|
r(){nix run nixpkgs.$1 -c $@ }
|
||||||
|
cmdignore=(htop tmux top vim)
|
||||||
|
function active_window_id () {
|
||||||
|
if [[ -n $DISPLAY ]] ; then
|
||||||
|
${pkgs.xorg.xprop}/bin/xprop -root _NET_ACTIVE_WINDOW | awk '{print $5}'
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
echo nowindowid
|
||||||
|
}
|
||||||
|
|
||||||
|
# end and compare timer, notify-send if needed
|
||||||
|
function notifyosd-precmd() {
|
||||||
|
retval=$?
|
||||||
|
if [ ! -z "$cmd" ]; then
|
||||||
|
cmd_end=`date +%s`
|
||||||
|
((cmd_time=$cmd_end - $cmd_start))
|
||||||
|
fi
|
||||||
|
if [ $retval -eq 0 ]; then
|
||||||
|
cmdstat="✓"
|
||||||
|
else
|
||||||
|
cmdstat="✘"
|
||||||
|
fi
|
||||||
|
if [ ! -z "$cmd" -a ! $term_window = $(active_window_id) ]; then
|
||||||
|
${pkgs.libnotify}/bin/notify-send -i utilities-terminal -u low "$cmdstat $cmd" "in `date -u -d @$cmd_time +'%T'`"
|
||||||
|
fi
|
||||||
|
unset cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
# make sure this plays nicely with any existing precmd
|
||||||
|
precmd_functions+=( notifyosd-precmd )
|
||||||
|
|
||||||
|
# get command name and start the timer
|
||||||
|
function notifyosd-preexec() {
|
||||||
|
cmd=$1
|
||||||
|
term_window=$(active_window_id)
|
||||||
|
cmd_start=`date +%s`
|
||||||
|
}
|
||||||
|
|
||||||
|
# make sure this plays nicely with any existing preexec
|
||||||
|
preexec_functions+=( notifyosd-preexec )
|
||||||
|
XDG_DATA_DIRS=$XDG_DATA_DIRS:$GSETTINGS_SCHEMAS_PATH
|
||||||
|
|
||||||
|
PS1="$PS1
|
||||||
|
$ "
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
38
modules/xserver.nix
Normal file
38
modules/xserver.nix
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{ pkgs, lib, config, ... }:
|
||||||
|
let
|
||||||
|
cpu = config.deviceSpecific.cpu;
|
||||||
|
device = config.device;
|
||||||
|
isShared = config.deviceSpecific.isShared;
|
||||||
|
in {
|
||||||
|
services.xserver = {
|
||||||
|
enable = true;
|
||||||
|
enableTCP = true;
|
||||||
|
libinput = {
|
||||||
|
enable = true;
|
||||||
|
sendEventsMode = "disabled-on-external-mouse";
|
||||||
|
middleEmulation = false;
|
||||||
|
naturalScrolling = true;
|
||||||
|
};
|
||||||
|
videoDrivers = if cpu == "amd" then
|
||||||
|
["amdgpu"]
|
||||||
|
else if device == "Lenovo-Workstation" then
|
||||||
|
["radeon"]
|
||||||
|
else
|
||||||
|
["intel"];
|
||||||
|
displayManager.lightdm = {
|
||||||
|
enable = true;
|
||||||
|
greeter.enable = isShared;
|
||||||
|
autoLogin.enable = !isShared;
|
||||||
|
autoLogin.user = "balsoft";
|
||||||
|
};
|
||||||
|
desktopManager.plasma5.enable = true;
|
||||||
|
desktopManager.default = "none";
|
||||||
|
windowManager.i3 = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.i3-gaps;
|
||||||
|
};
|
||||||
|
windowManager.default = "i3";
|
||||||
|
layout = "us,ru";
|
||||||
|
xkbOptions = "grp:caps_toggle,grp_led:caps";
|
||||||
|
};
|
||||||
|
}
|
273
nix/sources.json
Normal file
273
nix/sources.json
Normal file
@ -0,0 +1,273 @@
|
|||||||
|
{
|
||||||
|
"NUR": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "Nix User Repository: User contributed nix packages [maintainer=@Mic92]",
|
||||||
|
"homepage": "",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "NUR",
|
||||||
|
"rev": "ffd4ab4b9e3de6f695dd4501125b6cbe002edc62",
|
||||||
|
"sha256": "15hw02m5mwbp7smy462kjzzqb4i0g4c5ncc4maq59mhgiy0cdn4x",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/nix-community/NUR/archive/ffd4ab4b9e3de6f695dd4501125b6cbe002edc62.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"UserChrome-Tweaks": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "A community maintained repository of userChrome.css tweaks for Firefox",
|
||||||
|
"homepage": null,
|
||||||
|
"owner": "Timvde",
|
||||||
|
"repo": "UserChrome-Tweaks",
|
||||||
|
"rev": "76affa52fd040f703fa7cdcc9f0459643c9883d1",
|
||||||
|
"sha256": "1nz70d1l0mf4zqk5ng1cizzx8r4hxgkkx8wsw93wld3wdyhk7k3a",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/Timvde/UserChrome-Tweaks/archive/76affa52fd040f703fa7cdcc9f0459643c9883d1.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"all-hies": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "Cached Haskell IDE Engine Nix builds for all GHC versions",
|
||||||
|
"homepage": "",
|
||||||
|
"owner": "Infinisil",
|
||||||
|
"repo": "all-hies",
|
||||||
|
"rev": "4b984030c8080d944372354a7b558c49858057e7",
|
||||||
|
"sha256": "0109l0ls7gh2gydrgx45168lg45kgmgwaw9jpjm8mwvwd1brssfk",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/Infinisil/all-hies/archive/4b984030c8080d944372354a7b558c49858057e7.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"base16-unclaimed-schemes": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "A collection of themes that have no repositories for homes :(",
|
||||||
|
"homepage": null,
|
||||||
|
"owner": "chriskempson",
|
||||||
|
"repo": "base16-unclaimed-schemes",
|
||||||
|
"rev": "d6b93456dc1012628faec572387814f59e0b854a",
|
||||||
|
"sha256": "043ny56snl4w2ri1i0zzfh00zm2gf2h5jz57kgmf5jb9xj0sspb1",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/chriskempson/base16-unclaimed-schemes/archive/d6b93456dc1012628faec572387814f59e0b854a.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"home-manager": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "Manage a user environment using Nix",
|
||||||
|
"homepage": "",
|
||||||
|
"owner": "rycee",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"rev": "95c8007b8fe4433cd217db83ce26b8e29875ba06",
|
||||||
|
"sha256": "1f5fbpsaizz1hrsajprn2bcbjzgjs5jy72yir6gszg6360j61w5q",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/rycee/home-manager/archive/95c8007b8fe4433cd217db83ce26b8e29875ba06.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"materia-theme": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "A Material Design theme for GNOME/GTK based desktop environments",
|
||||||
|
"homepage": "",
|
||||||
|
"owner": "nana-4",
|
||||||
|
"repo": "materia-theme",
|
||||||
|
"rev": "b1e4c563146ae34fff6a697393b6a1bc66b612f5",
|
||||||
|
"sha256": "1w65v7jl8v5h41d27gj79rnkbn8rw0avrj4gi57l8lvlhpn9q6a2",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/nana-4/materia-theme/archive/b1e4c563146ae34fff6a697393b6a1bc66b612f5.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"mopidy": {
|
||||||
|
"branch": "v2.3.1",
|
||||||
|
"description": "Mopidy is an extensible music server written in Python",
|
||||||
|
"homepage": "https://mopidy.com",
|
||||||
|
"owner": "mopidy",
|
||||||
|
"repo": "mopidy",
|
||||||
|
"rev": "6ee0379b0f4eee0da5721b3c415f520626e56b20",
|
||||||
|
"sha256": "1qdflxr0an6l2m3j90h55bzyj7rjlkkwmxx945hwv8xi472rcgdj",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/mopidy/mopidy/archive/6ee0379b0f4eee0da5721b3c415f520626e56b20.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"mopidy-gmusic": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "Mopidy extension for playing music from Google Play Music",
|
||||||
|
"homepage": "https://www.mopidy.com",
|
||||||
|
"owner": "mopidy",
|
||||||
|
"repo": "mopidy-gmusic",
|
||||||
|
"rev": "88e71a18fd8b20b302b990abd97e2bf52cf678b8",
|
||||||
|
"sha256": "08xi0pn1zvkfy1d27pll1dwj2m08mdf07g1bw4aqz2p59vy67v6v",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/mopidy/mopidy-gmusic/archive/88e71a18fd8b20b302b990abd97e2bf52cf678b8.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"mopidy-youtube": {
|
||||||
|
"branch": "develop",
|
||||||
|
"description": "Mopidy extension for playing music from YouTube",
|
||||||
|
"homepage": "",
|
||||||
|
"owner": "natumbri",
|
||||||
|
"repo": "mopidy-youtube",
|
||||||
|
"rev": "d2d9999111f382ce3cf2f6600701649deadaafde",
|
||||||
|
"sha256": "1ld1w56nh8b527rr2g3a81dh0lxmabvn2pa3y8kv22m2vjbr7b04",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/natumbri/mopidy-youtube/archive/d2d9999111f382ce3cf2f6600701649deadaafde.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"mtxclient": {
|
||||||
|
"branch": "0.3.0-dev",
|
||||||
|
"description": "Client API library for Matrix, built on top of Boost.Asio",
|
||||||
|
"homepage": "",
|
||||||
|
"owner": "nheko-reborn",
|
||||||
|
"repo": "mtxclient",
|
||||||
|
"rev": "84c6778cc367bca79755e73e77b2cc69950375b2",
|
||||||
|
"sha256": "13h5a0kdsirsfrgvmyi0r441cbjx247ymif5gk1b35h27vk1613k",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/nheko-reborn/mtxclient/archive/84c6778cc367bca79755e73e77b2cc69950375b2.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"nheko": {
|
||||||
|
"branch": "0.7.0-dev",
|
||||||
|
"description": "Desktop client for Matrix using Qt and C++14.",
|
||||||
|
"homepage": "",
|
||||||
|
"owner": "nheko-reborn",
|
||||||
|
"repo": "nheko",
|
||||||
|
"rev": "1943d1c74d5253ec9d2b7ee38f69d791d28e84c1",
|
||||||
|
"sha256": "1r9fm3wzcw8jcg5amabpdj5rs3099dcx1mw1r6j559s9ymcfimwi",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/nheko-reborn/nheko/archive/1943d1c74d5253ec9d2b7ee38f69d791d28e84c1.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"niv": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "Easy dependency management for Nix projects",
|
||||||
|
"homepage": "https://github.com/nmattia/niv",
|
||||||
|
"owner": "nmattia",
|
||||||
|
"repo": "niv",
|
||||||
|
"rev": "49157afd2298749b8a5062fd21079542a6b2de35",
|
||||||
|
"sha256": "0q7ymfrcgagcsw6kr93kprag7k358qj8znyzyri53ci1mrsak5y1",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/nmattia/niv/archive/49157afd2298749b8a5062fd21079542a6b2de35.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"nixfmt": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "A formatter for Nix code",
|
||||||
|
"homepage": "https://nixfmt.serokell.io",
|
||||||
|
"owner": "serokell",
|
||||||
|
"repo": "nixfmt",
|
||||||
|
"rev": "921bbd3bb9c95cf2d677a8558b1a27fca6cee597",
|
||||||
|
"sha256": "0x08xsjal6db95y1sxxinwv9ks2k6fayvg8435s6zqy7zq42jxm4",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/serokell/nixfmt/archive/921bbd3bb9c95cf2d677a8558b1a27fca6cee597.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"branch": "nixos-unstable",
|
||||||
|
"builtin": false,
|
||||||
|
"description": "The nix packages collection stable",
|
||||||
|
"homepage": "https://github.com/nixos/nixpkgs",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs-channels",
|
||||||
|
"rev": "8130f3c1c2bb0e533b5e150c39911d6e61dcecc2",
|
||||||
|
"sha256": "154nrhmm3dk5kmga2w5f7a2l6j79dvizrg4wzbrcwlbvdvapdgkb",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/nixos/nixpkgs-channels/archive/8130f3c1c2bb0e533b5e150c39911d6e61dcecc2.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"nixpkgs-old": {
|
||||||
|
"branch": "nixos-19.03",
|
||||||
|
"description": "Nix Packages collection",
|
||||||
|
"homepage": null,
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "c8db7a8a16ee9d54103cade6e766509e1d1c8d7b",
|
||||||
|
"sha256": "1b3h4mwpi10blzpvgsc0191k4shaw3nw0qd2p82hygbr8vv4g9dv",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/nixos/nixpkgs/archive/c8db7a8a16ee9d54103cade6e766509e1d1c8d7b.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"nixpkgs-unstable": {
|
||||||
|
"branch": "nixos-unstable",
|
||||||
|
"description": "The nix packages collection unstable",
|
||||||
|
"homepage": "https://github.com/nixos/nixpkgs",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs-channels",
|
||||||
|
"rev": "90441b4b47fc7280de6a5bd1a228017caaa0f97f",
|
||||||
|
"sha256": "1nz9lhk53m8j6xm1frs8hk7mb76axbs3wz8xg5mrvi28cv9jldbn",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/nixos/nixpkgs-channels/archive/90441b4b47fc7280de6a5bd1a228017caaa0f97f.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"pykka": {
|
||||||
|
"branch": "v2.0.1",
|
||||||
|
"description": "Pykka is a Python implementation of the actor model, which makes it easier to build concurrent applications",
|
||||||
|
"homepage": "https://www.pykka.org",
|
||||||
|
"owner": "jodal",
|
||||||
|
"repo": "pykka",
|
||||||
|
"rev": "1982e1caf63726c66b28616c80d548ae1bb4fe87",
|
||||||
|
"sha256": "011rvv3vzj9rpwaq6vfpz9hfwm6gx1jmad4iri6z12g8nnlpydhs",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/jodal/pykka/archive/1982e1caf63726c66b28616c80d548ae1bb4fe87.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "Official scripts for WeeChat.",
|
||||||
|
"homepage": "https://weechat.org/scripts/",
|
||||||
|
"owner": "weechat",
|
||||||
|
"repo": "scripts",
|
||||||
|
"rev": "a69d3ff2fce34958f78395a85c0b8676f3d03b15",
|
||||||
|
"sha256": "1x88bvdi9pqvpfqqwp8q59ic2ia937q07hcj2dkia17ncj2v27wd",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/weechat/scripts/archive/a69d3ff2fce34958f78395a85c0b8676f3d03b15.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"simple-nixos-mailserver": {
|
||||||
|
"sha256": "08wcwc54b1k9gnx5z97yv4gm28lx50vnnsvk93l98zq209rpf7rq",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/0bf2bb0b54736df944c657a15069d19e01ab78a8/nixos-mailserver-0bf2bb0b54736df944c657a15069d19e01ab78a8.tar.gz",
|
||||||
|
"url_template": "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/0bf2bb0b54736df944c657a15069d19e01ab78a8/nixos-mailserver-0bf2bb0b54736df944c657a15069d19e01ab78a8.tar.gz"
|
||||||
|
},
|
||||||
|
"sway": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "i3-compatible Wayland compositor",
|
||||||
|
"homepage": "https://swaywm.org/",
|
||||||
|
"owner": "swaywm",
|
||||||
|
"repo": "sway",
|
||||||
|
"rev": "ab77efc6caba50acc4c87e02ae3e6712ea808772",
|
||||||
|
"sha256": "1wmjv8sj4zkmcfgfk5can2zmnq2dxggh2viaw575hzbn34nxi2pz",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/swaywm/sway/archive/ab77efc6caba50acc4c87e02ae3e6712ea808772.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"weechat-notify-send": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "A WeeChat script that sends highlight and message notifications through notify-send.",
|
||||||
|
"homepage": "",
|
||||||
|
"owner": "s3rvac",
|
||||||
|
"repo": "weechat-notify-send",
|
||||||
|
"rev": "b491e6acc1fe00fd1b91409444f9904587b2e588",
|
||||||
|
"sha256": "1f9558a78ismd645c9v6p3lgda6hkgn3f63i8s4y5r8zdymx08d0",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/s3rvac/weechat-notify-send/archive/b491e6acc1fe00fd1b91409444f9904587b2e588.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"wl-clipboard": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "Command-line copy/paste utilities for Wayland",
|
||||||
|
"homepage": "",
|
||||||
|
"owner": "bugaevc",
|
||||||
|
"repo": "wl-clipboard",
|
||||||
|
"rev": "f3a45f69f7d14e7f7050bca4cbf6fea6697d1455",
|
||||||
|
"sha256": "0c4w87ipsw09aii34szj9p0xfy0m00wyjpll0gb0aqmwa60p0c5d",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/bugaevc/wl-clipboard/archive/f3a45f69f7d14e7f7050bca4cbf6fea6697d1455.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
},
|
||||||
|
"wlroots": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "A modular Wayland compositor library",
|
||||||
|
"homepage": "https://swaywm.org",
|
||||||
|
"owner": "swaywm",
|
||||||
|
"repo": "wlroots",
|
||||||
|
"rev": "57ffb35de009611d8edecb297bc2fd10a9a86702",
|
||||||
|
"sha256": "0c0q1p9yss5kx4430ik3n89drqpmm2bvgl8fjlf6prac1a7xzqn8",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/swaywm/wlroots/archive/57ffb35de009611d8edecb297bc2fd10a9a86702.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
}
|
||||||
|
}
|
134
nix/sources.nix
Normal file
134
nix/sources.nix
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
# This file has been generated by Niv.
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
#
|
||||||
|
# The fetchers. fetch_<type> fetches specs of type <type>.
|
||||||
|
#
|
||||||
|
|
||||||
|
fetch_file = pkgs: spec:
|
||||||
|
if spec.builtin or true then
|
||||||
|
builtins_fetchurl { inherit (spec) url sha256; }
|
||||||
|
else
|
||||||
|
pkgs.fetchurl { inherit (spec) url sha256; };
|
||||||
|
|
||||||
|
fetch_tarball = pkgs: spec:
|
||||||
|
if spec.builtin or true then
|
||||||
|
builtins_fetchTarball { inherit (spec) url sha256; }
|
||||||
|
else
|
||||||
|
pkgs.fetchzip { inherit (spec) url sha256; };
|
||||||
|
|
||||||
|
fetch_git = spec:
|
||||||
|
builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; };
|
||||||
|
|
||||||
|
fetch_builtin-tarball = spec:
|
||||||
|
builtins.trace
|
||||||
|
''
|
||||||
|
WARNING:
|
||||||
|
The niv type "builtin-tarball" will soon be deprecated. You should
|
||||||
|
instead use `builtin = true`.
|
||||||
|
|
||||||
|
$ niv modify <package> -a type=tarball -a builtin=true
|
||||||
|
''
|
||||||
|
builtins_fetchTarball { inherit (spec) url sha256; };
|
||||||
|
|
||||||
|
fetch_builtin-url = spec:
|
||||||
|
builtins.trace
|
||||||
|
''
|
||||||
|
WARNING:
|
||||||
|
The niv type "builtin-url" will soon be deprecated. You should
|
||||||
|
instead use `builtin = true`.
|
||||||
|
|
||||||
|
$ niv modify <package> -a type=file -a builtin=true
|
||||||
|
''
|
||||||
|
(builtins_fetchurl { inherit (spec) url sha256; });
|
||||||
|
|
||||||
|
#
|
||||||
|
# Various helpers
|
||||||
|
#
|
||||||
|
|
||||||
|
# The set of packages used when specs are fetched using non-builtins.
|
||||||
|
mkPkgs = sources:
|
||||||
|
let
|
||||||
|
sourcesNixpkgs =
|
||||||
|
import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {};
|
||||||
|
hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
|
||||||
|
hasThisAsNixpkgsPath = <nixpkgs> == ./.;
|
||||||
|
in
|
||||||
|
if builtins.hasAttr "nixpkgs" sources
|
||||||
|
then sourcesNixpkgs
|
||||||
|
else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then
|
||||||
|
import <nixpkgs> {}
|
||||||
|
else
|
||||||
|
abort
|
||||||
|
''
|
||||||
|
Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or
|
||||||
|
add a package called "nixpkgs" to your sources.json.
|
||||||
|
'';
|
||||||
|
|
||||||
|
# The actual fetching function.
|
||||||
|
fetch = pkgs: name: spec:
|
||||||
|
|
||||||
|
if ! builtins.hasAttr "type" spec then
|
||||||
|
abort "ERROR: niv spec ${name} does not have a 'type' attribute"
|
||||||
|
else if spec.type == "file" then fetch_file pkgs spec
|
||||||
|
else if spec.type == "tarball" then fetch_tarball pkgs spec
|
||||||
|
else if spec.type == "git" then fetch_git spec
|
||||||
|
else if spec.type == "builtin-tarball" then fetch_builtin-tarball spec
|
||||||
|
else if spec.type == "builtin-url" then fetch_builtin-url spec
|
||||||
|
else
|
||||||
|
abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}";
|
||||||
|
|
||||||
|
# Ports of functions for older nix versions
|
||||||
|
|
||||||
|
# a Nix version of mapAttrs if the built-in doesn't exist
|
||||||
|
mapAttrs = builtins.mapAttrs or (
|
||||||
|
f: set: with builtins;
|
||||||
|
listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set))
|
||||||
|
);
|
||||||
|
|
||||||
|
# fetchTarball version that is compatible between all the versions of Nix
|
||||||
|
builtins_fetchTarball = { url, sha256 }@attrs:
|
||||||
|
let
|
||||||
|
inherit (builtins) lessThan nixVersion fetchTarball;
|
||||||
|
in
|
||||||
|
if lessThan nixVersion "1.12" then
|
||||||
|
fetchTarball { inherit url; }
|
||||||
|
else
|
||||||
|
fetchTarball attrs;
|
||||||
|
|
||||||
|
# fetchurl version that is compatible between all the versions of Nix
|
||||||
|
builtins_fetchurl = { url, sha256 }@attrs:
|
||||||
|
let
|
||||||
|
inherit (builtins) lessThan nixVersion fetchurl;
|
||||||
|
in
|
||||||
|
if lessThan nixVersion "1.12" then
|
||||||
|
fetchurl { inherit url; }
|
||||||
|
else
|
||||||
|
fetchurl attrs;
|
||||||
|
|
||||||
|
# Create the final "sources" from the config
|
||||||
|
mkSources = config:
|
||||||
|
mapAttrs (
|
||||||
|
name: spec:
|
||||||
|
if builtins.hasAttr "outPath" spec
|
||||||
|
then abort
|
||||||
|
"The values in sources.json should not have an 'outPath' attribute"
|
||||||
|
else
|
||||||
|
spec // { outPath = fetch config.pkgs name spec; }
|
||||||
|
) config.sources;
|
||||||
|
|
||||||
|
# The "config" used by the fetchers
|
||||||
|
mkConfig =
|
||||||
|
{ sourcesFile ? ./sources.json
|
||||||
|
, sources ? builtins.fromJSON (builtins.readFile sourcesFile)
|
||||||
|
, pkgs ? mkPkgs sources
|
||||||
|
}: rec {
|
||||||
|
# The sources, i.e. the attribute set of spec name to spec
|
||||||
|
inherit sources;
|
||||||
|
|
||||||
|
# The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
|
||||||
|
inherit pkgs;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }
|
BIN
secret.nix.gpg
Normal file
BIN
secret.nix.gpg
Normal file
Binary file not shown.
62
support.nix
Executable file
62
support.nix
Executable file
@ -0,0 +1,62 @@
|
|||||||
|
{ lib, config, ... }:
|
||||||
|
let
|
||||||
|
mkKeyValue = key: value:
|
||||||
|
let
|
||||||
|
mvalue = if builtins.isBool value then
|
||||||
|
(if value then "true" else "false")
|
||||||
|
else if (builtins.isString value && key != "include-file") then
|
||||||
|
value
|
||||||
|
else
|
||||||
|
builtins.toString value;
|
||||||
|
in "${key}=${mvalue}";
|
||||||
|
attrsToList = with builtins;
|
||||||
|
x:
|
||||||
|
(map (key: {
|
||||||
|
name = key;
|
||||||
|
value = getAttr key x;
|
||||||
|
}) (attrNames x));
|
||||||
|
in rec {
|
||||||
|
genIni = lib.generators.toINI { inherit mkKeyValue; };
|
||||||
|
genIniOrdered = lst:
|
||||||
|
(builtins.concatStringsSep "\n" (map ({ name ? "widget", ... }@attrs:
|
||||||
|
builtins.concatStringsSep "\n" ([ "[${name}]" ]
|
||||||
|
++ (map ({ name, value }: mkKeyValue name value)
|
||||||
|
(attrsToList (builtins.removeAttrs attrs [ "name" ]))))) lst)) + "\n";
|
||||||
|
thm = config.themes.colors;
|
||||||
|
splitHex = hexStr:
|
||||||
|
map (x: builtins.elemAt x 0) (builtins.filter (a: a != "" && a != [ ])
|
||||||
|
(builtins.split "(.{2})" (builtins.substring 1 6 hexStr)));
|
||||||
|
hex2decDigits = rec {
|
||||||
|
"0" = 0;
|
||||||
|
"1" = 1;
|
||||||
|
"2" = 2;
|
||||||
|
"3" = 3;
|
||||||
|
"4" = 4;
|
||||||
|
"5" = 5;
|
||||||
|
"6" = 6;
|
||||||
|
"7" = 7;
|
||||||
|
"8" = 8;
|
||||||
|
"9" = 9;
|
||||||
|
"a" = 10;
|
||||||
|
"b" = 11;
|
||||||
|
"c" = 12;
|
||||||
|
"d" = 13;
|
||||||
|
"e" = 14;
|
||||||
|
"f" = 15;
|
||||||
|
A = a;
|
||||||
|
B = b;
|
||||||
|
C = c;
|
||||||
|
D = d;
|
||||||
|
E = e;
|
||||||
|
F = f;
|
||||||
|
};
|
||||||
|
|
||||||
|
doubleDigitHexToDec = hex:
|
||||||
|
16 * hex2decDigits."${builtins.substring 0 1 hex}"
|
||||||
|
+ hex2decDigits."${builtins.substring 1 2 hex}";
|
||||||
|
thmDec = builtins.mapAttrs (name: color: colorHex2Dec color) thm;
|
||||||
|
colorHex2Dec = color:
|
||||||
|
builtins.concatStringsSep ","
|
||||||
|
(map (x: toString (doubleDigitHexToDec x)) (splitHex color));
|
||||||
|
|
||||||
|
}
|
6
switch
Executable file
6
switch
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
PATH=/run/current-system/sw/bin
|
||||||
|
|
||||||
|
nix-env --profile /nix/var/nix/profiles/system --set $(readlink $1/result)
|
||||||
|
$1/result/bin/switch-to-configuration switch
|
6
vm
Executable file
6
vm
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
[[ -z ./secret.nix ]] && echo null > secret.nix
|
||||||
|
nixpkgs=$(nix eval --raw "(with import ./nix/sources.nix; nixpkgs)")
|
||||||
|
NIX_PATH=nixpkgs=$nixpkgs:nixos-config=./vm.nix nix build -f $nixpkgs/nixos vm
|
||||||
|
./result/bin/run-NixOS-VM-vm -m size=4G # Sorry, my apps are way too large
|
||||||
|
|
Loading…
Reference in New Issue
Block a user