moved all of my config into this nix flake
This commit is contained in:
12
common/all.nix
Normal file
12
common/all.nix
Normal file
@@ -0,0 +1,12 @@
|
||||
{}:
|
||||
|
||||
# config that i use on all my hosts
|
||||
|
||||
{
|
||||
# Set your time zone.
|
||||
time.timeZone = "Europe/Vienna";
|
||||
|
||||
users.mutableUsers = false;
|
||||
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
}
|
||||
188
common/me.nix
Normal file
188
common/me.nix
Normal file
@@ -0,0 +1,188 @@
|
||||
|
||||
{ pkgs, workDir, confDir, secretsDir, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
./programms/git.nix
|
||||
./programms/lf/default.nix
|
||||
./programms/alacritty.nix
|
||||
./programms/bash.nix
|
||||
./programms/emacs.nix
|
||||
./programms/rofi.nix
|
||||
./programms/zathura.nix
|
||||
./programms/ssh.nix
|
||||
./programms/neovim.nix
|
||||
];
|
||||
|
||||
home-manager.users.me = { config, pkgs, ... }: {
|
||||
/* The home.stateVersion option does not have a default and must be set */
|
||||
home.stateVersion = "23.05";
|
||||
|
||||
gtk.cursorTheme = {
|
||||
name = "Yaru";
|
||||
};
|
||||
|
||||
dconf.settings = {
|
||||
"org/virt-manager/virt-manager/connections" = {
|
||||
autoconnect = ["qemu:///system"];
|
||||
uris = ["qemu:///system"];
|
||||
};
|
||||
};
|
||||
|
||||
services.dunst.enable = true;
|
||||
|
||||
home.sessionVariables = {
|
||||
EDITOR = "nvim";
|
||||
};
|
||||
|
||||
home.sessionPath = [ "${workDir}/config/mybin" ];
|
||||
|
||||
home.file = {
|
||||
".config/rclone".source = config.lib.file.mkOutOfStoreSymlink "${secretsDir}/rclone-conf";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
fonts.fonts = with pkgs; [
|
||||
hack-font
|
||||
];
|
||||
|
||||
users.users.me = {
|
||||
isNormalUser = true;
|
||||
passwordFile = "${secretsDir}/main-user-pwd";
|
||||
extraGroups = [ "networkmanager" "wheel" "libvirtd" ]; # Enable ‘sudo’ for the user.
|
||||
packages = with pkgs; [
|
||||
neovim
|
||||
vim
|
||||
obsidian
|
||||
tree
|
||||
xorg.xkbcomp
|
||||
rofi
|
||||
haskellPackages.xmonad-extras
|
||||
haskellPackages.xmonad-contrib
|
||||
alacritty
|
||||
xorg.xev
|
||||
ntfs3g
|
||||
htop
|
||||
subversion
|
||||
pv
|
||||
blueman
|
||||
pavucontrol
|
||||
spotify
|
||||
flameshot
|
||||
nodejs
|
||||
neofetch
|
||||
networkmanagerapplet
|
||||
haskellPackages.xmobar
|
||||
dolphin
|
||||
mupdf
|
||||
zathura
|
||||
xclip
|
||||
rclone
|
||||
stalonetray
|
||||
killall
|
||||
nil
|
||||
file
|
||||
wstunnel
|
||||
playerctl
|
||||
alsa-utils
|
||||
usbutils
|
||||
pciutils
|
||||
lshw
|
||||
jmtpfs
|
||||
pmutils
|
||||
cntr
|
||||
signal-desktop
|
||||
element-desktop
|
||||
discord
|
||||
wireshark
|
||||
zip
|
||||
unzip
|
||||
arp-scan
|
||||
gparted
|
||||
lolcat
|
||||
android-tools
|
||||
|
||||
# python....
|
||||
(python310.withPackages (p: with p; [
|
||||
pandas
|
||||
click
|
||||
click-aliases
|
||||
]))
|
||||
|
||||
# base-devel
|
||||
gcc
|
||||
|
||||
# rust
|
||||
cargo
|
||||
rust-analyzer
|
||||
|
||||
#localPacketTracer8
|
||||
|
||||
#ciscoPacketTracer8
|
||||
|
||||
# virtualisation
|
||||
qemu
|
||||
libvirt
|
||||
virt-manager
|
||||
freerdp
|
||||
];
|
||||
};
|
||||
|
||||
# xmonad
|
||||
services.xserver.windowManager.xmonad = {
|
||||
enable = true;
|
||||
config = builtins.readFile ../misc/xmobar.hs;
|
||||
enableContribAndExtras = true;
|
||||
extraPackages = hpkgs: [
|
||||
hpkgs.xmobar
|
||||
#hpkgs.xmonad-screenshot
|
||||
];
|
||||
ghcArgs = [
|
||||
"-hidir /tmp" # place interface files in /tmp, otherwise ghc tries to write them to the nix store
|
||||
"-odir /tmp" # place object files in /tmp, otherwise ghc tries to write them to the nix store
|
||||
#"-i${xmonad-contexts}" # tell ghc to search in the respective nix store path for the module
|
||||
];
|
||||
};
|
||||
|
||||
services.syncthing = {
|
||||
enable = true;
|
||||
user = "me";
|
||||
#dataDir = "/home/";
|
||||
configDir = "/home/me/.config/syncthing";
|
||||
extraFlags = ["-no-browser"];
|
||||
openDefaultPorts = true;
|
||||
overrideDevices = true; # overrides any devices added or deleted through the WebUI
|
||||
overrideFolders = true; # overrides any folders added or deleted through the WebUI
|
||||
devices = {
|
||||
"seb-phone" = {
|
||||
id = builtins.readFile "${secretsDir}/syncthing-id-phone";
|
||||
#addresses = [ "tcp://192.168.200.24:22000" ];
|
||||
};
|
||||
"seb-tab" = {
|
||||
id = builtins.readFile "${secretsDir}/syncthing-id-tab";
|
||||
#addresses = [ "tcp://192.168.200.26:22000" ];
|
||||
};
|
||||
};
|
||||
folders = {
|
||||
"priv-share" = { # Name of folder in Syncthing, also the folder ID
|
||||
path = "/home/me/work/priv-share"; # Which folder to add to Syncthing
|
||||
#devices = [ "seb-phone" "seb-tab" ]; # Which devices to share the folder with
|
||||
devices = [ "seb-phone" "seb-tab" ]; # Which devices to share the folder with
|
||||
};
|
||||
};
|
||||
};
|
||||
fileSystems."${workDir}/priv-share/things" = {
|
||||
device = "${workDir}/things";
|
||||
options = [ "bind" ];
|
||||
};
|
||||
fileSystems."${workDir}/things/htl" = {
|
||||
device = "${workDir}/htl";
|
||||
options = [ "bind" ];
|
||||
};
|
||||
fileSystems."${workDir}/things/diplomarbeit" = {
|
||||
device = "${workDir}/diplomarbeit";
|
||||
options = [ "bind" ];
|
||||
};
|
||||
|
||||
}
|
||||
17
common/nixos.nix
Normal file
17
common/nixos.nix
Normal file
@@ -0,0 +1,17 @@
|
||||
{}:
|
||||
|
||||
# config that i use on all my hosts, that run native nixos
|
||||
# excluding for example my phone phone
|
||||
|
||||
{
|
||||
|
||||
# Select internationalisation properties.
|
||||
i18n.defaultLocale = "en_US.UTF-8";
|
||||
console = {
|
||||
font = "Lat2-Terminus16";
|
||||
#keyMap = "at";
|
||||
useXkbConfig = true; # use xkbOptions in tty.
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
109
common/programms/alacritty.nix
Normal file
109
common/programms/alacritty.nix
Normal file
@@ -0,0 +1,109 @@
|
||||
{ ... }:
|
||||
{
|
||||
home-manager.users.me.programms.alacritty = {
|
||||
enable = true;
|
||||
settings = {
|
||||
font = {
|
||||
normal = {
|
||||
family = "Hack";
|
||||
style = "Regular";
|
||||
};
|
||||
|
||||
bold = {
|
||||
family = "Hack";
|
||||
style = "Bold";
|
||||
};
|
||||
|
||||
italic = {
|
||||
family = "Hack";
|
||||
style = "Italic";
|
||||
};
|
||||
|
||||
bold_italic = {
|
||||
family = "Hack";
|
||||
style = "Bold Italic";
|
||||
};
|
||||
|
||||
size = 10;
|
||||
};
|
||||
|
||||
# Dracula theme for alacritty
|
||||
colors = {
|
||||
primary = {
|
||||
background = "#282a36";
|
||||
foreground = "#f8f8f2";
|
||||
bright_foreground = "#ffffff";
|
||||
};
|
||||
cursor = {
|
||||
text = "CellBackground";
|
||||
cursor = "CellForeground";
|
||||
};
|
||||
vi_mode_cursor = {
|
||||
text = "CellBackground";
|
||||
cursor = "CellForeground";
|
||||
};
|
||||
search = {
|
||||
matches = {
|
||||
foreground = "#44475a";
|
||||
background = "#50fa7b";
|
||||
};
|
||||
focused_match = {
|
||||
foreground = "#44475a";
|
||||
background = "#ffb86c";
|
||||
};
|
||||
};
|
||||
footer_bar = {
|
||||
background = "#282a36";
|
||||
foreground = "#f8f8f2";
|
||||
};
|
||||
hints = {
|
||||
start = {
|
||||
foreground = "#282a36";
|
||||
background = "#f1fa8c";
|
||||
};
|
||||
end = {
|
||||
foreground = "#f1fa8c";
|
||||
background = "#282a36";
|
||||
};
|
||||
};
|
||||
line_indicator = {
|
||||
foreground = "None";
|
||||
background = "None";
|
||||
};
|
||||
selection = {
|
||||
text = "CellForeground";
|
||||
background = "#44475a";
|
||||
};
|
||||
normal = {
|
||||
black = "#21222c";
|
||||
red = "#ff5555";
|
||||
green = "#50fa7b";
|
||||
yellow = "#f1fa8c";
|
||||
blue = "#bd93f9";
|
||||
magenta = "#ff79c6";
|
||||
cyan = "#8be9fd";
|
||||
white = "#f8f8f2";
|
||||
};
|
||||
bright = {
|
||||
black = "#6272a4";
|
||||
red = "#ff6e6e";
|
||||
green = "#69ff94";
|
||||
yellow = "#ffffa5";
|
||||
blue = "#d6acff";
|
||||
magenta = "#ff92df";
|
||||
cyan = "#a4ffff";
|
||||
white = "#ffffff";
|
||||
};
|
||||
};
|
||||
|
||||
key_bindings = [
|
||||
{ key = "V"; mods = "Control|Shift"; action = "Paste"; }
|
||||
{ key = "C"; mods = "Control|Shift"; action = "Copy"; }
|
||||
{ key = "J"; mods = "Control"; chars = ''\x1b\x5b\x42''; }
|
||||
{ key = "K"; mods = "Control"; chars = ''x1b\x5b\x41''; }
|
||||
{ key = "H"; mods = "Control"; chars = ''x1b\x5b\x44''; }
|
||||
{ key = "L"; mods = "Control"; chars = ''x1b\x5b\x43''; }
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
250
common/programms/bash.nix
Normal file
250
common/programms/bash.nix
Normal file
@@ -0,0 +1,250 @@
|
||||
{ persistentDir, confDir, ... }:
|
||||
{
|
||||
home-manager.users.me.programs.bash = {
|
||||
|
||||
enable = true;
|
||||
enableCompletion = true;
|
||||
|
||||
historyFile = "${persistentDir}/bash-history";
|
||||
historyFileSize = 100000;
|
||||
historyControl = "ignoredups";
|
||||
historyIgnore = [
|
||||
"ls"
|
||||
"cd"
|
||||
"exit"
|
||||
];
|
||||
|
||||
shellOptions = [
|
||||
# append to the history file, don't overwrite it
|
||||
"histappend"
|
||||
|
||||
# check the window size after each command and, if necessary,
|
||||
# update the values of LINES and COLUMNS.
|
||||
"checkwinsize"
|
||||
|
||||
# If set, the pattern "**" used in a pathname expansion context will
|
||||
# match all files and zero or more directories and subdirectories.
|
||||
"globstar"
|
||||
];
|
||||
|
||||
sessionVariables = {
|
||||
# is needed to that ssh works
|
||||
TREM = "xterm";
|
||||
|
||||
# my prompt
|
||||
PS1 = ''\[\033[01;34m\]\W\[\033[00m\]\[\033[01;32m\]\[\033[00m\] ❯❯❯ '';
|
||||
};
|
||||
|
||||
shellAliases = {
|
||||
shutdown = "echo try harder.... xD";
|
||||
npw = "nmcli c up pw";
|
||||
nixre = "sd nixos-rebuild switch --flake ~/work/config/nix --impure";
|
||||
flex = "neofetch | lolcat";
|
||||
kwoche = "curl https://kalenderwoche.celll.net/?api=1; echo";
|
||||
psg = "ps -e | grep";
|
||||
vilias = "nvim -c 'set syntax=bash' ${confDir}/common/programs/bash.nix";
|
||||
stl = "sudo systemctl";
|
||||
vim = "nvim";
|
||||
sl = "ls";
|
||||
virsh = "virsh -c qemu:///system";
|
||||
nmgui = "nm-applet 2>&1 > /dev/null &; stalonetray 2>&1 > /dev/null; killall nm-applet";
|
||||
c = "cd ..";
|
||||
ne= "alacritty &";
|
||||
cbs = "history | tail -n 2 | head -n 1 | awk '{\$1=\"\"; print \$0}' | cut -c 2- | cb";
|
||||
gs = "git status";
|
||||
gitlog = "git log --all --graph";
|
||||
ipa= ''
|
||||
echo -e "IPv4:\n-----------------"
|
||||
ip -o a show | cut -d " " -f 2,7 | grep -v : | column -t
|
||||
echo -e "\nIPv6:\n-----------------"
|
||||
ip -o a show | cut -d " " -f 2,7 | grep : | column -t
|
||||
'';
|
||||
};
|
||||
|
||||
bashrcExtra = ''
|
||||
# If not running interactively, don't do anything
|
||||
case $- in
|
||||
*i*) ;;
|
||||
*) return;;
|
||||
esac
|
||||
|
||||
|
||||
# make less more friendly for non-text input files, see lesspipe(1)
|
||||
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
|
||||
|
||||
# making reverse search "going back" work with strg+s
|
||||
stty -ixon
|
||||
|
||||
|
||||
#################### functions ####################
|
||||
|
||||
# A shortcut function that simplifies usage of xclip.
|
||||
# - Accepts input from either stdin (pipe), or params.
|
||||
# ------------------------------------------------
|
||||
cb() {
|
||||
local _scs_col="\e[0;32m"; local _wrn_col='\e[1;31m'; local _trn_col='\e[0;33m'
|
||||
# Check that xclip is installed.
|
||||
if ! type xclip > /dev/null 2>&1; then
|
||||
echo -e "$_wrn_col""You must have the 'xclip' program installed.\e[0m"
|
||||
# Check user is not root (root doesn't have access to user xorg server)
|
||||
elif [[ "$USER" == "root" ]]; then
|
||||
echo -e "$_wrn_col""Must be regular user (not root) to copy a file to the clipboard.\e[0m"
|
||||
else
|
||||
# If no tty, data should be available on stdin
|
||||
if ! [[ "$( tty )" == /dev/* ]]; then
|
||||
input="$(< /dev/stdin)"
|
||||
# Else, fetch input from params
|
||||
else
|
||||
input="$*"
|
||||
fi
|
||||
if [ -z "$input" ]; then # If no input, print usage message.
|
||||
echo "Copies a string to the clipboard."
|
||||
echo "Usage: cb <string>"
|
||||
echo " echo <string> | cb"
|
||||
else
|
||||
# Copy input to clipboard
|
||||
echo -n "$input" | xclip -selection c
|
||||
# Truncate text for status
|
||||
if [ ''${#input} -gt 80 ]; then input="$(echo $input | cut -c1-80)$_trn_col...\e[0m"; fi
|
||||
# Print status.
|
||||
echo -e "$_scs_col""Copied to clipboard:\e[0m $input"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# a little programm, that changes the ssh config to always be able to acces rpi
|
||||
function rpi(){
|
||||
if [ "$1" == "l" ]
|
||||
then
|
||||
cp ~/work/config/ssh/rpi/local ~/work/config/ssh/current_pi_config
|
||||
fi
|
||||
|
||||
if [ "$1" == "local" ]
|
||||
then
|
||||
cp ~/work/config/ssh/rpi/local ~/work/config/ssh/current_pi_config
|
||||
fi
|
||||
|
||||
if [ "$1" == "r" ]
|
||||
then
|
||||
cp ~/work/config/ssh/rpi/remote ~/work/config/ssh/current_pi_config
|
||||
fi
|
||||
|
||||
if [ "$1" == "remote" ]
|
||||
then
|
||||
cp ~/work/config/ssh/rpi/remote ~/work/config/ssh/current_pi_config
|
||||
fi
|
||||
|
||||
if [ "$1" == "w" ]
|
||||
then
|
||||
cp ~/work/config/ssh/rpi/wstunnel ~/work/config/ssh/current_pi_config
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
# while true -> do cat.....
|
||||
function follow (){
|
||||
while true;
|
||||
do
|
||||
cat $@;
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
# little looping func
|
||||
function loop (){
|
||||
if [ "$1" == "-s" ]
|
||||
then
|
||||
for (( i=1; i<=$3; i++ )); do sleep $2; ''${@:4}; done
|
||||
return
|
||||
fi
|
||||
case $1 in
|
||||
${"''"}|*[!0-9]*)
|
||||
# infinit iterations
|
||||
while true; do $@; done
|
||||
return
|
||||
;;
|
||||
*) ;;
|
||||
esac
|
||||
for (( i=1; i<=$1; i++ ));do ''${@:2}; done
|
||||
}
|
||||
|
||||
|
||||
function psk(){
|
||||
ps -e | grep $1 | awk '{print $1}' | xargs kill
|
||||
}
|
||||
|
||||
|
||||
sd() {
|
||||
if [ "$1" == "" ]
|
||||
then
|
||||
sudo $(history | tail -n 2 | head -n 1 | awk '{$1=""; print $0}')
|
||||
else
|
||||
sudo $@
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# rech
|
||||
function rech(){
|
||||
python3 -c "print($@)"
|
||||
}
|
||||
|
||||
|
||||
# map
|
||||
function map(){
|
||||
if [ "$1" == "" ]
|
||||
then
|
||||
bash ~/work/virtchord/reset
|
||||
xmodmap \
|
||||
-e "clear control" \
|
||||
-e "clear mod1" \
|
||||
-e "keycode 64 = Control_L" \
|
||||
-e "keycode 37 = Alt_L" \
|
||||
-e "add control = Control_L" \
|
||||
-e "add mod1 = Alt_L"
|
||||
|
||||
xset r rate 130 85
|
||||
|
||||
elif [ "$1" != "" ]
|
||||
then
|
||||
echo -en "set-map $1" > ~/work/config/virtchord/pipe1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# cf - copy file
|
||||
function cf() { cat "$1" | cb; }
|
||||
|
||||
|
||||
# shorter zathura
|
||||
function zath(){
|
||||
zathura "$@" 2>/dev/null &
|
||||
}
|
||||
|
||||
|
||||
# shorter mupdf
|
||||
function mu(){
|
||||
mupdf "$@" 1>/dev/null 2>/dev/null &
|
||||
}
|
||||
|
||||
|
||||
# ipaa
|
||||
function ipaa(){
|
||||
ip -json addr show $1 | jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'
|
||||
}
|
||||
|
||||
|
||||
#################### completions ####################
|
||||
complete -cf sudo
|
||||
complete -cf sd
|
||||
complete -W "start stop restart status daemon-reload" stl
|
||||
|
||||
# run
|
||||
complete -W "mnt-wechner sync-school wstunnel hibernate p speed-test-nixos-iso bat bstat mnt-files-local mnt-lan-local mnt-files-remote mnt-lan-remote" ru
|
||||
|
||||
|
||||
'';
|
||||
};
|
||||
}
|
||||
6
common/programms/emacs.nix
Normal file
6
common/programms/emacs.nix
Normal file
@@ -0,0 +1,6 @@
|
||||
{ inputs, ... }:
|
||||
{
|
||||
home-manager.users.me.programms.emcas = {
|
||||
enable = true;
|
||||
};
|
||||
}
|
||||
11
common/programms/git.nix
Normal file
11
common/programms/git.nix
Normal file
@@ -0,0 +1,11 @@
|
||||
{ ... }:
|
||||
{
|
||||
home-manager.users.me.programms.git = {
|
||||
enable = true;
|
||||
userName = "Sebastian Moser";
|
||||
userEmail = "sewi.moser@gmail.com";
|
||||
|
||||
extraConfig.core.editor = "nvim";
|
||||
extraConfig.core.excludesfile = "gitignore";
|
||||
};
|
||||
}
|
||||
38
common/programms/lf/default.nix
Normal file
38
common/programms/lf/default.nix
Normal file
@@ -0,0 +1,38 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
home-manager.users.me.programs.lf = {
|
||||
package = pkgs.lf.overrideAttrs (final: prev: {
|
||||
patches = (prev.patches or [ ]) ++ [
|
||||
lib/patches/lf-filter.patch
|
||||
];
|
||||
checkPhase = "";
|
||||
});
|
||||
|
||||
enable = true;
|
||||
commands = {
|
||||
dragon-out = ''%${pkgs.xdragon}/bin/xdragon -a -x "$fx"'';
|
||||
editor-open = ''$$EDITOR $f'';
|
||||
mkdir = ''
|
||||
''${{
|
||||
printf "Directory Name: "
|
||||
read DIR
|
||||
mkdir $DIR
|
||||
}}
|
||||
'';
|
||||
};
|
||||
settings = {
|
||||
preview = true;
|
||||
drawbox = true;
|
||||
icons = true;
|
||||
};
|
||||
keybindings = {
|
||||
"." = "set hidden!";
|
||||
"<enter>" = "open";
|
||||
do = "dragon-out";
|
||||
"gh" = "cd";
|
||||
"g/" = "/";
|
||||
ee = "editor-open";
|
||||
V = ''$${pkgs.bat}/bin/bat --paging=always --theme=gruvbox "$f"'';
|
||||
};
|
||||
|
||||
}
|
||||
13
common/programms/lf/lf-filter.patch
Normal file
13
common/programms/lf/lf-filter.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
diff --git a/nav.go b/nav.go
|
||||
index c32fc97..95cc2ce 100644
|
||||
--- a/nav.go
|
||||
+++ b/nav.go
|
||||
@@ -1774,7 +1774,7 @@ func searchMatch(name, pattern string) (matched bool, err error) {
|
||||
if gOpts.globsearch {
|
||||
return filepath.Match(pattern, name)
|
||||
}
|
||||
- return strings.Contains(name, pattern), nil
|
||||
+ return strings.HasPrefix(name, pattern), nil
|
||||
}
|
||||
|
||||
func (nav *nav) searchNext() (bool, error) {
|
||||
504
common/programms/neovim.nix
Normal file
504
common/programms/neovim.nix
Normal file
@@ -0,0 +1,504 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
home-manager.users.me.programms.neovim = {
|
||||
enable = true;
|
||||
withPython3 = true;
|
||||
withNodeJs = true;
|
||||
plugins = with pkgs.vimPlugins; [
|
||||
haskell-vim
|
||||
plenary-nvim
|
||||
# typst ... TODO
|
||||
rust-vim
|
||||
dracula-vim
|
||||
];
|
||||
|
||||
coc.enable = true;
|
||||
coc.settings = {
|
||||
"rust-analyzer.server.path" = "/etc/profiles/per-user/me/bin/rust-analyzer";
|
||||
"coc.preferences.extensionUpdateCheck" = "never";
|
||||
"cSpellExt.enableDictionaries" = [ "german" ];
|
||||
"cSpell.language" = "en,de";
|
||||
"rust-analyzer.enable" = true;
|
||||
"rust-analyzer.diagnostics.enable" = true;
|
||||
"rust-analyzer.checkOnSave.enable" = false;
|
||||
"languageserver" = {
|
||||
"vhdl" = {
|
||||
"command" = "/home/sebastian/work/config/nvim/language-servers/vhdl/vhdl-tool";
|
||||
"args" = [ "lsp" ];
|
||||
"filetypes" = [ "vhdl" ];
|
||||
};
|
||||
"csharp-ls" = {
|
||||
"command" = "csharp-ls";
|
||||
"filetypes" = [ "cs" ];
|
||||
"rootPatterns" = [ "*.csproj" ".vim/" ".git/" ".hg/" ];
|
||||
};
|
||||
"nix" = {
|
||||
"command" = "nil";
|
||||
"filetypes" = [ "nix" ];
|
||||
"rootPatterns" = [ "flake.nix" ];
|
||||
};
|
||||
};
|
||||
"svelte.enable-ts-plugin" = true;
|
||||
};
|
||||
|
||||
extraConfig = ''
|
||||
|
||||
syntax enable
|
||||
filetype plugin indent on
|
||||
|
||||
" the nord colorscheme
|
||||
"source ~/.config/nvim/plugins/nord-vim/colors/nord.vim
|
||||
colorscheme dracula
|
||||
|
||||
autocmd BufReadPost * call Setup()
|
||||
|
||||
function Setup()
|
||||
if index(["typst", "haskell", "tex", "c", "rust", "js", "vhdl"], &syntax) >= 0
|
||||
execute "call Setup_" . &syntax . "()"
|
||||
endif
|
||||
endfunction
|
||||
|
||||
""""""""""""""""""""""""""""" mappings """""""""""""""""""""""""""""
|
||||
nmap <LEFT> gT
|
||||
map <RIGHT> gt
|
||||
imap <LEFT> <ESC>gT
|
||||
imap <RIGHT> <ESC>gt
|
||||
|
||||
map <C-l> gt
|
||||
map <C-h> gT
|
||||
imap <C-l> <ESC>gt
|
||||
imap <C-h> <ESC>gT
|
||||
|
||||
:tnoremap <Esc> <C-\><C-n>
|
||||
:tmap <C-h> <Esc><C-h>
|
||||
:tmap <C-l> <Esc><C-l>
|
||||
|
||||
|
||||
cnoreabbrev ta Te
|
||||
cnoreabbrev hh TSHighlightCapturesUnderCursor
|
||||
|
||||
nnoremap ga :call CocActionAsync('doHover')<ENTER>
|
||||
nnoremap gd :call CocActionAsync('jumpDefinition')<ENTER>
|
||||
|
||||
nmap <C-,> A;<Esc>
|
||||
|
||||
nmap <C-d> <C-d>zz
|
||||
nmap <C-u> <C-u>zz
|
||||
|
||||
nmap # *
|
||||
|
||||
nmap ' /aöeiääääaöfj<ENTER>:<ESC>
|
||||
|
||||
nmap j gj
|
||||
nmap k gk
|
||||
nmap 0 g0
|
||||
nmap $ g$
|
||||
inoremap <C-BS> <ESC>bcw
|
||||
|
||||
cnoreabbrev s set filetype=javascriptreact
|
||||
|
||||
nnoremap <C-n> <cmd>lua require('renamer').rename()<cr>
|
||||
|
||||
"cmap t <TAB>
|
||||
"cmap <C-j> <C-i>
|
||||
"cnoremap <C-k> <S-TAB>
|
||||
"cnoremap <C-i> <C-n>
|
||||
"cnoremap <TAB> <C-n>
|
||||
"cnoremap <C-j> <C-i>
|
||||
"cnoremap <C-j> <TAB>
|
||||
"cnoremap <C-n> <TAB>
|
||||
noremap <ENTER> i<ENTER>
|
||||
set nohlsearch
|
||||
set backupdir=~/.local/state/nvim/backup
|
||||
|
||||
cnoreabbrev cdf :lcd %:p:h
|
||||
cnoreabbrev tspell call CocAction('toggleExtension', 'coc-spell-checker')
|
||||
|
||||
|
||||
|
||||
""""""""""""""""""""""""""""" neovide """""""""""""""""""""""""""""
|
||||
|
||||
" Being able to paste system clipboard in neovide
|
||||
imap <C-v> <ESC>"+pi
|
||||
nmap <C-v> "+p
|
||||
|
||||
vmap <C-c> "+y
|
||||
|
||||
|
||||
let g:neovide_cursor_vfx_mode = "wireframe"
|
||||
set guifont=Hack:h10
|
||||
"set guifont=Monospace:h6
|
||||
|
||||
|
||||
|
||||
""""""""""""""""""""""""""""" coc """""""""""""""""""""""""""""
|
||||
|
||||
imap <C-k> <UP>
|
||||
imap <C-j> <DOWN>
|
||||
imap <C-ENTER> <C-j><ENTER>
|
||||
imap <C-s> <C-j><C-j><ENTER>
|
||||
|
||||
"let g:coc_snippet_next = ${"''"}
|
||||
"let g:coc_snippet_prev = ${"''"}
|
||||
|
||||
"inoremap <expr> <c-j>
|
||||
"\ pumvisible() ? "\<DOWN>" :
|
||||
"\ coc#jumpable() ? "\<c-r>=coc#rpc#request('snippetNext', [])<cr>" :
|
||||
"\ "\<c-j>"
|
||||
"inoremap <expr> <c-k>
|
||||
"\ pumvisible() ? "\<UP>" :
|
||||
"\ coc#jumpable() ? "\<c-r>=coc#rpc#request('snippetPrev', [])<cr>" :
|
||||
"\ "\<c-k>"
|
||||
|
||||
" use enter for completing with coc
|
||||
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm() : "\<CR>"
|
||||
|
||||
|
||||
function! s:TernimalRun(cmd)
|
||||
execute '5new'
|
||||
call termopen(a:cmd, {
|
||||
\ 'on_exit': 's:OnExit',
|
||||
\ 'buffer_nr': bufnr('%'),
|
||||
\})
|
||||
execute 'wincmd p'
|
||||
endfunction
|
||||
|
||||
|
||||
|
||||
""""""""""""""""""""""""""""" languages """""""""""""""""""""""""""""
|
||||
|
||||
" ###### typst ###### "
|
||||
"Typst highlight customisation
|
||||
function Setup_typst()
|
||||
" set highlight of Headings to not be underlined
|
||||
"autocmd TermClose * echo v:shell_error
|
||||
"au TermClose * call feedkeys("ii")
|
||||
:hi! link typstMarkupHeading markdownH1
|
||||
:hi markdownH1 cterm=bold, gui=bold
|
||||
|
||||
" to keep indent the same when making a "-" list
|
||||
set cindent
|
||||
|
||||
cnoreabbrev c call SaveAndCompile_typst()
|
||||
|
||||
function! OnExit(job_id, exit_code, event) dict
|
||||
let lines = line("$")
|
||||
if a:exit_code == "0"
|
||||
"echo "good"
|
||||
call feedkeys("ii")
|
||||
else
|
||||
"echo "bad"
|
||||
endif
|
||||
|
||||
|
||||
endfunction
|
||||
|
||||
endfunction
|
||||
|
||||
|
||||
function! SaveAndCompile_typst()
|
||||
:silent w
|
||||
"execute '5new'
|
||||
let path = expand('%:p')
|
||||
:belowright new 20split
|
||||
":belowright 20split call termopen("echo hello")
|
||||
call termopen("typst --root ~/work/config/typst --font-path ~/config/typst/fonts compile " . path . " out.pdf", {
|
||||
\ 'on_exit': 'OnExit',
|
||||
\ 'buffer_nr': bufnr('%'),
|
||||
\})
|
||||
"execute 'wincmd p'
|
||||
":execute '!typst compile ' . expand('%:p')
|
||||
":belowright 20split term://typst compile doku.typ
|
||||
":belowright 20split
|
||||
"s:TernimalRun("!echo hello")
|
||||
endfunction
|
||||
|
||||
|
||||
|
||||
|
||||
" ###### js ###### "
|
||||
set tabstop=3 shiftwidth=3
|
||||
function Setup_js()
|
||||
|
||||
"autocmd Filetype js set tabstop=2 shiftwidth=2 expandtab
|
||||
set tabstop=4 shiftwidth=4
|
||||
cnoreabbrev c echo JSSSSSSSSSSSSSSSSSS is interpreted.....
|
||||
" autocmd Filetype setlocal ts=2 sw=2 expandtab
|
||||
|
||||
endfunction
|
||||
|
||||
|
||||
|
||||
" ###### c ###### "
|
||||
function Setup_c()
|
||||
cnoreabbrev c call SaveAndCompile_c()
|
||||
endfunction
|
||||
|
||||
|
||||
function! SaveAndCompile_c()
|
||||
:w
|
||||
execute '!gcc main.c -o main.out; if [ $? -ne 0 ]; then echo ======= ERROR =======; exit; fi ; echo "======= NO ERROR = PROGRAMM ======="; ./main.out'
|
||||
endfunction
|
||||
|
||||
|
||||
|
||||
" ###### latex ###### "
|
||||
|
||||
let g:UltiSnipsExpandTrigger = '<tab>'
|
||||
let g:UltiSnipsJumpForwardTrigger = '<c-j>'
|
||||
let g:UltiSnipsJumpBackwardTrigger = '<c-k>'
|
||||
|
||||
function Setup_tex()
|
||||
set tabstop=2 shiftwidth=2
|
||||
"command SaveAndCompilelatex
|
||||
cnoreabbrev c call SaveAndCompile_latex()
|
||||
cnoreabbrev o call Open_latex()<ENTER>
|
||||
|
||||
function Latex_toggle_comment()
|
||||
let line=getline('.')
|
||||
let chars = split(line, '\zs')
|
||||
let index = 0
|
||||
while 1
|
||||
if len(chars) == 0
|
||||
return
|
||||
break
|
||||
endif
|
||||
if chars[index] == " "
|
||||
let index += 1
|
||||
else
|
||||
break
|
||||
endif
|
||||
endwhile
|
||||
if chars[index] == "%"
|
||||
execute 's@^%@@g'
|
||||
else
|
||||
execute 's/^/%/g'
|
||||
endif
|
||||
endfunction
|
||||
|
||||
vnoremap s :call Latex_toggle_comment()<Enter>
|
||||
endfunction
|
||||
|
||||
function SaveAndCompile_latex()
|
||||
:w
|
||||
execute '!pdflatex --output-directory=' . expand('%:p:h') . " " . expand('%:p')
|
||||
endfunction
|
||||
|
||||
function Open_latex()
|
||||
execute '!zathura ./main.pdf 1>/dev/null 2>/dev/null &'
|
||||
endfunction
|
||||
" end latex
|
||||
|
||||
|
||||
" ###### vhdl ###### "
|
||||
|
||||
function Setup_vhdl()
|
||||
function Vhdl_toggle_comment()
|
||||
let line=getline('.')
|
||||
let chars = split(line, '\zs')
|
||||
let index = 0
|
||||
while 1
|
||||
if len(chars) == 0
|
||||
return
|
||||
break
|
||||
endif
|
||||
if chars[index] == " "
|
||||
let index += 1
|
||||
else
|
||||
break
|
||||
endif
|
||||
endwhile
|
||||
if chars[index] == "-"
|
||||
execute 's@^--@@g'
|
||||
else
|
||||
execute 's/^/--/g'
|
||||
endif
|
||||
endfunction
|
||||
|
||||
vnoremap s :call Vhdl_toggle_comment()<Enter>
|
||||
|
||||
endfunction
|
||||
|
||||
" ###### haskell ###### "
|
||||
|
||||
function Setup_haskell()
|
||||
set tabstop=4 shiftwidth=4 expandtab
|
||||
|
||||
"command SaveAndCompile_haskell
|
||||
cnoreabbrev c call SaveAndCompile_haskell()
|
||||
"command Debugger_haskell
|
||||
cnoreabbrev d call Debugger_haskell()
|
||||
endfunction
|
||||
|
||||
|
||||
function SaveAndCompile_haskell()
|
||||
:w
|
||||
execute '!ghc ' . @%
|
||||
endfunction
|
||||
|
||||
|
||||
function Debugger_haskell()
|
||||
:w
|
||||
execute '!ghci ' . @%
|
||||
endfunction
|
||||
|
||||
let g:haskell_classic_highlighting = 0
|
||||
let g:haskell_indent_if = 3
|
||||
let g:haskell_intdent_disable = 0
|
||||
let g:haskell_indent_case = 2
|
||||
let g:haskell_indent_let = 4
|
||||
let g:haskell_indent_where = 6
|
||||
let g:haskell_indent_before_where = 2
|
||||
let g:haskell_indent_after_bare_where = 2
|
||||
let g:haskell_indent_do = 3
|
||||
let g:haskell_indent_in = 1
|
||||
let g:haskell_indent_guard = 2
|
||||
let g:haskell_indent_case_alternative = 1
|
||||
let g:cabal_indent_section = 2
|
||||
|
||||
|
||||
|
||||
" ###### rust ###### "
|
||||
|
||||
function Setup_rust()
|
||||
|
||||
vnoremap s :call Rust_toggle_comment()<Enter>
|
||||
|
||||
cnoreabbrev c call Cargo_ceck()
|
||||
cnoreabbrev r call Cargo_run()
|
||||
cnoreabbrev b call Cargo_build()
|
||||
|
||||
endfunction
|
||||
|
||||
function Cargo_build()
|
||||
:w
|
||||
":term cargo build
|
||||
:belowright 20split term://cargo build
|
||||
endfunction
|
||||
|
||||
function Cargo_run()
|
||||
:w
|
||||
":term cargo run
|
||||
:belowright 20split term://cargo run
|
||||
endfunction
|
||||
|
||||
"tnoremap J :call Cargo_jump()
|
||||
augroup MyTermMappings
|
||||
autocmd!
|
||||
autocmd TermOpen * nnoremap <buffer> J :lua Cargo_jump()<Enter>
|
||||
augroup END
|
||||
|
||||
function Cargo_ceck()
|
||||
:w
|
||||
:belowright 20split term://cargo check
|
||||
endfunction
|
||||
|
||||
function Rust_toggle_comment()
|
||||
let line=getline('.')
|
||||
let chars = split(line, '\zs')
|
||||
let index = 0
|
||||
while 1
|
||||
if len(chars) == 0
|
||||
return
|
||||
break
|
||||
endif
|
||||
if chars[index] == " "
|
||||
let index += 1
|
||||
else
|
||||
break
|
||||
endif
|
||||
endwhile
|
||||
if chars[index] == "/"
|
||||
execute 's@^//@@g'
|
||||
else
|
||||
execute 's/^/\/\//g'
|
||||
endif
|
||||
endfunction
|
||||
'';
|
||||
|
||||
extraLuaConfig = ''
|
||||
function Cargo_jump()
|
||||
local line,c = unpack(vim.api.nvim_win_get_cursor(0))
|
||||
local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
|
||||
|
||||
local line_iter = line
|
||||
local line_to_jump = nil
|
||||
local file_to_jump = nil
|
||||
while true do
|
||||
if (lines[line_iter]:sub(1,6) == "error[") then
|
||||
local split_line = mysplit(lines[line_iter +1], ":")
|
||||
line_to_jump = split_line[2]
|
||||
file_to_jump = split_line[1]:sub(6, -1)
|
||||
break
|
||||
end
|
||||
line_iter = line_iter - 1
|
||||
end
|
||||
|
||||
local buffers = get_buffers()
|
||||
local abs_file_to_jump = vim.fn.getcwd() .. "/" .. file_to_jump
|
||||
|
||||
for i,buf in pairs(buffers) do
|
||||
local name = vim.api.nvim_buf_get_name(buf)
|
||||
if name == abs_file_to_jump then
|
||||
local tab_num = get_tab(name)
|
||||
--vim.cmd("tabn 2")
|
||||
return
|
||||
else
|
||||
end
|
||||
end
|
||||
vim.cmd(":tabnew" .. abs_file_to_jump)
|
||||
end
|
||||
|
||||
function get_tab(name)
|
||||
print("there")
|
||||
local listing = vim.api.nvim_command_output("tabs")
|
||||
for i,line in pairs(mysplit(listing, "\n")) do
|
||||
if line:sub(1,8) == "Tab page" then
|
||||
local tab = line:sub(-1)
|
||||
print("tab:", tab)
|
||||
else
|
||||
local file = line:sub(5,-1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mysplit (inputstr, sep)
|
||||
if sep == nil then
|
||||
sep = "%s"
|
||||
end
|
||||
local t={}
|
||||
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
|
||||
table.insert(t, str)
|
||||
end
|
||||
return t
|
||||
end
|
||||
|
||||
|
||||
function dump(o)
|
||||
if type(o) == 'table' then
|
||||
local s = '{ '
|
||||
for k,v in pairs(o) do
|
||||
print(k)
|
||||
if type(k) ~= 'number' then k = '"'..k..'"' end
|
||||
s = s .. '['..k..'] = ' .. dump(v) .. ','
|
||||
end
|
||||
return s .. '} '
|
||||
else
|
||||
return tostring(o)
|
||||
end
|
||||
end
|
||||
|
||||
function get_buffers()
|
||||
local buffers = {}
|
||||
|
||||
for buffer = 1, vim.fn.bufnr('$') do
|
||||
local is_listed = vim.fn.buflisted(buffer) == 1
|
||||
table.insert(buffers, buffer)
|
||||
end
|
||||
|
||||
return buffers
|
||||
end
|
||||
|
||||
'';
|
||||
};
|
||||
}
|
||||
14
common/programms/rofi.nix
Normal file
14
common/programms/rofi.nix
Normal file
@@ -0,0 +1,14 @@
|
||||
{ ... }:
|
||||
{
|
||||
home-manager.users.me.programs.rofi = {
|
||||
enable = true;
|
||||
theme = "Ark-Dark by leofa";
|
||||
extraConfig = ''
|
||||
modi: "run,filebrowser";
|
||||
color-normal: "#1c2023, #919ba0, #1c2023, #a4a4a4, #1c2023";
|
||||
color-urgent: "argb:00000000, #f43753, argb:00000000, argb:00000000, #e29a49";
|
||||
color-active: "argb:00000000, #49bbfb, argb:00000000, argb:00000000, #e29a49";
|
||||
color-window: "#1c2023, #919ba0, #1c2023";
|
||||
'';
|
||||
};
|
||||
}
|
||||
148
common/programms/ssh.nix
Normal file
148
common/programms/ssh.nix
Normal file
@@ -0,0 +1,148 @@
|
||||
{ secretsDir, ... }:
|
||||
{
|
||||
home-manager.users.me.programms.ssh = {
|
||||
enable = true;
|
||||
includes = [ "./current_rpi_config" ];
|
||||
matchBlocks = {
|
||||
hpm = {
|
||||
hostame = "192.168.1.56";
|
||||
use = "root";
|
||||
};
|
||||
|
||||
servers = {
|
||||
hostname = "192.168.1.3";
|
||||
user = "server";
|
||||
extraConfig = ''
|
||||
AddKeysToAgent yes
|
||||
'';
|
||||
identityFile = "${secretsDir}/private-key-main";
|
||||
};
|
||||
|
||||
server = {
|
||||
hostname = "192.168.1.3";
|
||||
user = "admin";
|
||||
extraConfig = ''
|
||||
AddKeysToAgent yes
|
||||
'';
|
||||
identityFile = "${secretsDir}/private-key-main";
|
||||
};
|
||||
|
||||
ocia = {
|
||||
hostname = "140.238.212.229";
|
||||
user = "root";
|
||||
identityFIle = "${secretsDir}/private-key-ocia";
|
||||
};
|
||||
|
||||
ocib = {
|
||||
hostname = "140.238.211.43";
|
||||
user = "root";
|
||||
identityFIle = "${secretsDir}/private-key-ocib";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
home-manager.users.me.home.".ssh/rpi/local".text = ''
|
||||
Host config
|
||||
HostName 192.168.1.2
|
||||
User config
|
||||
Port 49388
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
#RemoteCommand cd /svn/config; bash
|
||||
|
||||
Host rpi
|
||||
HostName 192.168.1.2
|
||||
User admin
|
||||
Port 49388
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
|
||||
Host files
|
||||
HostName 192.168.1.2
|
||||
User files
|
||||
Port 49388
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
|
||||
Host rpis
|
||||
HostName 192.168.1.2
|
||||
User server
|
||||
Port 49388
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
'';
|
||||
|
||||
home-manager.users.me.home.".ssh/rpi/remote".text = ''
|
||||
Host config
|
||||
HostName sebastian.dns.army
|
||||
User config
|
||||
Port 49388
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
#RemoteCommand cd /svn/config; bash
|
||||
|
||||
Host rpi
|
||||
HostName sebastian.dns.army
|
||||
User admin
|
||||
Port 49388
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
|
||||
Host files
|
||||
HostName sebastian.dns.army
|
||||
User files
|
||||
Port 49388
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
|
||||
Host rpis
|
||||
HostName sebastian.dns.army
|
||||
User server
|
||||
Port 49388
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
'';
|
||||
|
||||
home-manager.users.me.home.".ssh/rpi/wstunnel".text = ''
|
||||
Host config
|
||||
HostName localhost
|
||||
User config
|
||||
Port 55555
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
#RemoteCommand cd /svn/config; bash
|
||||
|
||||
Host rpi
|
||||
HostName localhost
|
||||
User admin
|
||||
Port 55555
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
|
||||
Host files
|
||||
HostName localhost
|
||||
User files
|
||||
Port 55555
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
|
||||
Host rpis
|
||||
HostName localhost
|
||||
User server
|
||||
Port 55555
|
||||
AddKeysToAgent yes
|
||||
#UseKeychain yes
|
||||
IdentityFile ${secretsDir}/private-key-main
|
||||
'';
|
||||
}
|
||||
41
common/programms/zathura.nix
Normal file
41
common/programms/zathura.nix
Normal file
@@ -0,0 +1,41 @@
|
||||
{ ... }:
|
||||
{
|
||||
home-manager.users.me.programms.zathura = {
|
||||
enable = true;
|
||||
options = {
|
||||
selection-clipboard = "clipboard";
|
||||
roll-step = 40;
|
||||
};
|
||||
mappings = {
|
||||
"<C-y>" = ''scroll down'';
|
||||
"<C-x>" = ''scroll up'';
|
||||
"<C-o>" = ''scroll left'';
|
||||
"<C-p>" = ''scroll right'';
|
||||
|
||||
"j" = ''feedkeys "4<C-y>"'';
|
||||
"k" = ''feedkeys "4<C-x>"'';
|
||||
"h" = ''feedkeys "4<C-o>"'';
|
||||
"l" = ''feedkeys "4<C-p>"'';
|
||||
|
||||
"J" = ''feedkeys "<C-y>"'';
|
||||
"K" = ''feedkeys "<C-x>"'';
|
||||
"H" = ''feedkeys "<C-o>"'';
|
||||
"L" = ''feedkeys "<C-p>"'';
|
||||
|
||||
"y" = ''zoom in'';
|
||||
"+" = ''feedkeys "yyy"'';
|
||||
"*" = ''feedkeys "y"'';
|
||||
|
||||
"x" = ''zoom out'';
|
||||
"-" = ''feedkeys "xxx"'';
|
||||
"_" = ''feedkeys "x"'';
|
||||
|
||||
"n" = ''navigate next'';
|
||||
"p" = ''navigate previous'';
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
202
flake.lock
generated
Normal file
202
flake.lock
generated
Normal file
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"nodes": {
|
||||
"cachix": {
|
||||
"locked": {
|
||||
"lastModified": 1635350005,
|
||||
"narHash": "sha256-tAMJnUwfaDEB2aa31jGcu7R7bzGELM9noc91L2PbVjg=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "1c1f5649bb9c1b0d98637c8c365228f57126f361",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-20.09",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"firefox": {
|
||||
"inputs": {
|
||||
"cachix": "cachix",
|
||||
"flake-compat": "flake-compat",
|
||||
"lib-aggregate": "lib-aggregate",
|
||||
"mozilla": "mozilla",
|
||||
"nixpkgs": "nixpkgs"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1698022509,
|
||||
"narHash": "sha256-6cZh1c4i+AH0ROeyoAGqYDvF5Vo2xkb9pQsimgNuCng=",
|
||||
"owner": "nix-community",
|
||||
"repo": "flake-firefox-nightly",
|
||||
"rev": "5d544a9b5cefec53621bf3688f2277bb6c0293a4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "flake-firefox-nightly",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat": {
|
||||
"locked": {
|
||||
"lastModified": 1688025799,
|
||||
"narHash": "sha256-ktpB4dRtnksm9F5WawoIkEneh1nrEvuxb5lJFt1iOyw=",
|
||||
"owner": "nix-community",
|
||||
"repo": "flake-compat",
|
||||
"rev": "8bf105319d44f6b9f0d764efa4fdef9f1cc9ba1c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1694529238,
|
||||
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"home-manager": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1695108154,
|
||||
"narHash": "sha256-gSg7UTVtls2yO9lKtP0yb66XBHT1Fx5qZSZbGMpSn2c=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "07682fff75d41f18327a871088d20af2710d4744",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"ref": "release-23.05",
|
||||
"repo": "home-manager",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"lib-aggregate": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1697976504,
|
||||
"narHash": "sha256-sU8q83TEaafIe5d7L6Dc2alRhWT898aB0+6EXcfao1I=",
|
||||
"owner": "nix-community",
|
||||
"repo": "lib-aggregate",
|
||||
"rev": "2e96d2f9d80f80bd22cd7c603985f2b03cf186fc",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "lib-aggregate",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"mozilla": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1695805681,
|
||||
"narHash": "sha256-1ElPLD8eFfnuIk0G52HGGpRtQZ4QPCjChRlEOfkZ5ro=",
|
||||
"owner": "mozilla",
|
||||
"repo": "nixpkgs-mozilla",
|
||||
"rev": "6eabade97bc28d707a8b9d82ad13ef143836736e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "mozilla",
|
||||
"repo": "nixpkgs-mozilla",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1697723726,
|
||||
"narHash": "sha256-SaTWPkI8a5xSHX/rrKzUe+/uVNy6zCGMXgoeMb7T9rg=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "7c9cc5a6e5d38010801741ac830a3f8fd667a7a0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1697935651,
|
||||
"narHash": "sha256-qOfWjQ2JQSQL15KLh6D7xQhx0qgZlYZTYlcEiRuAMMw=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "e1e11fdbb01113d85c7f41cada9d2847660e3902",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1698060352,
|
||||
"narHash": "sha256-c7Thcf2xYTmB4uJpPdb07sPQOIVJWuyjjOfhE4RKq28=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "f4d73aae0f51a1ea3161fc97bf05c683d69bf81c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "release-23.05",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"firefox": "firefox",
|
||||
"home-manager": "home-manager",
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
36
flake.nix
Normal file
36
flake.nix
Normal file
@@ -0,0 +1,36 @@
|
||||
{
|
||||
description = "Sebastian (c2vi)'s NixOS";
|
||||
|
||||
inputs = {
|
||||
#nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/release-23.05";
|
||||
firefox.url = "github:nix-community/flake-firefox-nightly";
|
||||
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager/release-23.05";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
nix-doom-emacs.url = "github:nix-community/nix-doom-emacs";
|
||||
};
|
||||
|
||||
outputs = let
|
||||
confDir = "/home/me/work/config";
|
||||
workDir = "/home/me/work";
|
||||
secretsDir = "/home/me/.mysecrets";
|
||||
persistentDir = "/home/me/work/app-data";
|
||||
in
|
||||
{ self, nixpkgs, ... }@inputs: {
|
||||
nixosConfigurations = {
|
||||
|
||||
"c2vi-main" = nixpkgs.lib.nixosSystem {
|
||||
system = "x86_64-linux";
|
||||
|
||||
specialArgs = [ inputs confDir workDir ];
|
||||
modules = [
|
||||
./hosts/main.nix
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
39
hardware/my-hp-laptop.nix
Normal file
39
hardware/my-hp-laptop.nix
Normal file
@@ -0,0 +1,39 @@
|
||||
# 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, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "uas" "sd_mod" "sdhci_pci" ];
|
||||
boot.initrd.kernelModules = [ "dm-snapshot" ];
|
||||
boot.kernelModules = [ "kvm-intel" ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
fileSystems."/" =
|
||||
{ device = "/dev/disk/by-uuid/356c7b23-71ab-4a01-b700-adbb672bec3e";
|
||||
fsType = "btrfs";
|
||||
};
|
||||
|
||||
fileSystems."/boot" =
|
||||
{ device = "/dev/disk/by-uuid/2588-2509";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices = [ ];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.enp1s0.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.wlp2s0.useDHCP = lib.mkDefault true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
||||
236
hosts/main.nix
Normal file
236
hosts/main.nix
Normal file
@@ -0,0 +1,236 @@
|
||||
|
||||
{ pkgs, lib, workDir, confDir, ... }:
|
||||
{
|
||||
|
||||
# https://bugzilla.kernel.org/show_bug.cgi?id=110941
|
||||
# ??????????? TODO
|
||||
# boot.kernelParams = [ "intel_pstate=no_hwp" ];
|
||||
|
||||
# Supposedly better for the SSD.
|
||||
# ??????????? TODO
|
||||
# fileSystems."/".options = [ "noatime" "nodiratime" "discard" ];
|
||||
|
||||
|
||||
############################# BOOT #############################
|
||||
# boot
|
||||
|
||||
# Setup keyfile
|
||||
boot.initrd.secrets = {
|
||||
"/crypto_keyfile.bin" = null;
|
||||
};
|
||||
|
||||
fileSystems."/home/me/work" =
|
||||
{
|
||||
#label = "work";
|
||||
device = "/dev/disk/by-uuid/fd3c6393-b6fd-4065-baf9-5690eb6ebbed";
|
||||
fsType = "btrfs";
|
||||
neededForBoot = false;
|
||||
};
|
||||
|
||||
|
||||
# Use the GRUB 2 boot loader.
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
version = 2;
|
||||
device = "nodev";
|
||||
efiSupport = true;
|
||||
extraConfig = ''
|
||||
set timeout=1
|
||||
'';
|
||||
};
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
boot.initrd.luks.devices = {
|
||||
root = {
|
||||
#name = "root";
|
||||
device = "/dev/disk/by-uuid/142d2d21-2998-4eb7-9853-ab6554ba061f";
|
||||
preLVM = true;
|
||||
allowDiscards = true;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
############################# MISC #############################
|
||||
# misc
|
||||
|
||||
|
||||
nixpkgs.config.permittedInsecurePackages = [
|
||||
"electron-24.8.6"
|
||||
];
|
||||
|
||||
fileSystems."/tmp" = {
|
||||
fsType = "tmpfs";
|
||||
device = "tmpfs";
|
||||
options = [ "nosuid" "nodev" "relatime" "size=14G" ];
|
||||
};
|
||||
|
||||
|
||||
security.polkit.enable = true;
|
||||
networking.firewall.enable = true;
|
||||
networking.firewall.allowPing = true;
|
||||
services.samba.openFirewall = true;
|
||||
|
||||
# samba
|
||||
services.samba-wsdd.enable = true; # make shares visible for windows 10 clients
|
||||
networking.firewall.allowedTCPPorts = [
|
||||
5357 # wsdd
|
||||
];
|
||||
networking.firewall.allowedUDPPorts = [
|
||||
3702 # wsdd
|
||||
];
|
||||
services.samba = {
|
||||
enable = true;
|
||||
securityType = "user";
|
||||
extraConfig = ''
|
||||
security = user
|
||||
map to guest = bad user
|
||||
guest account = me
|
||||
|
||||
server role = standalone server
|
||||
workgroup = WORKGROUP
|
||||
'';
|
||||
shares = {
|
||||
rpi_schule = {
|
||||
path = "${workDir}/rpi-schule/";
|
||||
"guest ok" = "yes";
|
||||
"read only" = "no";
|
||||
public = "yes";
|
||||
writable = "yes";
|
||||
printable = "no";
|
||||
comment = "share for rpi in school wlan";
|
||||
};
|
||||
|
||||
share = {
|
||||
comment = "share for sharing stuff";
|
||||
path = "${workDir}/share";
|
||||
public = "yes";
|
||||
"guest ok" = "yes";
|
||||
"read only" = "no";
|
||||
writable = "yes";
|
||||
};
|
||||
};
|
||||
};
|
||||
###############
|
||||
|
||||
|
||||
|
||||
nix.settings.experimental-features = [ "nix-command" "flakes" ];
|
||||
security.sudo.wheelNeedsPassword = false;
|
||||
|
||||
virtualisation.libvirtd.enable = true;
|
||||
|
||||
programs.dconf.enable = true;
|
||||
system.activationScripts.setupLibvirt = lib.stringAfter [ "var" ] ''
|
||||
ln -nsf ${workDir}/vm/libvirt/my-image-pool.xml /var/lib/libvirt/storage/my-image-pool.xml
|
||||
ln -nsf ${workDir}/vm/qemu/* /var/lib/libvirt/qemu/
|
||||
|
||||
# there is no /bin/bash
|
||||
# https://discourse.nixos.org/t/add-bin-bash-to-avoid-unnecessary-pain/5673
|
||||
ln -nsf /run/current-system/sw/bin/bash /bin/bash
|
||||
'';
|
||||
|
||||
environment.etc.profile.text = ''
|
||||
export PATH=$PATH:${confDir}/mybin
|
||||
'';
|
||||
|
||||
modules.battery_monitor.enable = true;
|
||||
|
||||
xdg.portal = {
|
||||
enable = true;
|
||||
extraPortals = [
|
||||
#pkgs.xdg-desktop-portal-gtk
|
||||
pkgs.xdg-desktop-portal-termfilechooser
|
||||
];
|
||||
};
|
||||
|
||||
networking.hostName = "c2vi-main"; # Define your hostname.
|
||||
networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
|
||||
services.blueman.enable = true;
|
||||
hardware.bluetooth.enable = true;
|
||||
|
||||
|
||||
################
|
||||
# swap and hibernate
|
||||
|
||||
swapDevices = [ { device = "/dev/lvm0/swap"; } ];
|
||||
boot.resumeDevice = "/dev/lvm0/swap";
|
||||
services.logind = {
|
||||
extraConfig = ''
|
||||
HandlePowerKey=suspend-then-hibernate
|
||||
'';
|
||||
lidSwitch = "suspend-then-hibernate";
|
||||
lidSwitchExternalPower = "suspend-then-hibernate";
|
||||
lidSwitchDocked = "ignore";
|
||||
};
|
||||
systemd.sleep.extraConfig = ''
|
||||
HibernateDelaySec=2h
|
||||
HibernateMode=shutdown
|
||||
'';
|
||||
|
||||
# Enable the X11 windowing system.
|
||||
services.xserver = {
|
||||
enable = true;
|
||||
displayManager = {
|
||||
defaultSession = "none+xmonad";
|
||||
sessionCommands = ''
|
||||
xmobar ${confDir}/xmonad/xmobar.hs &
|
||||
|
||||
# aparently needed, so that xmonad works
|
||||
sleep 2 && \
|
||||
${pkgs.xorg.xmodmap}/bin/xmodmap \
|
||||
-e "clear control" \
|
||||
-e "clear mod1" \
|
||||
-e "keycode 64 = Control_L" \
|
||||
-e "keycode 37 = Alt_L" \
|
||||
-e "add control = Control_L" \
|
||||
-e "add mod1 = Alt_L" \
|
||||
&
|
||||
|
||||
'';
|
||||
};
|
||||
|
||||
displayManager.lightdm = {
|
||||
greeters.enso = {
|
||||
enable = true;
|
||||
blur = true;
|
||||
extraConfig = ''
|
||||
default-wallpaper=/usr/share/streets_of_gruvbox.png
|
||||
'';
|
||||
};
|
||||
};
|
||||
layout = "at";
|
||||
};
|
||||
|
||||
# Configure keymap in X11
|
||||
# services.xserver.xkbOptions = "eurosign:e,caps:escape";
|
||||
|
||||
# Enable CUPS to print documents.
|
||||
# services.printing.enable = true;
|
||||
|
||||
# Enable sound.
|
||||
sound.enable = true;
|
||||
hardware.pulseaudio.enable = true;
|
||||
|
||||
# Enable touchpad support (enabled default in most desktopManager).
|
||||
services.xserver.libinput.enable = true;
|
||||
|
||||
# List packages installed in system profile. To search, run:
|
||||
# $ nix search wget
|
||||
environment.systemPackages = with pkgs; [
|
||||
vim # Do not forget to add an editor to edit configuration.nix!
|
||||
wget
|
||||
xorg.xmodmap
|
||||
bluez
|
||||
];
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It's perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "23.05"; # Did you read the comment?
|
||||
|
||||
}
|
||||
|
||||
|
||||
3
hosts/phone/stuff.md
Normal file
3
hosts/phone/stuff.md
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
- build android with nix flakes
|
||||
nix flake init -t github:danielfullmer/robotnix
|
||||
74
misc/xmobar.hs
Normal file
74
misc/xmobar.hs
Normal file
@@ -0,0 +1,74 @@
|
||||
Config {
|
||||
|
||||
-- appearance
|
||||
font = "xft:Bitstream Vera Sans Mono:size=15:bold:antialias=true"
|
||||
, bgColor = "black"
|
||||
, fgColor = "#646464"
|
||||
, position = Top
|
||||
, border = BottomB
|
||||
, borderColor = "#646464"
|
||||
|
||||
-- layout
|
||||
, sepChar = "%" -- delineator between plugin names and straight text
|
||||
, alignSep = "}{" -- separator between left-right alignment
|
||||
, template = "HI | %dynnetwork% }{ %battery% | %date%"
|
||||
--, template = "%battery% | %multicpu% | %coretemp% | %memory% | %dynnetwork% }{ %RJTT% | %date% || %kbd% "
|
||||
--, template = "%battery% | %multicpu% | %coretemp% | %memory% | %dynnetwork% }{ %RJTT% | %date% || %kbd% "
|
||||
|
||||
-- general behavior
|
||||
, lowerOnStart = True -- send to bottom of window stack on start
|
||||
, hideOnStart = False -- start with window unmapped (hidden)
|
||||
, allDesktops = True -- show on all desktops
|
||||
, overrideRedirect = True -- set the Override Redirect flag (Xlib)
|
||||
, pickBroadest = False -- choose widest display (multi-monitor)
|
||||
, persistent = True -- enable/disable hiding (True = disabled)
|
||||
|
||||
-- plugins
|
||||
-- Numbers can be automatically colored according to their value. xmobar
|
||||
-- decides color based on a three-tier/two-cutoff system, controlled by
|
||||
-- command options:
|
||||
-- --Low sets the low cutoff
|
||||
-- --High sets the high cutoff
|
||||
--
|
||||
-- --low sets the color below --Low cutoff
|
||||
-- --normal sets the color between --Low and --High cutoffs
|
||||
-- --High sets the color above --High cutoff
|
||||
--
|
||||
-- The --template option controls how the plugin is displayed. Text
|
||||
-- color can be set by enclosing in <fc></fc> tags. For more details
|
||||
-- see http://projects.haskell.org/xmobar/#system-monitor-plugins.
|
||||
, commands =
|
||||
[
|
||||
-- network
|
||||
Run DynNetwork [ "--template" , "<dev>: <tx>kB/s|<rx>kB/s"
|
||||
, "--Low" , "1000" -- units: B/s
|
||||
, "--High" , "5000" -- units: B/s
|
||||
, "--low" , "darkgreen"
|
||||
, "--normal" , "darkorange"
|
||||
, "--high" , "darkred"
|
||||
] 10
|
||||
|
||||
-- batery
|
||||
, Run Battery [ "--template" , "Batt: <acstatus>"
|
||||
, "--Low" , "10" -- units: %
|
||||
, "--High" , "80" -- units: %
|
||||
, "--low" , "darkred"
|
||||
, "--normal" , "darkorange"
|
||||
, "--high" , "darkgreen"
|
||||
|
||||
, "--" -- battery specific options
|
||||
-- discharging status
|
||||
, "-o" , "<left>% (<timeleft>)"
|
||||
-- AC "on" status
|
||||
, "-O" , "<fc=#dAA520>Charging</fc>"
|
||||
-- charged status
|
||||
, "-i" , "<fc=#006000>Charged</fc>"
|
||||
] 50
|
||||
|
||||
-- time and date indicator
|
||||
-- (%F = y-m-d date, %a = day of week, %T = h:m:s time)
|
||||
, Run Date "<fc=#ABABAB>%F (%a) %T</fc>" "date" 10
|
||||
|
||||
]
|
||||
|
||||
}
|
||||
364
misc/xmonad.hs
Normal file
364
misc/xmonad.hs
Normal file
@@ -0,0 +1,364 @@
|
||||
-- xmonad example config file.
|
||||
--
|
||||
-- A template showing all available configuration hooks,
|
||||
-- and how to override the defaults in your own xmonad.hs conf file.
|
||||
--
|
||||
-- Normally, you'd only override those defaults you care about.
|
||||
--
|
||||
|
||||
import XMonad
|
||||
import Data.Monoid
|
||||
import System.Exit
|
||||
|
||||
--for xmobar
|
||||
import XMonad.Hooks.DynamicLog
|
||||
import XMonad.Hooks.StatusBar
|
||||
import XMonad.Hooks.StatusBar.PP
|
||||
import XMonad.Hooks.SetWMName
|
||||
import XMonad.Hooks.EwmhDesktops
|
||||
|
||||
|
||||
import qualified XMonad.StackSet as W
|
||||
import qualified Data.Map as M
|
||||
|
||||
-- The preferred terminal program, which is used in a binding below and by
|
||||
-- certain contrib modules.
|
||||
--
|
||||
myTerminal = "alacritty"
|
||||
|
||||
-- Whether focus follows the mouse pointer.
|
||||
myFocusFollowsMouse :: Bool
|
||||
myFocusFollowsMouse = True
|
||||
|
||||
-- Whether clicking on a window to focus also passes the click to the window
|
||||
myClickJustFocuses :: Bool
|
||||
myClickJustFocuses = False
|
||||
|
||||
-- Width of the window border in pixels.
|
||||
--
|
||||
myBorderWidth = 2
|
||||
|
||||
-- modMask lets you specify which modkey you want to use. The default
|
||||
-- is mod1Mask ("left alt"). You may also consider using mod3Mask
|
||||
-- ("right alt"), which does not conflict with emacs keybindings. The
|
||||
-- "windows key" is usually mod4Mask.
|
||||
--
|
||||
myModMask = mod4Mask
|
||||
|
||||
-- The default number of workspaces (virtual screens) and their names.
|
||||
-- By default we use numeric strings, but any string may be used as a
|
||||
-- workspace name. The number of workspaces is determined by the length
|
||||
-- of this list.
|
||||
--
|
||||
-- A tagging example:
|
||||
--
|
||||
-- > workspaces = ["web", "irc", "code" ] ++ map show [4..9]
|
||||
--
|
||||
myWorkspaces = ["1","2","3","4","5","6","7","8","9"]
|
||||
|
||||
-- Border colors for unfocused and focused windows, respectively.
|
||||
--
|
||||
myNormalBorderColor = "#dddddd"
|
||||
myFocusedBorderColor = "#ff0000"
|
||||
-- myFocusedBorderColor = "#68cedc"
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- Key bindings. Add, modify or remove key bindings here.
|
||||
--
|
||||
myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
|
||||
|
||||
[
|
||||
|
||||
-- launch a terminal
|
||||
((modm .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf),
|
||||
|
||||
-- enable keyboard
|
||||
--((button2), spawn "xinput enable 17"),
|
||||
--((modm .|. button2, \w -> focus w >> windows W.shiftMaster),
|
||||
|
||||
|
||||
-- player next
|
||||
((modm, xK_n), spawn "playerctl next"),
|
||||
-- player previous
|
||||
((modm .|. shiftMask, xK_n), spawn "playerctl previous"),
|
||||
-- player play-pause
|
||||
((modm , xK_c), spawn "playerctl play-pause"),
|
||||
-- player volume up
|
||||
((modm , xK_v), spawn "amixer set Master 3%+"),
|
||||
-- player volume down
|
||||
((modm .|. shiftMask, xK_v), spawn "amixer set Master 3%-"),
|
||||
|
||||
-- xrandr
|
||||
((modm .|. shiftMask, xK_d), spawn "xrandr --output eDP-1 --off"),
|
||||
|
||||
((modm .|. shiftMask, xK_f), spawn "bash -c \"kill -9 $(pgrep firefox)\""),
|
||||
|
||||
((modm , xK_d), spawn "xrandr --output eDP-1 --auto"),
|
||||
|
||||
|
||||
-- launch dmenu
|
||||
((modm, xK_p ), spawn "nice -n 7 rofi -show run"),
|
||||
|
||||
-- close focused window
|
||||
((modm .|. shiftMask, xK_c ), kill),
|
||||
|
||||
-- Rotate through the available layout algorithms
|
||||
((modm, xK_space ), sendMessage NextLayout),
|
||||
|
||||
-- Reset the layouts on the current workspace to default
|
||||
((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf),
|
||||
|
||||
-- Resize viewed windows to the correct size
|
||||
--((modm, xK_n ), refresh),
|
||||
|
||||
-- Move focus to the next window
|
||||
((modm, xK_Tab ), windows W.focusDown),
|
||||
|
||||
-- Move focus to the next window
|
||||
((modm, xK_j ), windows W.focusDown),
|
||||
|
||||
-- Move focus to the previous window
|
||||
((modm, xK_k ), windows W.focusUp ),
|
||||
|
||||
-- Move focus to the master window
|
||||
--((modm, xK_m ), windows W.focusMaster ),
|
||||
|
||||
-- Swap the focused window and the master window
|
||||
((modm, xK_Return), windows W.swapMaster),
|
||||
|
||||
-- Swap the focused window with the next window
|
||||
((modm .|. shiftMask, xK_j ), windows W.swapDown ),
|
||||
|
||||
-- Swap the focused window with the previous window
|
||||
((modm .|. shiftMask, xK_k ), windows W.swapUp ),
|
||||
|
||||
-- Shrink the master area
|
||||
((modm, xK_h ), sendMessage Shrink),
|
||||
|
||||
-- Expand the master area
|
||||
((modm, xK_l ), sendMessage Expand),
|
||||
|
||||
-- Push window back into tiling
|
||||
((modm, xK_t ), withFocused $ windows . W.sink),
|
||||
|
||||
-- Increment the number of windows in the master area
|
||||
((modm , xK_comma ), sendMessage (IncMasterN 1)),
|
||||
|
||||
-- Deincrement the number of windows in the master area
|
||||
((modm , xK_period), sendMessage (IncMasterN (-1))),
|
||||
|
||||
-- Toggle the status bar gap
|
||||
-- Use this binding with avoidStruts from Hooks.ManageDocks.
|
||||
-- See also the statusBar function from Hooks.DynamicLog.
|
||||
--
|
||||
-- , ((modm , xK_b ), sendMessage ToggleStruts)
|
||||
|
||||
-- Quit xmonad
|
||||
((modm .|. shiftMask, xK_q ), io exitSuccess),
|
||||
|
||||
-- Restart xmonad
|
||||
((modm , xK_q ), spawn "xmonad --recompile; xmonad --restart")
|
||||
|
||||
-- Run xmessage with a summary of the default keybindings (useful for beginners)
|
||||
--, ((modm .|. shiftMask, xK_slash ), xmessage help)
|
||||
]
|
||||
++
|
||||
|
||||
--
|
||||
-- mod-[1..9], Switch to workspace N
|
||||
-- mod-shift-[1..9], Move client to workspace N
|
||||
--
|
||||
[((m .|. modm, k), windows $ f i)
|
||||
| (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
|
||||
, (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
|
||||
++
|
||||
|
||||
--
|
||||
-- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3
|
||||
-- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3
|
||||
--
|
||||
[((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f))
|
||||
| (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]
|
||||
, (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
|
||||
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- Mouse bindings: default actions bound to mouse events
|
||||
--
|
||||
myMouseBindings (XConfig {XMonad.modMask = modm}) = M.fromList
|
||||
|
||||
-- mod-button1, Set the window to floating mode and move by dragging
|
||||
[ ((modm, button1), \w -> focus w >> mouseMoveWindow w
|
||||
>> windows W.shiftMaster)
|
||||
|
||||
-- mod-button2, Raise the window to the top of the stack
|
||||
-- , ((button2), spawn "xinput enable 17")
|
||||
|
||||
-- mod-button3, Set the window to floating mode and resize by dragging
|
||||
, ((modm, button3), \w -> focus w >> mouseResizeWindow w
|
||||
>> windows W.shiftMaster)
|
||||
|
||||
-- you may also bind events to the mouse scroll wheel (button4 and button5)
|
||||
]
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- Layouts:
|
||||
|
||||
-- You can specify and transform your layouts by modifying these values.
|
||||
-- If you change layout bindings be sure to use 'mod-shift-space' after
|
||||
-- restarting (with 'mod-q') to reset your layout state to the new
|
||||
-- defaults, as xmonad preserves your old layout settings by default.
|
||||
--
|
||||
-- The available layouts. Note that each layout is separated by |||,
|
||||
-- which denotes layout choice.
|
||||
--
|
||||
myLayout = tiled ||| Full
|
||||
where
|
||||
-- default tiling algorithm partitions the screen into two panes
|
||||
tiled = Tall nmaster delta ratio
|
||||
|
||||
-- The default number of windows in the master pane
|
||||
nmaster = 1
|
||||
|
||||
-- Default proportion of screen occupied by master pane
|
||||
ratio = 1/2
|
||||
|
||||
-- Percent of screen to increment by when resizing panes
|
||||
delta = 3/100
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- Window rules:
|
||||
|
||||
-- Execute arbitrary actions and WindowSet manipulations when managing
|
||||
-- a new window. You can use this to, for example, always float a
|
||||
-- particular program, or have a client always appear on a particular
|
||||
-- workspace.
|
||||
--
|
||||
-- To find the property name associated with a program, use
|
||||
-- > xprop | grep WM_CLASS
|
||||
-- and click on the client you're interested in.
|
||||
--
|
||||
-- To match on the WM_NAME, you can use 'title' in the same way that
|
||||
-- 'className' and 'resource' are used below.
|
||||
--
|
||||
myManageHook = composeAll
|
||||
[
|
||||
className =? "MPlayer" --> doFloat,
|
||||
className =? "Gimp" --> doFloat,
|
||||
resource =? "desktop_window" --> doIgnore,
|
||||
resource =? "kdesktop" --> doIgnore
|
||||
]
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- Event handling
|
||||
|
||||
-- * EwmhDesktops users should change this to ewmhDesktopsEventHook
|
||||
--
|
||||
-- Defines a custom handler function for X Events. The function should
|
||||
-- return (All True) if the default handler is to be run afterwards. To
|
||||
-- combine event hooks use mappend or mconcat from Data.Monoid.
|
||||
--
|
||||
myEventHook = ewmhFullscreen
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- Status bars and logging
|
||||
|
||||
-- Perform an arbitrary action on each internal state change or X event.
|
||||
-- See the 'XMonad.Hooks.DynamicLog' extension for examples.
|
||||
--
|
||||
myLogHook = return ()
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- Startup hook
|
||||
|
||||
-- Perform an arbitrary action each time xmonad starts or is restarted
|
||||
-- with mod-q. Used by, e.g., XMonad.Layout.PerWorkspace to initialize
|
||||
-- per-workspace layout choices.
|
||||
--
|
||||
myStartupHook = do
|
||||
spawn "echo hiiiiiiiiiiiiiiiiiiiiiiiiiiii | sudo tee -a /dev/kmsg"
|
||||
spawn "bash ~/work/virtchord/run &"
|
||||
spawn "xset r rate 130 85"
|
||||
-- spawn "sudo swapon /swapfile"
|
||||
spawn "setxkbmap de"
|
||||
setWMName "LG3D"
|
||||
|
||||
|
||||
main = xmonad $ xmobarProp $ myConfig
|
||||
|
||||
|
||||
myConfig = ewmh def {
|
||||
-- simple stuff
|
||||
terminal = myTerminal,
|
||||
focusFollowsMouse = myFocusFollowsMouse,
|
||||
clickJustFocuses = myClickJustFocuses,
|
||||
borderWidth = myBorderWidth,
|
||||
modMask = myModMask,
|
||||
workspaces = myWorkspaces,
|
||||
normalBorderColor = myNormalBorderColor,
|
||||
focusedBorderColor = myFocusedBorderColor,
|
||||
|
||||
-- key bindings
|
||||
keys = myKeys,
|
||||
mouseBindings = myMouseBindings,
|
||||
|
||||
-- hooks, layouts
|
||||
layoutHook = myLayout,
|
||||
manageHook = myManageHook,
|
||||
handleEventHook = handleEventHook def <+> fullscreenEventHook,
|
||||
logHook = myLogHook,
|
||||
startupHook = myStartupHook
|
||||
}
|
||||
|
||||
|
||||
-- | Finally, a copy of the default bindings in simple textual tabular format.
|
||||
help :: String
|
||||
help = unlines ["The default modifier key is 'alt'. Default keybindings:",
|
||||
"",
|
||||
"-- launching and killing programs",
|
||||
"mod-Shift-Enter Launch xterminal",
|
||||
"mod-p Launch dmenu",
|
||||
"mod-Shift-p Launch gmrun",
|
||||
"mod-Shift-c Close/kill the focused window",
|
||||
"mod-Space Rotate through the available layout algorithms",
|
||||
"mod-Shift-Space Reset the layouts on the current workSpace to default",
|
||||
"mod-n Resize/refresh viewed windows to the correct size",
|
||||
"mod-Shift-/ Show this help message with the default keybindings",
|
||||
"",
|
||||
"-- move focus up or down the window stack",
|
||||
"mod-Tab Move focus to the next window",
|
||||
"mod-Shift-Tab Move focus to the previous window",
|
||||
"mod-j Move focus to the next window",
|
||||
"mod-k Move focus to the previous window",
|
||||
"mod-m Move focus to the master window",
|
||||
"",
|
||||
"-- modifying the window order",
|
||||
"mod-Return Swap the focused window and the master window",
|
||||
"mod-Shift-j Swap the focused window with the next window",
|
||||
"mod-Shift-k Swap the focused window with the previous window",
|
||||
"",
|
||||
"-- resizing the master/slave ratio",
|
||||
"mod-h Shrink the master area",
|
||||
"mod-l Expand the master area",
|
||||
"",
|
||||
"-- floating layer support",
|
||||
"mod-t Push window back into tiling; unfloat and re-tile it",
|
||||
"",
|
||||
"-- increase or decrease number of windows in the master area",
|
||||
"mod-comma (mod-,) Increment the number of windows in the master area",
|
||||
"mod-period (mod-.) Deincrement the number of windows in the master area",
|
||||
"",
|
||||
"-- quit, or restart",
|
||||
"mod-Shift-q Quit xmonad",
|
||||
"mod-q Restart xmonad",
|
||||
"mod-[1..9] Switch to workSpace N",
|
||||
"",
|
||||
"-- Workspaces & screens",
|
||||
"mod-Shift-[1..9] Move client to workspace N",
|
||||
"mod-{w,e,r} Switch to physical/Xinerama screens 1, 2, or 3",
|
||||
"mod-Shift-{w,e,r} Move client to screen 1, 2, or 3",
|
||||
"",
|
||||
"-- Mouse bindings: default actions bound to mouse events",
|
||||
"mod-button1 Set the window to floating mode and move by dragging",
|
||||
"mod-button2 Raise the window to the top of the stack",
|
||||
"mod-button3 Set the window to floating mode and resize by dragging"]
|
||||
53
mods/battery_monitor.nix
Normal file
53
mods/battery_monitor.nix
Normal file
@@ -0,0 +1,53 @@
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
# Regularly check the battery status and send a notification when it discharges
|
||||
# below certain thresholds.
|
||||
# Implemented by calling the `acpi` program regularly. This is the simpler and
|
||||
# safer approach because the battery might not send discharging events.
|
||||
|
||||
let conf = config.modules.battery_monitor;
|
||||
|
||||
in {
|
||||
options.modules.battery_monitor = with lib; {
|
||||
enable = mkEnableOption "battery_monitor";
|
||||
};
|
||||
|
||||
config = lib.mkIf conf.enable {
|
||||
# Regularly check battery status
|
||||
systemd.user.services.battery_monitor = {
|
||||
wants = [ "display-manager.service" ];
|
||||
wantedBy = [ "graphical-session.target" ];
|
||||
script = ''
|
||||
count_10=0
|
||||
prev_val=100
|
||||
check () { [[ $1 -ge $val ]] && [[ $1 -lt $prev_val ]]; }
|
||||
notify () {
|
||||
${pkgs.libnotify}/bin/notify-send -a Battery "$@" \
|
||||
-h "int:value:$val" "Discharging" "$val%, $remaining"
|
||||
}
|
||||
while true; do
|
||||
IFS=: read _ bat0 < <(${pkgs.acpi}/bin/acpi -b)
|
||||
IFS=\ , read status val remaining <<<"$bat0"
|
||||
val=''${val%\%}
|
||||
if [[ $status = Discharging ]]; then
|
||||
echo "$val%, $remaining"
|
||||
|
||||
if check 20; then notify
|
||||
elif check 15 || [[ $val -le 7 ]]; then notify -u critical
|
||||
elif [[ $val -le 4 ]]
|
||||
then
|
||||
${pkgs.notify}/bin/notify-send -a Hibernate soon...
|
||||
sleep 10
|
||||
${pkgs.notify}/bin/notify-send -a Hibernate NOW
|
||||
sudo systemctl hibernate
|
||||
fi
|
||||
fi
|
||||
prev_val=$val
|
||||
# Sleep longer when battery is high to save CPU
|
||||
if [[ $val -gt 30 ]]; then sleep 10m; elif [[ $val -ge 20 ]]; then sleep 5m; else sleep 1m; fi
|
||||
done
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
}
|
||||
11
mods/my-nixpkgs-overlay.nix
Normal file
11
mods/my-nixpkgs-overlay.nix
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
{ pkgs, confDir, inputs, ... }:
|
||||
{
|
||||
nixpkgs.overlays = [
|
||||
{
|
||||
localPacketTracer8 = (pkgs.callPackage ../../prebuilt/packetTracer/default.nix {confDir = confDir;});
|
||||
xdg-desktop-portal-termfilechooser = (pkgs.callPackage ../../mods/xdg-desktop-portal-termfilechooser/default.nix {});
|
||||
firefox = inputs.firefox.packages.${pkgs.system}.firefox-nightly-bin;
|
||||
}
|
||||
];
|
||||
}
|
||||
86
mods/xdg-desktop-portal-termfilechooser/default.nix
Normal file
86
mods/xdg-desktop-portal-termfilechooser/default.nix
Normal file
@@ -0,0 +1,86 @@
|
||||
|
||||
{ lib
|
||||
, stdenv
|
||||
, fetchFromGitHub
|
||||
, meson
|
||||
, pkgconfig
|
||||
, inih
|
||||
, systemd
|
||||
, scdoc
|
||||
, ninja
|
||||
, pkgs
|
||||
, alacritty
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "xdg-desktop-portal-termfilechooser";
|
||||
version = "0.0.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "GermainZ";
|
||||
repo = "xdg-desktop-portal-termfilechooser";
|
||||
rev = "71dc7ab06751e51de392b9a7af2b50018e40e062";
|
||||
hash = "sha256-645hoLhQNncqfLKcYCgWLbSrTRUNELh6EAdgUVq3ypM=";
|
||||
};
|
||||
|
||||
#doCheck = true;
|
||||
#doUnpack = true;
|
||||
|
||||
#passthru.tests.version =
|
||||
#testVersion { package = hello; };
|
||||
|
||||
nativeBuildInputs = [
|
||||
meson
|
||||
pkgconfig
|
||||
inih
|
||||
systemd
|
||||
scdoc
|
||||
ninja
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
systemd
|
||||
];
|
||||
|
||||
patches = [
|
||||
./xdg-desktop-portal-termfilechooser-add-x11.patch
|
||||
./test.patch
|
||||
./test2.patch
|
||||
./meson-build.patch
|
||||
./lf-wrapper.patch
|
||||
|
||||
];
|
||||
|
||||
mesonFlags = [
|
||||
"-Dsd-bus-provider=libsystemd"
|
||||
];
|
||||
|
||||
installPhase = ''
|
||||
ninja install
|
||||
'';
|
||||
|
||||
postConfigure = ''
|
||||
substituteInPlace ../src/core/config.c --replace '#define FILECHOOSER_DEFAULT_CMD "/usr/share/xdg-desktop-portal-termfilechooser/ranger-wrapper.sh"' '#define FILECHOOSER_DEFAULT_CMD "${placeholder "out"}/share/xdg-desktop-portal-termfilechooser/lf-wrapper.sh"'
|
||||
|
||||
ls ../contrib
|
||||
substituteInPlace ../contrib/lf-wrapper.sh --replace '#CCCMMMDDD' '${alacritty}/bin/alacritty'
|
||||
|
||||
echo "###### start"
|
||||
cat ../src/core/config.c
|
||||
echo "###### end"
|
||||
|
||||
'';
|
||||
#exit 1
|
||||
#substituteInPlace ../src/core/config.c --replace '#define FILECHOOSER_DEFAULT_DIR "/tmp"' '#define FILECHOOSER_DEFAULT_DIR "${placeholder "out"}/share/xdg-desktop-portal/portals/termfilechooser.portal"'
|
||||
|
||||
meta = with lib; {
|
||||
description = "A xdg portal, that let's you use your favourite terminal file chooser to choose files acroos all applications";
|
||||
longDescription = "A long description";
|
||||
homepage = "https://github.com/GermainZ/xdg-desktop-portal-termfilechooser";
|
||||
license = licenses.mit;
|
||||
maintainers = [ maintainers.eelco ];
|
||||
platforms = platforms.all;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
78
mods/xdg-desktop-portal-termfilechooser/flake.nix
Normal file
78
mods/xdg-desktop-portal-termfilechooser/flake.nix
Normal file
@@ -0,0 +1,78 @@
|
||||
{
|
||||
description = "xdg-desktop-portal-termfilechooser";
|
||||
|
||||
#inputs = {
|
||||
#nixpkgs.url = "github:NixOS/nixpkgs/release-23.05";
|
||||
#};
|
||||
|
||||
outputs = { self, nixpkgs }: {
|
||||
packages.x86_64-linux.default = with nixpkgs.x86_64.pkgs; pkgs.mkDerivation rec {
|
||||
pname = "xdg-desktop-portal-termfilechooser";
|
||||
version = "0.0.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "GermainZ";
|
||||
repo = "xdg-desktop-portal-termfilechooser";
|
||||
rev = "71dc7ab06751e51de392b9a7af2b50018e40e062";
|
||||
hash = "sha256-645hoLhQNncqfLKcYCgWLbSrTRUNELh6EAdgUVq3ypM=";
|
||||
};
|
||||
|
||||
#doCheck = true;
|
||||
#doUnpack = true;
|
||||
|
||||
#passthru.tests.version =
|
||||
#testVersion { package = hello; };
|
||||
|
||||
nativeBuildInputs = [
|
||||
meson
|
||||
pkgconfig
|
||||
inih
|
||||
systemd
|
||||
scdoc
|
||||
ninja
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
systemd
|
||||
];
|
||||
|
||||
patches = [
|
||||
./xdg-desktop-portal-termfilechooser-add-x11.patch
|
||||
./test.patch
|
||||
./test2.patch
|
||||
./meson-build.patch
|
||||
./lf-wrapper.patch
|
||||
];
|
||||
|
||||
mesonFlags = [
|
||||
"-Dsd-bus-provider=libsystemd"
|
||||
];
|
||||
|
||||
installPhase = ''
|
||||
ninja install
|
||||
'';
|
||||
|
||||
postConfigure = ''
|
||||
substituteInPlace ../src/core/config.c --replace '#define FILECHOOSER_DEFAULT_CMD "/usr/share/xdg-desktop-portal-termfilechooser/ranger-wrapper.sh"' '#define FILECHOOSER_DEFAULT_CMD "${placeholder "out"}/share/xdg-desktop-portal-termfilechooser/lf-wrapper.sh"'
|
||||
|
||||
ls ../contrib
|
||||
substituteInPlace ../contrib/lf-wrapper.sh --replace '#CCCMMMDDD' '${alacritty}/bin/alacritty'
|
||||
|
||||
echo "###### start"
|
||||
cat ../src/core/config.c
|
||||
echo "###### end"
|
||||
|
||||
'';
|
||||
#exit 1
|
||||
#substituteInPlace ../src/core/config.c --replace '#define FILECHOOSER_DEFAULT_DIR "/tmp"' '#define FILECHOOSER_DEFAULT_DIR "${placeholder "out"}/share/xdg-desktop-portal/portals/termfilechooser.portal"'
|
||||
|
||||
meta = with lib; {
|
||||
description = "A xdg portal, that let's you use your favourite terminal file chooser to choose files acroos all applications";
|
||||
longDescription = "A long description";
|
||||
homepage = "https://github.com/GermainZ/xdg-desktop-portal-termfilechooser";
|
||||
license = licenses.mit;
|
||||
maintainers = [ maintainers.eelco ];
|
||||
platforms = platforms.all;
|
||||
};
|
||||
};
|
||||
}
|
||||
42
mods/xdg-desktop-portal-termfilechooser/lf-wrapper.patch
Normal file
42
mods/xdg-desktop-portal-termfilechooser/lf-wrapper.patch
Normal file
@@ -0,0 +1,42 @@
|
||||
diff --git a/contrib/lf-wrapper.sh b/contrib/lf-wrapper.sh
|
||||
new file mode 100755
|
||||
index 0000000..9b9a20d
|
||||
--- /dev/null
|
||||
+++ b/contrib/lf-wrapper.sh
|
||||
@@ -0,0 +1,36 @@
|
||||
+#!/bin/sh
|
||||
+# This wrapper script is invoked by xdg-desktop-portal-termfilechooser.
|
||||
+#
|
||||
+# Inputs:
|
||||
+# 1. "1" if multiple files can be chosen, "0" otherwise.
|
||||
+# 2. "1" if a directory should be chosen, "0" otherwise.
|
||||
+# 3. "0" if opening files was requested, "1" if writing to a file was
|
||||
+# requested. For example, when uploading files in Firefox, this will be "0".
|
||||
+# When saving a web page in Firefox, this will be "1".
|
||||
+# 4. If writing to a file, this is recommended path provided by the caller. For
|
||||
+# example, when saving a web page in Firefox, this will be the recommended
|
||||
+# path Firefox provided, such as "~/Downloads/webpage_title.html".
|
||||
+# Note that if the path already exists, we keep appending "_" to it until we
|
||||
+# get a path that does not exist.
|
||||
+# 5. The output path, to which results should be written.
|
||||
+#
|
||||
+# Output:
|
||||
+# The script should print the selected paths to the output path (argument #5),
|
||||
+# one path per line.
|
||||
+# If nothing is printed, then the operation is assumed to have been canceled.
|
||||
+
|
||||
+multiple="$1"
|
||||
+directory="$2"
|
||||
+save="$3"
|
||||
+path="$4"
|
||||
+out="$5"
|
||||
+
|
||||
+echo teeeeeeeeeeeeeeeeeeeeeeeeeeest
|
||||
+read
|
||||
+
|
||||
+#mdolphin
|
||||
+#alacritty
|
||||
+#CCCMMMDDD
|
||||
+
|
||||
+
|
||||
+exit
|
||||
16
mods/xdg-desktop-portal-termfilechooser/meson-build.patch
Normal file
16
mods/xdg-desktop-portal-termfilechooser/meson-build.patch
Normal file
@@ -0,0 +1,16 @@
|
||||
diff --git a/meson.build b/meson.build
|
||||
index 8225b6f..f416565 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -109,6 +109,11 @@ install_data(
|
||||
install_dir: join_paths(get_option('datadir'), 'xdg-desktop-portal-termfilechooser'),
|
||||
)
|
||||
|
||||
+install_data(
|
||||
+ 'contrib/lf-wrapper.sh',
|
||||
+ install_dir: join_paths(get_option('datadir'), 'xdg-desktop-portal-termfilechooser'),
|
||||
+)
|
||||
+
|
||||
scdoc = dependency('scdoc', required: get_option('man-pages'), version: '>= 1.9.7')
|
||||
if scdoc.found()
|
||||
man_pages = ['xdg-desktop-portal-termfilechooser.5.scd']
|
||||
14
mods/xdg-desktop-portal-termfilechooser/test.patch
Normal file
14
mods/xdg-desktop-portal-termfilechooser/test.patch
Normal file
@@ -0,0 +1,14 @@
|
||||
diff --git a/contrib/ranger-wrapper.sh b/contrib/ranger-wrapper.sh
|
||||
index 88bc697..b5d3fe0 100755
|
||||
--- a/contrib/ranger-wrapper.sh
|
||||
+++ b/contrib/ranger-wrapper.sh
|
||||
@@ -25,6 +25,9 @@ save="$3"
|
||||
path="$4"
|
||||
out="$5"
|
||||
|
||||
+echo hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
|
||||
+read
|
||||
+
|
||||
cmd="/usr/bin/ranger"
|
||||
termcmd="${TERMCMD:-/usr/bin/kitty}"
|
||||
|
||||
21
mods/xdg-desktop-portal-termfilechooser/test2.patch
Normal file
21
mods/xdg-desktop-portal-termfilechooser/test2.patch
Normal file
@@ -0,0 +1,21 @@
|
||||
diff --git a/src/filechooser/filechooser.c b/src/filechooser/filechooser.c
|
||||
index 6cecec6..bd9ba7f 100644
|
||||
--- a/src/filechooser/filechooser.c
|
||||
+++ b/src/filechooser/filechooser.c
|
||||
@@ -19,6 +19,7 @@ static const char interface_name[] = "org.freedesktop.impl.portal.FileChooser";
|
||||
static int exec_filechooser(void *data, bool writing, bool multiple, bool directory, char *path, char ***selected_files, size_t *num_selected_files) {
|
||||
struct xdpw_state *state = data;
|
||||
char *cmd_script = state->config->filechooser_conf.cmd;
|
||||
+ logprint(ERROR, "hiiiiiiiiiiiiiii ... cmd_script: %s", cmd_script);
|
||||
if (!cmd_script) {
|
||||
logprint(ERROR, "cmd not specified");
|
||||
return -1;
|
||||
@@ -33,7 +34,7 @@ static int exec_filechooser(void *data, bool writing, bool multiple, bool direct
|
||||
snprintf(cmd, str_size, "%s %d %d %d \"%s\" \"%s\"", cmd_script, multiple, directory, writing, path, PATH_PORTAL);
|
||||
|
||||
remove(PATH_PORTAL);
|
||||
- logprint(TRACE, "executing command: %s", cmd);
|
||||
+ logprint(ERROR, "executing command: %s", cmd);
|
||||
int ret = system(cmd);
|
||||
if (ret) {
|
||||
logprint(ERROR, "could not execute %s: %d", cmd, errno);
|
||||
@@ -0,0 +1,10 @@
|
||||
diff --git a/termfilechooser.portal b/termfilechooser.portal
|
||||
index f072ba0..65f21d8 100644
|
||||
--- a/termfilechooser.portal
|
||||
+++ b/termfilechooser.portal
|
||||
@@ -1,4 +1,4 @@
|
||||
[portal]
|
||||
DBusName=org.freedesktop.impl.portal.desktop.termfilechooser
|
||||
Interfaces=org.freedesktop.impl.portal.FileChooser;
|
||||
-UseIn=i3;wlroots;sway;Wayfire;river;mate;lxde;openbox;unity;pantheon
|
||||
+UseIn=i3;wlroots;sway;Wayfire;river;mate;lxde;openbox;unity;pantheon;x11
|
||||
4
mybin/dim
Executable file
4
mybin/dim
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
xinput disable "Logitech Wireless Mouse"
|
||||
|
||||
5
mybin/disp
Executable file
5
mybin/disp
Executable file
@@ -0,0 +1,5 @@
|
||||
|
||||
cmd=$1
|
||||
|
||||
out-default="xrandr --output HDMI-1 --same-as eDP-1 --mode 1920x1080"
|
||||
|
||||
4
mybin/enm
Executable file
4
mybin/enm
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
xinput enable "Logitech Wireless Mouse"
|
||||
|
||||
19
mybin/fingre
Executable file
19
mybin/fingre
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
|
||||
v_flag=""
|
||||
flag=""
|
||||
|
||||
while getopts ':v:' flag; do
|
||||
case "${flag}" in
|
||||
v) v_flag="${OPTARG}";;
|
||||
*) echo "invalid flag"
|
||||
exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "$v_flag" == "" ]]
|
||||
then
|
||||
find . -not -type d | xargs grep $@ 2>/dev/null
|
||||
else
|
||||
find . -not -type d | grep -v "$v_flag" | xargs grep $@ 2>/dev/null
|
||||
fi
|
||||
5
mybin/mdolphin
Executable file
5
mybin/mdolphin
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
QT_STYLE_OVERRIDE=breeze QT_SCALE_FACTOR=1.3 QT_QPA_PLATFORMTHEME=qt5ct dolphin
|
||||
|
||||
|
||||
5
mybin/mshot
Executable file
5
mybin/mshot
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
#gnome-screenshot -ia
|
||||
flameshot gui
|
||||
|
||||
58
mybin/mvn
Executable file
58
mybin/mvn
Executable file
@@ -0,0 +1,58 @@
|
||||
#!/bin/bash
|
||||
|
||||
#revert:
|
||||
|
||||
#svn st | grep ^D | cut -c 9- | sed 's/^/"/' | sed 's/$/"/' | xargs svn revert -R
|
||||
#svn st | grep ^A | cut -c 9- | sed 's/^/"/' | sed 's/$/"/' | xargs svn revert -R
|
||||
|
||||
|
||||
if [ "$1" == "cut" ]
|
||||
then
|
||||
cut -c 9- | sed 's/^/"/' | sed 's/$/"/'
|
||||
fi
|
||||
|
||||
|
||||
if [ "$1" == "e" ]
|
||||
then
|
||||
if [ "$2" == "" ]
|
||||
then
|
||||
export SVN_EDITOR=nvim
|
||||
echo "DONE: export SVN_EDITOR=nvim"
|
||||
|
||||
else
|
||||
export SVN_EDITOR=nvim
|
||||
svn propedit svn:ignore $2
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if [ "$1" == "ignore" ]
|
||||
then
|
||||
if [ -t 0 ]
|
||||
then
|
||||
echo
|
||||
else
|
||||
# have a pipe
|
||||
cat >> ./svn-ignore
|
||||
fi
|
||||
# do if no or some pipe ... apply the things in the svn-ignore file
|
||||
cat ./svn-ignore | tr -d '"' | sed 's/$/\/../' | xargs svn propdel svn:ignore 1>/null
|
||||
cat ./svn-ignore | tr -d '"' | sed 's\^\./\' | while read p; do
|
||||
name=$(echo -en "$p" | tr "/" "\n" | tail -n 1)
|
||||
path=${p%/*}
|
||||
prop=$(svn propget svn:ignore $path)
|
||||
svn propset svn:ignore "${prop}"$'\n'"${name}" $path
|
||||
echo prop: $prop
|
||||
echo path: $path
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
if [ "$1" == "up" ]
|
||||
then
|
||||
echo "-----------------------------------------------------------------"
|
||||
svn st | grep ^? | cut -c 9- | sed 's/^/"/' | sed 's/$/"@/' | xargs svn add
|
||||
svn st | grep ^! | cut -c 9- | sed 's/^/"/' | sed 's/$/"@/' | xargs svn rm
|
||||
echo "-----------------------------------------------------------------"
|
||||
svn ci -m "$2"
|
||||
fi
|
||||
75
mybin/ru
Executable file
75
mybin/ru
Executable file
@@ -0,0 +1,75 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ "$1" == "sync-school" ]
|
||||
then
|
||||
~/work/config/rclone/sync-school.sh
|
||||
|
||||
|
||||
elif [ "$1" == "mnt-wechner" ]
|
||||
then
|
||||
rclone mount --vfs-cache-mode full -vvvv onedrive-school:projekt-autobatterie ~/wechner-mount/
|
||||
|
||||
|
||||
elif [ "$1" == "wstunnel" ]
|
||||
then
|
||||
wstunnel -L 55555:127.0.0.1:49388 ws://sebastian.dns.army:49389
|
||||
|
||||
|
||||
|
||||
elif [ "$1" == "speed-test-nixos-iso" ]
|
||||
then
|
||||
wget "https://dl.t2sde.org/binary/2022/t2-22.6-x86-64-minimal-desktop-gcc-glibc.iso"
|
||||
|
||||
|
||||
elif [ "$1" == "p" ]
|
||||
then
|
||||
ping orf.at
|
||||
|
||||
|
||||
elif [ "$1" == "mnt-files-local" ]
|
||||
then
|
||||
sudo mount -t cifs //192.168.1.2/files /home/me/files -o x-gvfs-hide,rw,defaults,nofail,credentials=/home/me/.mysecrets/rpi-share-files,uid=1000,iocharset=utf8,gid=1000
|
||||
|
||||
|
||||
|
||||
|
||||
elif [ "$1" == "mnt-files-remote" ]
|
||||
then
|
||||
sshfs -o default_permissions,idmap=user,uid=1000,gid=1000 files:/home/files/storage/files /home/me/files
|
||||
|
||||
#fusermount -u /home/sebastian/files
|
||||
#fusermount -u /home/sebastian/lan
|
||||
|
||||
|
||||
elif [ "$1" == "mnt-lan-remote" ]
|
||||
then
|
||||
sshfs -o default_permissions,idmap=user,uid=1000,gid=1000 files:/home/files/storage/lan /home/me/lan
|
||||
|
||||
|
||||
elif [ "$1" == "mnt-lan-local" ]
|
||||
then
|
||||
sudo mount -t cifs //192.168.1.2/lan /home/me/lan -o x-gvfs-hide,username=guest,defaults,nofail,guest,uid=1000,gid=1000,iocharset=utf8
|
||||
|
||||
|
||||
elif [ "$1" == "bat" ]
|
||||
then
|
||||
now=$(cat /sys/class/power_supply/BAT0/charge_now)
|
||||
full=$(cat /sys/class/power_supply/BAT0/charge_full)
|
||||
stat=$(python -c "print( round($now / float($full) *100) )")
|
||||
echo BAT0 at: ${stat}%
|
||||
|
||||
|
||||
|
||||
elif [ "$1" == "bstat" ]
|
||||
then
|
||||
cat /sys/class/power_supply/BAT0/status
|
||||
|
||||
|
||||
elif [ "$1" == "hibernate" ]
|
||||
then
|
||||
sudo systemctl hibernate
|
||||
|
||||
|
||||
fi
|
||||
|
||||
|
||||
3
mybin/song
Executable file
3
mybin/song
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
SONG_CONF_PATH=~/work/things/cool-songs.json ~/scripts/song $@
|
||||
3
mybin/songt
Executable file
3
mybin/songt
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
SONG_CONF_PATH=~/work/things/touching-songs.json ~/scripts/song $@
|
||||
181
mybin/thq
Executable file
181
mybin/thq
Executable file
@@ -0,0 +1,181 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
DIR = "/home/me/work/things/storage/thq"
|
||||
FILE = DIR + "/main.json"
|
||||
EDITOR = "nvim"
|
||||
|
||||
import os
|
||||
import click
|
||||
from click_aliases import ClickAliasedGroup
|
||||
|
||||
# python.....
|
||||
true = True
|
||||
false = False
|
||||
|
||||
class JSON:
|
||||
from json import dumps as stringify
|
||||
from json import loads as parse
|
||||
|
||||
|
||||
@click.group(cls=ClickAliasedGroup)
|
||||
def main():
|
||||
pass
|
||||
|
||||
@main.command(aliases=["al"])
|
||||
def add_link():
|
||||
global data
|
||||
lnk = input("LINK: ")
|
||||
new = {
|
||||
"type": "link",
|
||||
"val": lnk
|
||||
}
|
||||
data.append(new)
|
||||
|
||||
@main.command(aliases=["als"])
|
||||
def add_links():
|
||||
global data
|
||||
|
||||
lns = []
|
||||
while true:
|
||||
lnk = input("LINK: ")
|
||||
if lnk == "":
|
||||
break
|
||||
else:
|
||||
lns.append(lnk)
|
||||
|
||||
new = {
|
||||
"type": "links",
|
||||
"val": lns
|
||||
}
|
||||
data.append(new)
|
||||
|
||||
@main.command(aliases=["ae"])
|
||||
def add_edit():
|
||||
os.system(f'{EDITOR} {DIR}/edit-file')
|
||||
with open(f'{DIR}/edit-file', "r") as file:
|
||||
st = file.read()
|
||||
|
||||
os.remove(f'{DIR}/edit-file')
|
||||
|
||||
new = {
|
||||
"type": "string",
|
||||
"val": st
|
||||
}
|
||||
data.append(new)
|
||||
|
||||
@main.command(aliases=["af"])
|
||||
def add_file():
|
||||
global data
|
||||
|
||||
os.system("mv " + file + " " + DIR + "/files")
|
||||
name = file.split("/")[-1]
|
||||
print(name)
|
||||
new = {
|
||||
"type": "file",
|
||||
"val": name
|
||||
}
|
||||
data.append(new)
|
||||
|
||||
|
||||
@main.command(aliases=["a"])
|
||||
@click.argument("text", nargs=-1)
|
||||
def add(text):
|
||||
global data
|
||||
|
||||
new = {
|
||||
"type": "string",
|
||||
"val": " ".join(text)
|
||||
}
|
||||
data.append(new)
|
||||
|
||||
@main.command(aliases=["g"])
|
||||
def get():
|
||||
global data
|
||||
if len(data) == 0:
|
||||
print("Nothing to do...")
|
||||
return
|
||||
|
||||
now = data[0]
|
||||
with open(f'{DIR}/now.json', "w") as file:
|
||||
file.write(JSON.stringify(now))
|
||||
|
||||
data.pop(0)
|
||||
|
||||
if now["type"] == "string":
|
||||
print("now")
|
||||
|
||||
elif now["type"] == "link":
|
||||
os.system("firefox " + now["val"])
|
||||
|
||||
elif now["type"] == "links":
|
||||
for link in now["val"]:
|
||||
os.system("firefox " + link)
|
||||
|
||||
elif now["type"] == "file":
|
||||
print("FILE: " + now["val"])
|
||||
#os.system("zath " + now["val"])
|
||||
|
||||
@main.command(aliases=["ar"])
|
||||
def archive_now():
|
||||
with open(f'{DIR}/now.json', "r") as file:
|
||||
now = JSON.parse(file.read())
|
||||
|
||||
if not os.path.exists(FILE + "/archive.json"):
|
||||
f = open(FILE + "/archive.json", "w")
|
||||
f.write(JSON.stringify({"main": []}))
|
||||
f.close()
|
||||
|
||||
with open(f'{DIR}/archive.json', "r+") as ar_file:
|
||||
archive = JSON.parse(ar_file.read())
|
||||
archive["main"].append(now)
|
||||
ar_file.write(JSON.stringify(archive))
|
||||
|
||||
@main.command(aliases=["n"])
|
||||
def now():
|
||||
with open(f'{DIR}/now.json', "r") as file:
|
||||
print(file.read())
|
||||
|
||||
@main.command()
|
||||
def all():
|
||||
global data
|
||||
print(JSON.stringify(data))
|
||||
|
||||
@main.command(aliases=["ea"])
|
||||
def edit_all():
|
||||
os.system(f'{EDITOR} {DIR}/main.json')
|
||||
|
||||
|
||||
@main.command(aliases=["l"])
|
||||
def get_len():
|
||||
global data
|
||||
print(len(data))
|
||||
|
||||
@main.result_callback()
|
||||
def process_result(result, **kwargs):
|
||||
global data
|
||||
with open(FILE, "w") as file:
|
||||
file.write(JSON.stringify(data))
|
||||
|
||||
|
||||
#############################################################################
|
||||
# main
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
if not os.path.exists(DIR):
|
||||
os.mkdir(DIR)
|
||||
os.mkdir(DIR + "/files")
|
||||
|
||||
if not os.path.exists(FILE):
|
||||
f = open(FILE, "w")
|
||||
f.write(JSON.stringify([]))
|
||||
f.close()
|
||||
|
||||
global data
|
||||
with open(FILE, "r") as file:
|
||||
data = JSON.parse(file.read())
|
||||
|
||||
main()
|
||||
|
||||
|
||||
|
||||
3
mybin/win
Executable file
3
mybin/win
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
~/work/config/scripts/win -o main-win 192.168.122.5 $@
|
||||
5
scripts/nav/db
Normal file
5
scripts/nav/db
Normal file
@@ -0,0 +1,5 @@
|
||||
* H ~
|
||||
* / /
|
||||
~ w ~/work
|
||||
~/work c config
|
||||
|
||||
58
scripts/nav/main.py
Normal file
58
scripts/nav/main.py
Normal file
@@ -0,0 +1,58 @@
|
||||
|
||||
import shlex
|
||||
from pathlib import Path
|
||||
from os import path
|
||||
import os
|
||||
|
||||
DB_FILE = "/home/me/work/config/nav/db"
|
||||
|
||||
|
||||
def main():
|
||||
pwd = Path(os.getcwd())
|
||||
db_matches = get_db_matches(pwd)
|
||||
folder_matches = get_folder_matches(pwd)
|
||||
|
||||
print(my_resolve("~/work/config/"))
|
||||
print("db:", db_matches)
|
||||
print("folder:", folder_matches)
|
||||
|
||||
|
||||
def get_db_matches(directory):
|
||||
matches = []
|
||||
with open(DB_FILE, "r") as file:
|
||||
for line in file.readlines():
|
||||
tmp = shlex.split(line)
|
||||
try:
|
||||
dir_in = tmp[0]
|
||||
shortcut = tmp[1]
|
||||
dest = tmp[2]
|
||||
except:
|
||||
continue
|
||||
|
||||
if dir_in == "*":
|
||||
matches.append((shortcut, dest))
|
||||
if dir_in == "~":
|
||||
#if directory == Path.home():
|
||||
matches.append((shortcut, dest))
|
||||
|
||||
return matches
|
||||
|
||||
def get_folder_matches(directory):
|
||||
matches = []
|
||||
ls = os.listdir(directory)
|
||||
|
||||
return matches
|
||||
|
||||
def my_resolve(path):
|
||||
if str(path)[0] == "~":
|
||||
path_as_list = list(str(path))
|
||||
path_as_list.pop(0)
|
||||
print("path_as_list:", path_as_list)
|
||||
return Path(str(Path.home()) + "".join(path_as_list))
|
||||
|
||||
return path.resolve()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
17
scripts/size.py
Normal file
17
scripts/size.py
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
import sys
|
||||
|
||||
s = 0
|
||||
for line in sys.stdin:
|
||||
(val, unit) = line.split(" ")
|
||||
val = float(val)
|
||||
|
||||
if "MiB" in unit:
|
||||
val *= 1000
|
||||
|
||||
s += val
|
||||
|
||||
print("MB: ", round(s/1000))
|
||||
print("GB: ", round(s/1000000))
|
||||
|
||||
|
||||
309
scripts/song
Executable file
309
scripts/song
Executable file
@@ -0,0 +1,309 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# written while listening to mocking bird on loop
|
||||
# if you really went through my config in that much detail...
|
||||
# ... to stumble upon this weired script i wrote a long time ago
|
||||
# ... please message me on discord (@c2vi) about it!!
|
||||
|
||||
from datetime import datetime
|
||||
import sys
|
||||
import json
|
||||
import requests
|
||||
import base64
|
||||
import os
|
||||
|
||||
with open("~/.mysecrets/spotify-client-id", "r") as file:
|
||||
CLIENT_ID = file.read()
|
||||
with open("~/.mysecrets/spotify-client-secret", "r") as file:
|
||||
CLIENT_SECRET = file.read()
|
||||
|
||||
LIST_COUNT = 6
|
||||
FILL_TO = 45
|
||||
|
||||
CONF_PATH = os.getenv("SONG_CONF_PATH")
|
||||
if CONF_PATH == "":
|
||||
print("No SONG_CONF_PATH environment variable found")
|
||||
exit(1)
|
||||
|
||||
|
||||
def get_token():
|
||||
url = "https://accounts.spotify.com/api/token"
|
||||
form_data = {"grant_type": "client_credentials"}
|
||||
|
||||
|
||||
message = CLIENT_ID + ":" + CLIENT_SECRET
|
||||
message_bytes = message.encode('ascii')
|
||||
base64_bytes = base64.b64encode(message_bytes)
|
||||
auth_base64 = base64_bytes.decode('ascii')
|
||||
|
||||
|
||||
headers = {
|
||||
"user-agent": "Hi Spotify.....xD",
|
||||
"Authorization": f"Basic {auth_base64}",
|
||||
}
|
||||
|
||||
x = requests.post(url, headers=headers, data=form_data)
|
||||
|
||||
data = x.json()
|
||||
return data["access_token"]
|
||||
|
||||
def spotify_search(name):
|
||||
token = get_token()
|
||||
url = "https://api.spotify.com/v1/search"
|
||||
|
||||
headers = {
|
||||
"user-agent": "Hi Spotify.....xD",
|
||||
"Authorization": f"Bearer {token}",
|
||||
}
|
||||
|
||||
params = {"q": name, "type": "track"}
|
||||
|
||||
x = requests.get(url, headers=headers, params=params)
|
||||
|
||||
data = x.json()
|
||||
count = 0
|
||||
for track in data["tracks"]["items"]:
|
||||
count += 1
|
||||
if count > LIST_COUNT:
|
||||
break
|
||||
|
||||
#print(track.keys())
|
||||
name = track["name"]
|
||||
artists = get_artists(track)
|
||||
|
||||
out = f"{count}) {name}"
|
||||
out = fill(out)
|
||||
out += f"BY: {artists}"
|
||||
print(out)
|
||||
|
||||
try:
|
||||
number = int(input("NUMBER: "))
|
||||
return data["tracks"]["items"][number -1]
|
||||
except:
|
||||
exit(1)
|
||||
|
||||
def get_artists(track):
|
||||
artists = ""
|
||||
for artist in track["artists"]:
|
||||
if artists != "":
|
||||
artists += " --- " + artist["name"]
|
||||
else:
|
||||
artists += artist["name"]
|
||||
|
||||
return artists
|
||||
|
||||
def add_track(track, pos = None):
|
||||
# get the track id
|
||||
# first letter , or first two, ....
|
||||
count = 1
|
||||
myid = track["name"][0:count]
|
||||
while get_track_pos(myid) != -1:
|
||||
count += 1
|
||||
myid = track["name"][0:count]
|
||||
|
||||
if count == 2000:
|
||||
print("Count went to 2000 in add_track")
|
||||
exit(1)
|
||||
|
||||
mytrack = {
|
||||
"id": track["id"],
|
||||
"name": track["name"],
|
||||
"artists": get_artists(track),
|
||||
"myid": myid,
|
||||
}
|
||||
|
||||
if pos == None:
|
||||
config["now"].append(mytrack)
|
||||
else:
|
||||
config["now"].insert(pos -1, mytrack)
|
||||
|
||||
config["log"].append({
|
||||
"type": "add",
|
||||
"track": mytrack,
|
||||
"time": now.strftime("%m/%d/%Y-%H:%M:%S"),
|
||||
})
|
||||
|
||||
def set_track(track_id, pos):
|
||||
mytrack = get_track_from_myid(track_id)
|
||||
old_pos = get_track_pos(track_id)
|
||||
config["now"].pop(old_pos)
|
||||
config["now"].insert(pos, mytrack)
|
||||
|
||||
config["log"].append({
|
||||
"type": "move",
|
||||
"track": mytrack,
|
||||
"time": now.strftime("%m/%d/%Y-%H:%M:%S"),
|
||||
"from": old_pos +1,
|
||||
"to": pos +1,
|
||||
})
|
||||
|
||||
|
||||
def get_track_pos(track_or_myid):
|
||||
id = ""
|
||||
if type(track_or_myid) == dict:
|
||||
id = track_or_myid["myid"]
|
||||
else:
|
||||
id = track_or_myid
|
||||
|
||||
count = 0
|
||||
for track in config["now"]:
|
||||
if track["myid"] == id:
|
||||
return count
|
||||
|
||||
count += 1
|
||||
|
||||
return -1
|
||||
|
||||
def get_track_from_myid(myid):
|
||||
for track in config["now"]:
|
||||
if track["myid"] == myid:
|
||||
return track
|
||||
print(f"Track {myid} not found")
|
||||
exit(1)
|
||||
|
||||
|
||||
def remove_track(track_or_myid):
|
||||
myid = ""
|
||||
if type(track_or_myid) == dict:
|
||||
myid = track_or_myid["myid"]
|
||||
else:
|
||||
myid = track_or_myid
|
||||
|
||||
config["log"].append({
|
||||
"type": "remove",
|
||||
"track": get_track_from_myid(myid),
|
||||
"time": now.strftime("%m/%d/%Y-%H:%M:%S"),
|
||||
})
|
||||
|
||||
new_tracks = []
|
||||
for track in config["now"]:
|
||||
if track["myid"] != myid:
|
||||
new_tracks.append(track)
|
||||
|
||||
config["now"] = new_tracks
|
||||
|
||||
def list_track():
|
||||
count = 0
|
||||
for track in config["now"]:
|
||||
count += 1
|
||||
out = str(count) + ") " + track["myid"]
|
||||
out = fill(out, l=10)
|
||||
out += track["name"]
|
||||
out = fill(out)
|
||||
out += "BY: " + track["artists"]
|
||||
print(out)
|
||||
|
||||
def fill(string, l = FILL_TO):
|
||||
count = 0
|
||||
while len(string) < l:
|
||||
string += " "
|
||||
count += 1
|
||||
return string
|
||||
|
||||
def log():
|
||||
for entry in config["log"]:
|
||||
typ = entry["type"]
|
||||
name = entry["track"]["name"]
|
||||
time = entry["time"]
|
||||
if typ == "move":
|
||||
fro = entry["from"]
|
||||
to = entry["to"]
|
||||
print(f"MOVE \t from {fro} to {to} \t {time} \t {name}")
|
||||
|
||||
elif typ == "add":
|
||||
print(f"ADD \t {time} \t {name}")
|
||||
|
||||
elif typ == "remove":
|
||||
print(f"REMOVE \t {time} \t {name}")
|
||||
|
||||
def main():
|
||||
searh_term = " ".join(args[2:len(args)])
|
||||
if args[1] == "s":
|
||||
track = spotify_search(searh_term)
|
||||
|
||||
elif args[1] == "a" or args[1] == "add":
|
||||
try:
|
||||
pos = int(args[2])
|
||||
print("Inserting at pos:", pos)
|
||||
searh_term = " ".join(args[3:len(args)])
|
||||
track = spotify_search(searh_term)
|
||||
add_track(track, pos = pos)
|
||||
except:
|
||||
track = spotify_search(searh_term)
|
||||
add_track(track)
|
||||
|
||||
elif args[1] == "rm":
|
||||
remove_track(args[2])
|
||||
|
||||
elif args[1] == "l":
|
||||
list_track()
|
||||
|
||||
elif args[1] == "st" or args[1] == "set":
|
||||
set_track(args[2], int(args[3]) -1)
|
||||
|
||||
list_track()
|
||||
|
||||
elif args[1] == "up":
|
||||
pos = get_track_pos(args[2])
|
||||
delta = 1
|
||||
try:
|
||||
delta = int(args[3])
|
||||
except:
|
||||
pass
|
||||
|
||||
set_track(args[2], pos - delta)
|
||||
list_track()
|
||||
|
||||
elif args[1] == "down" or args[1] == "dn":
|
||||
pos = get_track_pos(args[2])
|
||||
delta = 1
|
||||
try:
|
||||
delta = int(args[3])
|
||||
except:
|
||||
pass
|
||||
|
||||
set_track(args[2], pos + delta)
|
||||
list_track()
|
||||
|
||||
elif args[1] == "log" and len(args) >= 3 and args[2] == "rm":
|
||||
num = 1
|
||||
try:
|
||||
num = int(args[3])
|
||||
except:
|
||||
pass
|
||||
|
||||
config["log"] = config["log"][0:-num]
|
||||
log()
|
||||
|
||||
elif args[1] == "log":
|
||||
log()
|
||||
|
||||
else:
|
||||
print("Unknown command!")
|
||||
exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
args = sys.argv
|
||||
|
||||
now = datetime.now()
|
||||
|
||||
|
||||
# read config
|
||||
with open(CONF_PATH, "r") as file:
|
||||
config = json.loads(file.read())
|
||||
|
||||
# init config
|
||||
if config.get("log", None) == None:
|
||||
config["log"] = []
|
||||
|
||||
if config.get("now", None) == None:
|
||||
config["now"] = []
|
||||
|
||||
main()
|
||||
|
||||
# write config
|
||||
with open(CONF_PATH, "w") as file:
|
||||
file.write(json.dumps(config))
|
||||
|
||||
|
||||
155
scripts/win
Executable file
155
scripts/win
Executable file
@@ -0,0 +1,155 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
#default_vm_name=windp
|
||||
#default_vm_uuid=12650dba-6232-40d8-9863-6c2bb267a0c9
|
||||
|
||||
#default_vm_name=tiny10
|
||||
#default_vm_uuid=6a412143-871f-4838-bacd-5dcfa5fa95c3
|
||||
|
||||
username=me
|
||||
password=$(cat ~/.mysecrets/win-vm-pwd)
|
||||
|
||||
if [ "$1" == "-o" ];then
|
||||
cmd=$4
|
||||
default_vm_name=$2
|
||||
default_vm_uuid=$2
|
||||
default_vm_ip=$3
|
||||
else
|
||||
cmd=$1
|
||||
fi
|
||||
|
||||
#do stuff
|
||||
|
||||
if [ "$cmd" == "st" ];then
|
||||
sudo umount /home/sebastian/winwork
|
||||
|
||||
#virsh -c qemu:///system attach-disk 12650dba-6232-40d8-9863-6c2bb267a0c9 /dev/nvme0n1 sdd --targetbus virtio --persistent
|
||||
|
||||
virsh -c qemu:///system start $default_vm_uuid
|
||||
|
||||
#sleep 30
|
||||
#sudo mount -t cifs //192.168.122.4/winwork /home/sebastian/winwork -o user=$username -o password=$password -o uid=1000 -o gid=1000
|
||||
|
||||
|
||||
elif [ "$cmd" == "h" ];then
|
||||
sudo mount /home/sebastian/winwork
|
||||
|
||||
elif [ "$cmd" == "c" ];then
|
||||
virt-manager --connect qemu:///system --show-domain-editor $default_vm_uuid
|
||||
|
||||
elif [ "$cmd" == "sm" ];then
|
||||
sudo umount /home/sebastian/winwork
|
||||
virsh -c qemu:///system managedsave $default_vm_uuid
|
||||
|
||||
elif [ "$cmd" == "s" ];then
|
||||
virsh -c qemu:///system domstate $default_vm_uuid
|
||||
|
||||
|
||||
elif [ "$cmd" == "ld" ];then
|
||||
virsh -c qemu:///system domblklist --domain $default_vm_uuid --details
|
||||
echo ----------------------------------------
|
||||
virsh -c qemu:///system dumpxml $default_vm_uuid | grep sdd
|
||||
|
||||
|
||||
elif [ "$cmd" == "w" ];then
|
||||
virsh -c qemu:///system attach-disk $default_vm_uuid /dev/nvme0n1 sdd --targetbus virtio --persistent
|
||||
sleep 0.5
|
||||
sudo mount -t cifs //$default_vm_ip/winwork /home/sebastian/winwork -o user=$username -o password=$password -o uid=1000 -o gid=1000
|
||||
|
||||
elif [ "$cmd" == "m" ];then
|
||||
sudo mount -t cifs //$default_vm_ip/winwork /home/sebastian/winwork -o user=$username -o password=$password -o uid=1000 -o gid=1000
|
||||
|
||||
elif [ "$cmd" == "u" ];then
|
||||
virsh -c qemu:///system attach-disk $default_vm_uuid /dev/nvme0n1 sdd --targetbus usb --persistent
|
||||
sleep 0.5
|
||||
sudo mount -t cifs //$default_vm_ip/winwork /home/sebastian/winwork -o user=$username -o password=$password -o uid=1000 -o gid=1000
|
||||
|
||||
|
||||
elif [ "$cmd" == "uu" ];then
|
||||
virsh -c qemu:///system detach-disk $default_vm_uuid /dev/nvme0n1 --persistent
|
||||
sudo umount /home/sebastian/winwork
|
||||
|
||||
elif [ "$cmd" == "uw" ];then
|
||||
#sudo modprobe shpchp
|
||||
#sudo modprobe acpiphp
|
||||
virsh -c qemu:///system detach-disk $default_vm_uuid /dev/nvme0n1 --persistent
|
||||
virsh -c qemu:///system shutdown $default_vm_uuid
|
||||
|
||||
elif [ "$cmd" == "sp" ];then
|
||||
virsh -c qemu:///system shutdown $default_vm_uuid
|
||||
virsh -c qemu:///system shutdown $default_vm_uuid
|
||||
virsh -c qemu:///system shutdown $default_vm_uuid
|
||||
|
||||
#sleep 15
|
||||
|
||||
#virsh -c qemu:///system detach-disk $default_vm_uuid /dev/nvme0n1 --persistent
|
||||
#sudo mount /home/sebastian/winwork
|
||||
|
||||
|
||||
|
||||
elif [ "$cmd" == "p" ];then
|
||||
sudo umount /home/sebastian/winwork
|
||||
virsh -c qemu:///system suspend $default_vm_uuid
|
||||
|
||||
#sleep 0.2
|
||||
#kill -SIGSTOP $(pgrep qemu)
|
||||
|
||||
|
||||
elif [ "$cmd" == "up" ];then
|
||||
#kill -SIGCONT $(pgrep qemu)
|
||||
#sleep 0.2
|
||||
virsh -c qemu:///system resume $default_vm_uuid
|
||||
|
||||
sleep 0.2
|
||||
sudo mount -t cifs //$default_vm_ip/winwork /home/sebastian/winwork -o user=$username -o password=$password -o uid=1000 -o gid=1000
|
||||
|
||||
|
||||
elif [ "$cmd" == "f" ];then
|
||||
RDP_SCALE=100
|
||||
MULTI_FLAG="span"
|
||||
RDP_USER=$username
|
||||
RDP_PASS=$password
|
||||
RDP_IP=$default_vm_ip
|
||||
|
||||
xfreerdp ${RDP_FLAGS} /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} /scale:${RDP_SCALE} /dynamic-resolution +clipboard +auto-reconnect +home-drive /wm-class:"Microsoft Windows" -grab-keyboard 1> /dev/null 2> /dev/null &
|
||||
#xfreerdp ${RDP_FLAGS} /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} /scale:${RDP_SCALE} /dynamic-resolution +clipboard +auto-reconnect +home-drive /wm-class:"Microsoft Windows" -grab-keyboard
|
||||
#
|
||||
elif [ "$cmd" == "fl" ];then
|
||||
RDP_SCALE=100
|
||||
MULTI_FLAG="span"
|
||||
RDP_USER=$username
|
||||
RDP_PASS=$password
|
||||
RDP_IP=$default_vm_ip
|
||||
|
||||
xfreerdp ${RDP_FLAGS} /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} /scale:${RDP_SCALE} /dynamic-resolution +clipboard +auto-reconnect +home-drive /wm-class:"Microsoft Windows" -grab-keyboard
|
||||
|
||||
elif [ "$cmd" == "fup" ];then
|
||||
#kill -SIGCONT $(pgrep qemu)
|
||||
#echo cont
|
||||
#sleep 0.2
|
||||
virsh -c qemu:///system resume $default_vm_uuid
|
||||
|
||||
sleep 0.4
|
||||
sudo mount -t cifs //$default_vm_ip/winwork /home/sebastian/winwork -o user=$username -o password=$password -o uid=1000 -o gid=1000
|
||||
|
||||
sleep 0.2
|
||||
RDP_SCALE=100
|
||||
MULTI_FLAG="span"
|
||||
RDP_USER=$username
|
||||
RDP_PASS=$password
|
||||
RDP_IP=$default_vm_ip
|
||||
|
||||
xfreerdp ${RDP_FLAGS} /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} /scale:${RDP_SCALE} /dynamic-resolution +clipboard +auto-reconnect +home-drive /wm-class:"Microsoft Windows" -grab-keyboard 1> /dev/null 2> /dev/null &
|
||||
|
||||
elif [ "$cmd" == "l" ];then
|
||||
looking-glass-client -m KEY_END
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user