diff --git a/.todo b/.todo new file mode 100644 index 0000000..3850fa9 --- /dev/null +++ b/.todo @@ -0,0 +1,2 @@ +2018-12-29 find out why urxvt uses so much CPU + load is at almost 4, mem usage at 100% diff --git a/art/57761164_p0_master1200.jpg b/art/57761164_p0_master1200.jpg deleted file mode 100644 index 67f59bc..0000000 Binary files a/art/57761164_p0_master1200.jpg and /dev/null differ diff --git a/art/d4bg1ub-99594e4d-81cc-4dd2-bbb5-45edc57a8ca5.jpg b/art/d4bg1ub-99594e4d-81cc-4dd2-bbb5-45edc57a8ca5.jpg deleted file mode 100644 index 0c005d3..0000000 Binary files a/art/d4bg1ub-99594e4d-81cc-4dd2-bbb5-45edc57a8ca5.jpg and /dev/null differ diff --git a/config.nix b/config.nix index 6fb7928..cbb854d 100644 --- a/config.nix +++ b/config.nix @@ -1,6 +1,5 @@ { config, lib, pkgs, ... }: let - scripts = import ./dot/scripts.nix { inherit pkgs; }; helpers = import ./helpers.nix; in { imports = [ @@ -45,11 +44,12 @@ in { users.users.kfm = { name = "kfm"; + description = config.constants.user.name; home = "/home/kfm"; createHome = true; group = "users"; - extraGroups = [ "wheel" "audio" ]; - password = "kfm"; + extraGroups = [ "wheel" "audio" "docker" ]; + hashedPassword = "$6$w9hXyGFl/.IZBXk$5OiWzS1G.5hImhh1YQmZiCXYNAJhi3X6Y3uSLupJNYYXPLMsQpx2fwF4Xr2uYzGMV8Foqh8TgUavx1APD9rcb/"; shell = pkgs.zsh; }; @@ -72,20 +72,7 @@ in { terminal = "screen-256color"; }; - # for kdeconnect - networking.firewall = { - allowedTCPPortRanges = [ { from = 1714; to = 1764; } ]; - allowedUDPPortRanges = [ { from = 1714; to = 1764; } ]; - }; - home-manager.users.kfm = { - gtk = { - enable = true; - font = with import ./theme.nix; { package = pkgs.roboto; name = uiFont.name; }; - iconTheme = config.constants.theme.icon; - theme = config.constants.theme.gtk; - }; - programs.git = { enable = true; userName = config.constants.user.name; @@ -99,110 +86,24 @@ in { unstage = "reset HEAD --"; sdiff = "diff --staged"; last = "log -1 HEAD"; - pull-all = "!${scripts.git-pull-all}"; + pull-all = "!pull-all"; # from dot/scripts.nix }; ignores = config.constants.ignore; }; - programs.rofi = with import ./theme.nix; { + programs.ssh = { enable = true; - separator = "solid"; - scrollbar = false; - terminal = config.defaultApplications.terminal; - borderWidth = 0; - lines = 5; - font = "${uiFont.name} ${toString (uiFont.size + 1)}"; - colors = rec { - window = { background = black; border = black; separator = gray.dark; }; - rows = { - normal = { - background = window.background; - backgroundAlt = window.background; - foreground = gray.light; - highlight = { foreground = white; inherit (window) background; }; - }; - active = { - background = window.background; - backgroundAlt = window.background; - foreground = blue.dark; - highlight = { foreground = blue.light; inherit (window) background; }; - }; - urgent = { - background = window.background; - backgroundAlt = window.background; - foreground = red.dark; - highlight = { foreground = red.light; inherit (window) background; }; - }; - }; - }; - }; - - services.kdeconnect = { - enable = true; - indicator = true; - }; - - services.dunst = with import ./theme.nix; { - enable = true; - iconTheme = config.constants.theme.icon; - settings = { - global = { - transparency = 10; - font = "${uiFont.name} ${toString uiFont.size}"; - geometry = "200x5-30+20"; - frame_color = veryDark; - follow = "mouse"; - indicate_hidden = true; - notification_height = 0; - separator_height = 2; - padding = 8; - horizontal_padding = 8; - separator_color = "auto"; - sort = true; - markup = "full"; - format = ''%a\n%s\n%b''; - alignment = "left"; - show_age_threshold = 60; - bounce_freq = 0; - word_wrap = true; - ellipsize = "middle"; - ignore_newline = false; - stack_duplicates = true; - hide_duplicate_count = false; - max_icon_size = 32; - sticky_history = true; - history_length = 20; - dmenu = "${pkgs.rofi}/bin/rofi -display-run dunst -show run"; - browser = "${pkgs.xdg_utils}/bin/xdg-open"; - verbosity = "mesg"; - corner_radius = 0; - mouse_left_click = "do_action"; - mouse_right_click = "close_current"; - mouse_middle_click = "close_all"; - }; - urgency_low = { frame_color = veryDark; background = veryDark; foreground = gray.light; timeout = 5; }; - urgency_normal = { frame_color = veryDark; background = gray.light; foreground = veryDark; timeout = 10; }; - urgency_critical = { frame_color = veryDark; background = red.dark; foreground = veryDark; timeout = 0; }; - }; + matchBlocks = import dot/ssh.nix { inherit lib; }; }; home.file = { # ".background-image".source = ./art/37333571_p0_master1200.jpg; ".config/mpv/input.conf".text = import ./dot/mpv.nix; ".config/Typora/themes/base.user.css".text = import ./dot/typora.nix; - ".config/zathura/zathurarc".text = "set selection-clipboard clipboard"; ".ghc/ghci.conf".text = import ./dot/ghci.nix { inherit pkgs; }; - ".ssh/config".text = import ./dot/ssh.nix { inherit lib; }; ".stack/config.yaml".text = import ./dot/stack.nix { user = config.constants.user; }; - ".Xresources".text = import ./dot/xresources.nix; ".zshrc".text = "# nothing to see here"; }; }; - environment.etc = { - "tinc/retiolum/rsa_key.priv" = { - text = (import ./secrets.nix).retiolum.scardanelli.privateKey; - mode = "400"; - }; - }; } diff --git a/configs/editors.nix b/configs/editors.nix index 76cb8d7..233aeb2 100644 --- a/configs/editors.nix +++ b/configs/editors.nix @@ -9,6 +9,7 @@ let vim_conf = '' colorscheme delek filetype plugin indent on + set title set nocompatible set smartcase set shiftwidth=2 tabstop=2 expandtab @@ -120,24 +121,24 @@ let vim_conf = '' set noshowmode laststatus=0 noruler let g:airline#extensions#tabline#close_symbol = 'X' let g:airline#extensions#tabline#enabled = 0 - let g:airline#extensions#tabline#left_alt_sep = '' - let g:airline#extensions#tabline#left_sep = '' - let g:airline#extensions#tabline#right_alt_sep = '' - let g:airline#extensions#tabline#right_sep = '' + "let g:airline#extensions#tabline#left_alt_sep = '' + "let g:airline#extensions#tabline#left_sep = '' + "let g:airline#extensions#tabline#right_alt_sep = '' + "let g:airline#extensions#tabline#right_sep = '' let g:airline#extensions#tabline#show_close_button = 1 let g:airline#extensions#tabline#show_tab_type = 0 let g:airline#extensions#tabline#tab_min_count = 2 let g:airline#extensions#tabline#tab_nr_type = 0 let g:airline#extensions#tmuxline#enabled = 0 - let g:airline#extensions#wordcount#enabled = 1 - let g:airline_left_alt_sep = '' - let g:airline_left_sep = '' - let g:airline_right_alt_sep = '' - let g:airline_right_sep = '' + "let g:airline#extensions#wordcount#enabled = 1 + "let g:airline_left_alt_sep = '' + "let g:airline_left_sep = '' + "let g:airline_right_alt_sep = '' + "let g:airline_right_sep = '' let g:airline_section_z = '%{line(".")}/%{line("$")} %{col(".")}' "endif "if exists("g:loaded_airline_themes") - let g:airline_theme='simple' + let g:airline_theme='base16' "endif ''; in { diff --git a/configs/graphics.nix b/configs/graphics.nix index 6a649e2..a4bcb5f 100644 --- a/configs/graphics.nix +++ b/configs/graphics.nix @@ -1,282 +1,10 @@ { pkgs, lib, config, ... }: -let - spotify_info = pkgs.writers.writeBash "spotify.info" '' - if $(pgrep spotify); then - STATUS=$(${pkgs.dbus}/bin/dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'PlaybackStatus'|egrep -A 1 "string"|cut -b 26-|cut -d '"' -f 1|egrep -v ^$) - - if [[ "$STATUS" == 'Playing' ]]; then - printf '\uf1bc ' - printf '\uf04b' - elif [[ "$STATUS" == 'Paused' ]]; then - printf '\uf1bc ' - printf '\uf04c' - elif [[ "$STATUS" == 'Stopped' ]]; then - printf '\uf1bc ' - printf '\uf04d' - else - exit 1 - fi - - printf ' ' - - METADATA=$(${pkgs.dbus}/bin/dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata') - ARTIST=$(echo "$METADATA" | egrep -A 2 "artist" | egrep -v "artist" | egrep -v "array" | cut -b 27- | cut -d '"' -f 1 | egrep -v ^$) - TITLE=$(echo "$METADATA" | egrep -A 1 "title" | egrep -v "title" | cut -b 44- | cut -d '"' -f 1 | egrep -v ^$) - - printf "%s \u2237 %s" "$ARTIST" "$TITLE" - fi - ''; - battery_info = pkgs.writers.writeBash "battery.info" '' - BAT_DIR="/sys/class/power_supply/$BLOCK_INSTANCE/" - if [ -d "$BAT_DIR" ]; then - cd "$BAT_DIR" - else - exit 1 - fi - - if [ -e charge_now ] && [ -e charge_full ]; then - FULL_CHARGE=charge_full - CURR_CHARGE=charge_now - elif [ -e energy_now ] && [ -e energy_full ]; then - FULL_CHARGE=energy_full - CURR_CHARGE=energy_now - else - ls >&2 - exit 1 - fi - - status=$(cat status) - charge_f=$((100 * $(cat $CURR_CHARGE) / $(cat $FULL_CHARGE))) - - if [[ "$charge_f" -lt 20 ]]; then - printf '\uf244' - elif [[ "$charge_f" -lt 40 ]]; then - printf '\uf243' - elif [[ "$charge_f" -lt 60 ]]; then - printf '\uf242' - elif [[ "$charge_f" -lt 80 ]]; then - printf '\uf241' - else - printf '\uf240' - fi - - printf ' ' - - if [[ "$status" == 'Charging' ]]; then - printf '\uf106' - elif [[ "$status" == 'Discharging' ]]; then - printf '\uf107' - elif [[ "$status" == 'Full' ]]; then - printf '\uf0e7' - else - printf '[%s]' "$status" - fi - - printf ' ' - - if [[ "$status" != 'Full' ]]; then - rate_raw=$(($(cat voltage_now) * $(cat power_now))) - rate=$(bc <<< "scale=1; $rate_raw / 10^12") - printf '%s\u2009W, ' "$rate" - fi - - charge_d=$((100 * $(cat $CURR_CHARGE) / $(cat $FULL_CHARGE))) - printf '%s%%\n' "$charge_d" - - if [[ "$status" == 'Discharging' ]]; then - if [[ "$charge_d" -lt 10 ]]; then - printf '\n#E41C28' - elif [[ "$charge_d" -lt 20 ]]; then - printf '\n#EEBF13' - fi - fi - ''; - volume_info = pkgs.writers.writeBash "volume.info" '' - if [[ "$BLOCK_BUTTON" == 1 ]]; then - ${pkgs.pamixer}/bin/pamixer -i 5 - elif [[ "$BLOCK_BUTTON" == 3 ]]; then - ${pkgs.pamixer}/bin/pamixer -d 5 - elif [[ "$BLOCK_BUTTON" == 2 ]]; then - ${pkgs.pamixer}/bin/pamixer -t - fi - - if $(${pkgs.pamixer}/bin/pamixer --get-mute); then - printf '\uf026 0%%\n\n#EEBF13' - else - volume=$(${pkgs.pamixer}/bin/pamixer --get-volume) - printf '\uf028 %s%%' "$volume" - fi - ''; - fancyDate = pkgs.writers.writeC "fancy_date.c" {} '' - #include - #include - #include - - int main(void) { - time_t now = time(NULL); - struct tm *today = localtime(&now); - wchar_t roman_month = 0x2160 + today->tm_mon; - wprintf(L"%d\u2009%lc\u2009%d [%d|%d]\n", today->tm_mday, roman_month, 1900 + today->tm_year, today->tm_wday == 0 ? 7 : today->tm_wday, today->tm_yday/7 + 1); - return 0; - } - ''; - i3blocks_conf = with import ../theme.nix; '' - markup=pango - align=center - color=${white} - - [spotify] - command=${spotify_info} - interval=2 - - [separator] - - [volume] - command=${volume_info} - min_width= 100% - interval=once - signal=3 - - [separator] - - [cpu_usage] - command=cut -d' ' -f 1-3 < /proc/loadavg - label= - interval=2 - - [separator] - - [ram_usage] - command=free -h | grep "Mem" | awk '{print $3}' - label= - interval=2 - align=center - - [separator] - - [battery] - command=${battery_info} - interval=10 - instance=BAT1 - - [separator] - - [date] - command=${fancyDate} - interval=1 - label= - - [separator] - - [time] - command=date +'%H:%M' - interval=1 - label= - - [separator] - command=${pkgs.xkblayout-state}/bin/xkblayout-state print %s - label= - interval=2 - - [separator] - ''; - i3_conf = with import ../theme.nix; '' - set $mod Mod4 - - font pango:${uiFont.name} ${toString uiFont.size} - floating_modifier $mod - - default_border pixel 2 - hide_edge_borders smart - default_floating_border none - - bindsym $mod+Return exec ${config.defaultApplications.terminal} - bindsym $mod+y exec ${config.defaultApplications.browser} - bindsym $mod+t exec ${config.defaultApplications.fileManager} - bindsym $mod+Shift+w exec ${pkgs.xautolock}/bin/xautolock -locknow - bindsym $mod+d exec ${pkgs.rofi}/bin/rofi -display-run — -show run - bindsym $mod+a exec ${pkgs.rofi}/bin/rofi -display-window — -show window - - bindsym $mod+Shift+q kill - bindsym $mod+Left focus left - bindsym $mod+Down focus down - bindsym $mod+Up focus up - bindsym $mod+Right focus right - bindsym $mod+p workspace prev - bindsym $mod+n workspace next - bindsym $mod+Shift+Left move left - bindsym $mod+Shift+Down move down - bindsym $mod+Shift+Up move up - bindsym $mod+Shift+Right move right - bindsym $mod+h split h - bindsym $mod+v split v - bindsym $mod+f fullscreen toggle - bindsym $mod+s layout stacking - bindsym $mod+w layout tabbed - bindsym $mod+e layout toggle split - bindsym $mod+Shift+z floating toggle - bindsym $mod+Shift+c reload - bindsym $mod+Shift+r restart - - ${with lib; - strings.concatMapStringsSep "\n" - (i: let n = toString i; ws = "$workspace" + n; in - ''set ${ws} ${n} - bindsym $mod+${n} workspace ${ws} - bindsym $mod+Shift+${n} move container to workspace ${ws}'') - (lists.range 1 9) - } - set $workspace10 X - bindsym $mod+0 workspace $workspace10 - bindsym $mod+Shift+0 move container to workspace $workspace10 - - bindsym XF86AudioLowerVolume exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -d 5 && pkill -RTMIN+3 i3blocks - bindsym XF86AudioRaiseVolume exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -i 5 && pkill -RTMIN+3 i3blocks - bindsym XF86AudioMute exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -t && pkill -RTMIN+3 i3blocks - - mode "  " { - bindsym Left resize shrink width 10 px or 10 ppt - bindsym Down resize grow height 10 px or 10 ppt - bindsym Up resize shrink height 10 px or 10 ppt - bindsym Right resize grow width 10 px or 10 ppt - bindsym Escape mode "default" - bindsym Space mode "default" - } - bindsym $mod+r mode "  " - - #class container-border container-bg fg indicator window-border - client.focused ${gray.dark} ${black} ${white} ${white} ${gray.medium} - client.focused_inactive ${black} ${black} ${gray.medium} ${white} ${black} - client.unfocused ${black} ${black} ${gray.medium} ${white} ${black} - client.urgent ${red.light} ${black} ${white} ${white} ${red.light} - client.placeholder ${black} ${black} ${gray.medium} ${white} ${black} - - bar { - status_command "${pkgs.i3blocks}/bin/i3blocks -c ${pkgs.writeText "i3blocks.conf" i3blocks_conf}" - position top - - font pango:${uiFont.name},FontAwesome ${toString uiFont.size} - separator_symbol " // " - colors { - separator ${gray.medium} - background ${black} - statusline ${gray.medium} - - # border bg fg - focused_workspace ${black} ${black} ${white} - active_workspace ${black} ${black} ${gray.medium} - inactive_workspace ${black} ${black} ${gray.medium} - urgent_workspace ${black} ${black} ${red.light} - binding_mode ${black} ${black} ${red.light} - } - } -''; -in { +{ services.xserver = with import ../helpers.nix; with import ../theme.nix; { enable = true; layout = commaSep [ "de" "gr" "ru" ]; xkbVariant = commaSep [ "T3" "polytonic" "phonetic_winkeys" ]; - xkbOptions = commaSep [ "terminate:ctrl_alt_bksp" "grp:alt_space_toggle" ]; + xkbOptions = commaSep [ "terminate:ctrl_alt_bksp" "grp:alt_shift_toggle" ]; libinput.enable = true; xautolock = { enable = true; @@ -286,19 +14,21 @@ in { enableNotifier = true; notifier = ''${pkgs.libnotify}/bin/notify-send -u normal -a xautolock "Locking soon" "The screen will lock in 10 seconds."''; }; - displayManager.auto = { enable = true; user = "kfm"; }; displayManager.sessionCommands = '' ${pkgs.feh}/bin/feh --bg-fill $(find ${../art} -type f | shuf -n 1) & ${pkgs.dropbox-cli}/bin/dropbox start & ${pkgs.seafile-client}/bin/seafile-applet & + ${pkgs.openssh}/bin/ssh-add ''; + displayManager.lightdm.greeters.gtk = { + enable = true; + theme = { name = config.constants.theme.gtk.name; package = config.constants.theme.gtk.package; }; + iconTheme = { name = config.constants.theme.icon.name; package = config.constants.theme.icon.package; }; + indicators = [ "~spacer" "~host" "~spacer" "~session" ]; + }; desktopManager.xterm.enable = false; windowManager.default = "i3"; - windowManager.i3 = { - enable = true; - configFile = pkgs.writeText "i3.conf" i3_conf; - extraPackages = []; - }; + windowManager.i3.enable = true; xrandrHeads = { homeros = [ "LVDS1" { output = "HDMI1"; primary = true; } ]; scardanelli = [ "eDP1" ]; @@ -308,7 +38,7 @@ in { i18n = { defaultLocale = "en_GB.UTF-8"; consoleKeyMap = "de"; - # consoleColors = with import ../theme.nix; map (c: lib.strings.removePrefix "#" c) colorPalette; + consoleColors = with import ../theme.nix; map (c: lib.strings.removePrefix "#" c) colorPalette; }; services.compton = { @@ -330,4 +60,31 @@ in { enable = true; timeout = 10; }; + + home-manager.users.kfm = { + gtk = { + enable = true; + font = with import ../theme.nix; { package = pkgs.roboto; name = uiFont.name; }; + iconTheme = config.constants.theme.icon; + theme = config.constants.theme.gtk; + }; + + qt = { + enable = true; + useGtkTheme = true; + }; + + xsession.pointerCursor = config.constants.theme.cursor // { size = 16; }; + + xsession.windowManager.i3 = { + enable = true; + config = import ../dot/i3.nix { inherit lib pkgs config; }; + }; + + xresources.properties = import ../dot/xresources.nix { inherit lib; }; + programs.rofi = import ../dot/rofi.nix { inherit config; }; + services.dunst = import ../dot/dunst.nix { inherit pkgs config; }; + programs.urxvt = import ../dot/urxvt.nix { inherit pkgs; }; + programs.zathura = import ../dot/zathura.nix; + }; } diff --git a/configs/networks.nix b/configs/networks.nix index 68aa9cf..7b83c40 100644 --- a/configs/networks.nix +++ b/configs/networks.nix @@ -31,30 +31,46 @@ in { eduroam = eduroamConfig; "Asoziales Netzwerk" = { pskRaw = "8e234041ec5f0cd1b6a14e9adeee9840ed51b2f18856a52137485523e46b0cb6"; }; "c-base-public" = {}; - "FlixBus" = {}; - "FlixBus Wi-Fi" = {}; + }; + }; + + # for kdeconnect + networking.firewall = { + allowedTCPPortRanges = [ { from = 1714; to = 1764; } ]; + allowedUDPPortRanges = [ { from = 1714; to = 1764; } ]; + }; + + home-manager.users.kfm = { + services.kdeconnect = { + enable = true; + indicator = true; }; }; networking.retiolum = { scardanelli = { ipv4 = "10.243.2.2"; - ipv6 = "42:2:5ca:da:3111::1"; + ipv6 = "42:0:3c46:4007:5bce:f1bc:606b:2b18"; }; homeros = { ipv4 = "10.243.2.1"; - ipv6 = "42:2::0:3:05::1"; + ipv6 = "42:0:3c46:53e:e63d:e62a:56ea:c705"; }; }.${config.networking.hostName}; + environment.etc."tinc/retiolum/rsa_key.priv" = { + text = (import ../secrets.nix).retiolum.scardanelli.privateKey; + mode = "400"; + }; + services.openvpn.servers = { hu-berlin = { config = ''config ${pkgs.fetchurl { url = https://www.cms.hu-berlin.de/de/dl/netze/vpn/openvpn/hu-berlin.ovpn; sha256 = "d61a644b1e8bd313a8c4bdf1024d8445d56d1fb4a85d2574d597fc020c4901dc"; }} - route-nopull - route 141.20.0.0 255.255.0.0''; + # route-nopull + # route 141.20.0.0 255.255.0.0''; authUserPass = { username = eduroam.identity; password = eduroam.password; diff --git a/configs/packages.nix b/configs/packages.nix index d5d4a2e..039bfea 100644 --- a/configs/packages.nix +++ b/configs/packages.nix @@ -1,11 +1,13 @@ { config, pkgs, ... }: -with pkgs; +let scripts = import ../dot/scripts.nix { inherit pkgs; }; +in with pkgs; { nixpkgs.config.allowUnfree = true; fonts.enableDefaultFonts = true; fonts.fonts = [ corefonts + xlibs.fontschumachermisc eb-garamond fira font-awesome-ttf @@ -16,30 +18,34 @@ with pkgs; ]; environment.systemPackages = [ + abiword arandr + bat blueman chromium config.constants.theme.gtk.package config.constants.theme.icon.package + config.constants.theme.cursor.package + dos2unix ffmpeg file firefox git gnumake + gnumeric gthumb htop imagemagick libnotify - # libreoffice lsof lxappearance mpv pamixer pavucontrol - perl pmount ranger - ripgrep tree + ripgrep + tree rlwrap tor-browser-bundle-bin unzip @@ -48,11 +54,8 @@ with pkgs; whois xclip sxiv - xorg.xbacklight - xorg.xcursorthemes xorg.xkill wpa_supplicant_gui - youtubeDL zathura ]; @@ -61,17 +64,35 @@ with pkgs; enable = true; package = pkgs.openjdk; }; + virtualisation.docker.enable = true; + services.urxvtd.enable = true; + services.dbus.packages = [ pkgs.gnome3.dconf ]; - users.users.kfm.packages = [ - (texlive.combine { inherit (pkgs.texlive) scheme-full latexmk; }) + users.users.kfm.packages = scripts ++ [ + (texlive.combine { inherit (pkgs.texlive) + scheme-tetex + latexmk + biblatex + comment + csquotes + enumitem + fontaxes + ifnextok + imakeidx + libertine + logreq + marginnote + mweights + pbox + stdclsdv + xstring; + }) audacity cabal-install cabal2nix calibre cloc clojure - ctags - dot2tex dropbox-cli fsharp gcc @@ -84,16 +105,15 @@ with pkgs; haskellPackages.hasktags haskellPackages.hindent haskellPackages.hoogle - haskellPackages.pandoc + pandoc haskellPackages.pandoc-citeproc hlint - idris inkscape - jo + jo jq lua maxima + memo mypy - nasm nix-prefetch-git nodejs ocaml @@ -106,9 +126,9 @@ with pkgs; scala seafile-client shellcheck + youtubeDL spotify stack - typora - zeroad + # zeroad ]; } diff --git a/configs/retiolum.nix b/configs/retiolum.nix index 85816dc..d746772 100644 --- a/configs/retiolum.nix +++ b/configs/retiolum.nix @@ -46,7 +46,7 @@ in { name = "retiolum.hosts"; url = "https://lassul.us/retiolum.hosts"; # FIXME - sha256 = "1p7mbam6bkdxzli9znmj7051d64v4vzbjzv7r1fcs89n9fw65fr5"; + sha256 = "1jdrbj5bilaaw36s9llnq73bhf8dz5r6c01vx7wl3k1ayvw1mlq9"; }); environment.systemPackages = [ config.services.tinc.networks.${netname}.package ]; diff --git a/configs/shells.nix b/configs/shells.nix index e9d26ca..c97a132 100644 --- a/configs/shells.nix +++ b/configs/shells.nix @@ -1,18 +1,16 @@ { pkgs, ... }: -let scripts = import ../dot/scripts.nix { inherit pkgs; }; -in { +{ environment.shellAliases = let rlwrap = cmd: "${pkgs.rlwrap}/bin/rlwrap ${cmd}"; in { - o = "xdg-open"; + o = "${pkgs.xdg_utils}/bin/xdg-open"; n = "nix-shell --command zsh"; ":r" = ''echo "You stupid!"''; clipboard = "${pkgs.xclip}/bin/xclip -se c"; - external-ip = "${pkgs.dnsutils}/bin/dig +short myip.opendns.com @resolver1.opendns.com"; ip = "${pkgs.iproute}/bin/ip -c"; ocaml = rlwrap "${pkgs.ocaml}/bin/ocaml"; tmux = "${pkgs.tmux}/bin/tmux -2"; - } // scripts; + }; environment.interactiveShellInit = "export PATH=$PATH:$HOME/.local/bin:$HOME/.cargo/bin"; @@ -25,11 +23,17 @@ in { interactiveShellInit = '' setopt INTERACTIVE_COMMENTS setopt MULTIOS + setopt CORRECT setopt AUTO_NAME_DIRS setopt PUSHD_MINUS PUSHD_TO_HOME AUTO_PUSHD + export KEYTIMEOUT=1 + bindkey -v + bindkey '^w' backward-kill-word + bindkey '^r' history-incremental-search-backward ''; promptInit = '' - PROMPT="%{$fg_bold[white]%}%~ \$([[ \$? == 0 ]] && echo \"%{$fg_bold[green]%}\" || echo \"%{$fg_bold[red]%}\")\$(test $IN_NIX_SHELL && echo λ || echo %#)%{$reset_color%} " + PROMPT=$'%{\e[1m%}%~%{\e[0m%}' + PROMPT="$PROMPT \$([[ \$? == 0 ]] && echo \"%{$fg_bold[green]%}\" || echo \"%{$fg_bold[red]%}\")\$(test $IN_NIX_SHELL && echo λ || echo %#)%{$reset_color%} " RPROMPT='$(git_prompt_info)' ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[cyan]%}" ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}" @@ -41,6 +45,9 @@ in { programs.bash = { promptInit = ''PS1="$(tput bold)\w \$([[ \$? == 0 ]] && echo \"\[\033[1;32m\]\" || echo \"\[\033[1;31m\]\")\$$(tput sgr0) "''; + interactiveShellInit = '' + set -o vi + ''; enableCompletion = true; }; diff --git a/dot/dunst.nix b/dot/dunst.nix new file mode 100644 index 0000000..0131c1e --- /dev/null +++ b/dot/dunst.nix @@ -0,0 +1,45 @@ +{ config, pkgs }: +with import ../theme.nix; +{ + enable = true; + iconTheme = config.constants.theme.icon; + settings = { + global = { + transparency = 10; + font = "${uiFont.name} ${toString uiFont.size}"; + geometry = "200x5-30+20"; + frame_color = invertedColorScheme.background; + follow = "mouse"; + indicate_hidden = true; + notification_height = 0; + separator_height = 2; + padding = 8; + horizontal_padding = 8; + separator_color = "auto"; + sort = true; + markup = "full"; + format = ''%a\n%s\n%b''; + alignment = "left"; + show_age_threshold = 60; + bounce_freq = 0; + word_wrap = true; + ellipsize = "middle"; + ignore_newline = false; + stack_duplicates = true; + hide_duplicate_count = false; + max_icon_size = 32; + sticky_history = true; + history_length = 20; + dmenu = "${pkgs.rofi}/bin/rofi -display-run dunst -show run"; + browser = "${pkgs.xdg_utils}/bin/xdg-open"; + verbosity = "mesg"; + corner_radius = 0; + mouse_left_click = "do_action"; + mouse_right_click = "close_current"; + mouse_middle_click = "close_all"; + }; + urgency_low = { frame_color = invertedColorScheme.background; background = invertedColorScheme.background; foreground = invertedColorScheme.foreground; timeout = 5; }; + urgency_normal = { frame_color = invertedColorScheme.background; background = invertedColorScheme.background; foreground = invertedColorScheme.foreground; timeout = 10; }; + urgency_critical = { frame_color = invertedColorScheme.red.dark; background = invertedColorScheme.red.dark; foreground = invertedColorScheme.foreground; timeout = 0; }; + }; +} diff --git a/dot/i3.nix b/dot/i3.nix new file mode 100644 index 0000000..d3673fd --- /dev/null +++ b/dot/i3.nix @@ -0,0 +1,90 @@ +{ pkgs, config, lib }: +let + unstable = import {}; + i3blocks_conf = import ./i3blocks.nix { inherit pkgs; }; + new-workspace = unstable.writers.writeDash "new-workspace" '' + i3-msg workspace $(($(i3-msg -t get_workspaces | tr , '\n' | grep '"num":' | cut -d : -f 2 | sort -rn | head -1) + 1)) + ''; + move-to-new-workspace = unstable.writers.writeDash "new-workspace" '' + i3-msg move container to workspace $(($(i3-msg -t get_workspaces | tr , '\n' | grep '"num":' | cut -d : -f 2 | sort -rn | head -1) + 1)) + ''; +in with import ../theme.nix; +rec { + fonts = [ "${uiFont.name} ${toString uiFont.size}" ]; + modifier = "Mod4"; + window = { + titlebar = false; + border = 1; + hideEdgeBorders = "smart"; + }; + floating = { + titlebar = false; + border = 1; + }; + colors = + let scheme = { background = colorScheme.background; text = colorScheme.foreground; }; + in { + focused = scheme // { + border = colorScheme.background; + indicator = colorScheme.background; + childBorder = colorScheme.background; + }; + focusedInactive = scheme // { + border = colorScheme.background; + indicator = colorScheme.background; + childBorder = colorScheme.background; + }; + unfocused = scheme // { + border = colorScheme.background; + indicator = colorScheme.background; + childBorder = colorScheme.background; + }; + urgent = scheme // { + border = colorScheme.red.light; + indicator = colorScheme.red.light; + childBorder = colorScheme.red.light; + }; + placeholder = scheme // { + border = colorScheme.green.light; + indicator = colorScheme.green.light; + childBorder = colorScheme.green.light; + }; + }; + bars = []; + keybindings = { + "${modifier}+Down" = "focus down"; + "${modifier}+Left" = "focus left"; + "${modifier}+Return" = "exec ${config.defaultApplications.terminal}"; + "${modifier}+Right" = "focus right"; + "${modifier}+Shift+Down" = "move down"; + "${modifier}+Shift+Left" = "move left"; + "${modifier}+Shift+Right" = "move right"; + "${modifier}+Shift+Up" = "move up"; + "${modifier}+Shift+c" = "reload"; + "${modifier}+Shift+n" = "rove window to workspace next"; + "${modifier}+Shift+b" = "move window to workspace prev"; + "${modifier}+Shift+q" = "kill"; + "${modifier}+Shift+r" = "restart"; + "${modifier}+Shift+w" = "exec ${pkgs.xautolock}/bin/xautolock -locknow"; + "${modifier}+Shift+x" = "exec --no-startup-id ${move-to-new-workspace}"; + "${modifier}+Shift+z" = "floating toggle"; + "${modifier}+Up" = "focus up"; + "${modifier}+a" = "exec ${pkgs.rofi}/bin/rofi -display-window — -show window"; + "${modifier}+d" = "exec ${pkgs.rofi}/bin/rofi -display-run — -show run"; + "${modifier}+e" = "layout toggle split"; + "${modifier}+f" = "fullscreen toggle"; + "${modifier}+h" = "split h"; + "${modifier}+n" = "workspace next"; + "${modifier}+b" = "workspace prev"; + "${modifier}+r" = "mode resize"; + "${modifier}+s" = "layout stacking"; + "${modifier}+t" = "exec ${config.defaultApplications.fileManager}"; + "${modifier}+v" = "split v"; + "${modifier}+w" = "layout tabbed"; + "${modifier}+x" = "exec --no-startup-id ${new-workspace}"; + "${modifier}+y" = "exec ${config.defaultApplications.browser}"; + "XF86AudioLowerVolume" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -d 5 && pkill -RTMIN+3 i3blocks"; + "XF86AudioMute" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -t && pkill -RTMIN+3 i3blocks"; + "XF86AudioRaiseVolume" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -i 5 && pkill -RTMIN+3 i3blocks"; + }; +} diff --git a/dot/i3blocks.nix b/dot/i3blocks.nix new file mode 100644 index 0000000..0d0f744 --- /dev/null +++ b/dot/i3blocks.nix @@ -0,0 +1,183 @@ +{ pkgs }: +let + unstable = import {}; + spotify_info = unstable.writers.writeBash "spotify.info" '' + if $(pgrep spotify); then + STATUS=$(${pkgs.dbus}/bin/dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'PlaybackStatus'|egrep -A 1 "string"|cut -b 26-|cut -d '"' -f 1|egrep -v ^$) + + if [[ "$STATUS" == 'Playing' ]]; then + printf '\uf1bc ' + printf '\uf04b' + elif [[ "$STATUS" == 'Paused' ]]; then + printf '\uf1bc ' + printf '\uf04c' + elif [[ "$STATUS" == 'Stopped' ]]; then + printf '\uf1bc ' + printf '\uf04d' + else + exit 1 + fi + + printf ' ' + + METADATA=$(${pkgs.dbus}/bin/dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata') + ARTIST=$(echo "$METADATA" | egrep -A 2 "artist" | egrep -v "artist" | egrep -v "array" | cut -b 27- | cut -d '"' -f 1 | egrep -v ^$) + TITLE=$(echo "$METADATA" | egrep -A 1 "title" | egrep -v "title" | cut -b 44- | cut -d '"' -f 1 | egrep -v ^$) + + printf "%s \u2237 %s" "$ARTIST" "$TITLE" + fi + ''; + battery_info = unstable.writers.writeBash "battery.info" '' + BAT_DIR="/sys/class/power_supply/$BLOCK_INSTANCE/" + if [ -d "$BAT_DIR" ]; then + cd "$BAT_DIR" + else + exit 1 + fi + + if [ -e charge_now ] && [ -e charge_full ]; then + FULL_CHARGE=charge_full + CURR_CHARGE=charge_now + elif [ -e energy_now ] && [ -e energy_full ]; then + FULL_CHARGE=energy_full + CURR_CHARGE=energy_now + else + ls >&2 + exit 1 + fi + + status=$(cat status) + charge_f=$((100 * $(cat $CURR_CHARGE) / $(cat $FULL_CHARGE))) + + if [[ "$charge_f" -lt 20 ]]; then + printf '\uf244' + elif [[ "$charge_f" -lt 40 ]]; then + printf '\uf243' + elif [[ "$charge_f" -lt 60 ]]; then + printf '\uf242' + elif [[ "$charge_f" -lt 80 ]]; then + printf '\uf241' + else + printf '\uf240' + fi + + printf ' ' + + if [[ "$status" == 'Charging' ]]; then + printf '\uf106' + elif [[ "$status" == 'Discharging' ]]; then + printf '\uf107' + elif [[ "$status" == 'Full' ]]; then + printf '\uf0e7' + else + printf '[%s]' "$status" + fi + + printf ' ' + + if [[ "$status" != 'Full' ]]; then + rate_raw=$(($(cat voltage_now) * $(cat power_now))) + rate=$(bc <<< "scale=1; $rate_raw / 10^12") + printf '%s\u2009W, ' "$rate" + fi + + charge_d=$((100 * $(cat $CURR_CHARGE) / $(cat $FULL_CHARGE))) + printf '%s%%\n' "$charge_d" + + if [[ "$status" == 'Discharging' ]]; then + if [[ "$charge_d" -lt 10 ]]; then + printf '\n#E41C28' + elif [[ "$charge_d" -lt 20 ]]; then + printf '\n#EEBF13' + fi + fi + ''; + volume_info = unstable.writers.writeBash "volume.info" '' + if [[ "$BLOCK_BUTTON" == 1 ]]; then + ${pkgs.pamixer}/bin/pamixer -i 5 + elif [[ "$BLOCK_BUTTON" == 3 ]]; then + ${pkgs.pamixer}/bin/pamixer -d 5 + elif [[ "$BLOCK_BUTTON" == 2 ]]; then + ${pkgs.pamixer}/bin/pamixer -t + fi + + if $(${pkgs.pamixer}/bin/pamixer --get-mute); then + printf '\uf026 0%%\n\n#EEBF13' + else + volume=$(${pkgs.pamixer}/bin/pamixer --get-volume) + printf '\uf028 %s%%' "$volume" + fi + ''; + fancyDate = unstable.writers.writeC "fancy_date.c" {} '' + #include + #include + #include + + int main(void) { + time_t now = time(NULL); + struct tm *today = localtime(&now); + wchar_t roman_month = 0x2160 + today->tm_mon; + wprintf(L"%d\u2009%lc\u2009%d [%d|%d]\n", today->tm_mday, roman_month, 1900 + today->tm_year, today->tm_wday == 0 ? 7 : today->tm_wday, today->tm_yday/7 + 1); + return 0; + } + ''; +in with import ../theme.nix; '' + markup=pango + align=center + color=${white} + + [spotify] + command=${spotify_info} + interval=2 + + [separator] + + [volume] + command=${volume_info} + min_width= 100% + interval=once + signal=3 + + [separator] + + [cpu_usage] + command=cut -d' ' -f 1-3 < /proc/loadavg + label= + interval=2 + + [separator] + + [ram_usage] + command=free -h | grep "Mem" | awk '{print $3}' + label= + interval=2 + align=center + + [separator] + + [battery] + command=${battery_info} + interval=10 + instance=BAT1 + + [separator] + + [date] + command=${fancyDate} + interval=1 + label= + + [separator] + + [time] + command=date +'%H:%M' + interval=1 + label= + + [separator] + command=${pkgs.xkblayout-state}/bin/xkblayout-state print %s + label= + interval=2 + + [separator] +'' diff --git a/dot/rofi.nix b/dot/rofi.nix new file mode 100644 index 0000000..51a6571 --- /dev/null +++ b/dot/rofi.nix @@ -0,0 +1,34 @@ +{ config }: +with import ../theme.nix; +{ + enable = true; + separator = "solid"; + scrollbar = false; + terminal = config.defaultApplications.terminal; + borderWidth = 0; + lines = 5; + font = "${uiFont.name} ${toString (uiFont.size + 1)}"; + colors = rec { + window = { background = invertedColorScheme.background; border = invertedColorScheme.background; separator = invertedColorScheme.black.light; }; + rows = { + normal = { + background = window.background; + backgroundAlt = window.background; + foreground = invertedColorScheme.foreground; + highlight = { foreground = invertedColorScheme.cyan.dark; inherit (window) background; }; + }; + active = { + background = window.background; + backgroundAlt = window.background; + foreground = invertedColorScheme.yellow.dark; + highlight = { foreground = invertedColorScheme.green.dark; inherit (window) background; }; + }; + urgent = { + background = window.background; + backgroundAlt = window.background; + foreground = invertedColorScheme.red.dark; + highlight = { foreground = invertedColorScheme.magenta.dark; inherit (window) background; }; + }; + }; + }; +} diff --git a/dot/scripts.nix b/dot/scripts.nix index 8c4a0e6..54cb01d 100644 --- a/dot/scripts.nix +++ b/dot/scripts.nix @@ -1,6 +1,8 @@ { pkgs }: let - bingWallpaper = pkgs.writers.writeBash "bing-wallpaper.sh" '' + theme = import ../theme.nix; + unstable = import {}; + bingWallpaper = unstable.writers.writeBash "bing-wallpaper.sh" '' PICTURE_DIR="$HOME/pictures/external/bing/" mkdir -p $PICTURE_DIR @@ -17,18 +19,7 @@ let fi done ''; - colorize = pkgs.writers.writeDash "colorize.sh" '' - colorize() { - ${pkgs.python36Packages.pygments}/bin/pygmentize -l $1 -O bg=dark - } - - if [ -z "$2" ]; then - colorize "$1" - else - cat "$2" | colorize "$1" - fi - ''; - easyBackup = pkgs.writers.writeDash "easy-backup.sh" '' + easyBackup = unstable.writers.writeDash "easy-backup" '' if [ -d "$1" ]; then OUTPUT_ROOT=''${1}/backup/current rsync -hav --delete --stats --progress --exclude-from=$HOME/bin/backup.exclude $HOME/* $OUTPUT_ROOT/ @@ -37,107 +28,7 @@ let exit 1 fi ''; - compile = pkgs.writers.writeBash "compile.sh" '' - if [ -z "$1" ]; then - echo "Usage: compile " - fi - - file="$1" - ext="''${file##*.}" - name="''${file%.*}" - - case "$ext" in - asm) - echo Compiling "$name" with the Netwide Assembler... - nasm -felf64 -o "$name".o "$file" - gcc -o "$name" "$name".o;; - c) - echo Compiling "$name" with the GNU C Compiler... - gcc -std=c11 -Wall -Wpedantic -Ofast -o "$name" "$file";; - cpp|cxx|cc) - echo Compiling "$name" with the GNU C++ Compiler... - g++ -std=c++11 -Wall -O3 -o "$name" "$file";; - bf) - echo Compiling "$name" with the BrainFuck Compiler... - bf2c "$file" "$name".c && compile "$name".c && rm "$name".c;; - s) - echo Assembling "$name" with the GNU Assembler... - gcc -o "$name" "$file";; - hs) - echo Compiling "$name" with the Glasgow Haskell Compiler... - stack ghc -- -Wall -O3 --make "$file" && rm "$name".hi "$name".o;; - java) - echo Compiling "$name" with the Oracle Java Compiler... - javac "$file";; - rb) - echo Compiling "$name" with Ruby... - ruby -c "$file";; - lua) - echo Compiling "$name" with the Lua Compiler... - luac -o "$name".luac "$file";; - py) - if [ ""$2"" = "--optimize" ]; then - echo Compiling "$name" with the optimizing Python Compiler... - if [ -e "$name".pyo ]; then - rm "$name".pyo - fi - python3 -O -mpy_compile "$file" - mv __pycache__/"$name".cpython-33.pyo ./"$name".pyo - rmdir __pycache__ - else - echo Compiling "$name" with the Python Compiler... - if [ -e "$name".pyc ]; then - rm "$name".pyc - fi - python3 -mpy_compile "$file" - mv __pycache__/"$name".cpython-33.pyc ./"$name".pyc - rmdir __pycache__ - fi;; - ml) - echo Compiling "$name" with the OCaml Compiler... - ocamlc -o "$name" "$file" && rm "$name".cmo "$name".cmi;; - cs) - echo Compiling "$name" with the Mono C£ Compiler... - mono-csc -out:"$name" "$file";; - fs) - echo Compiling "$name" with the F£ Compiler... - fsharpc -out:"$name" "$file";; - vala) - echo Compiling "$name" with the Vala Compiler... - valac --pkg=gtk+-3.0 "$file";; - md) - echo Converting "$name" to PDF with Pandoc... - pandoc --latex-engine=xelatex -V documentclass=scrartcl -o "$name".pdf "$file";; - tex) - echo Compiling "$name" to PDF with LaTeX... - latexmk -pdf "$file";; - lhs) - echo Compiling "$name" with the Glasgow Haskell Compiler... - ghc -Wall -O3 --make "$file" - echo Converting "$name" to PDF Markup with Pandoc... - pandoc "$file" -f markdown+lhs --latex-engine=xelatex -V documentclass=scrartcl -o "$name".pdf;; - d) - echo Compiling "$name" with the GNU D Compiler... - gdc -Wall -O3 -o "$name" "$file";; - m) - echo Compiling "$name" with the GNU/GNUstep Objective C Compiler... - £ gcc -Wall -o "$name" -MMD -MP -DGNUSTEP -DGNUSTEP_BASE_LIBRARY=1 -DGNU_GUI_LIBRARY=1 -DGNU_RUNTIME=1 -DGNUSTEP_BASE_LIBRARY=1 -fno-strict-aliasing -fexceptions -fobjc-exceptions -D_NATIVE_OBJC_EXCEPTIONS -pthread -fPIC -DGSWARN -Wno-import -g -O2 -fgnu-runtime -fconstant-string-class=NSConstantString -fexec-charset=UTF-8 -I. -I/usr/local/include/GNUstep -I/usr/include/GNUstep -lobjc -lgnustep-base "$file" - gcc `gnustep-config --objc-flags` "$file" -o "$name" -lgnustep-base -lobjc - ;; - pas) - echo Compiling "$name" with the FreePascal Compiler... - fpc "$file";; - rs) - echo Compiling "$name" with the Rust Compiler... - rustc "$file";; - ts) - echo Compiling "$name" with the TypeScript Compiler... - tsc "$file";; - *) - echo Compiler for "$ext" not found!;; - esac - ''; - gitPullAll = pkgs.writers.writeDash "git-pull-all.sh" '' + gitPullAll = unstable.writers.writeDashBin "pull-all" '' # store the current dir CUR_DIR=$(pwd) # Let the person running the script know what's going on. @@ -156,196 +47,7 @@ let done echo -e "\n\033[32mComplete!\033[0m\n" ''; - gripe = pkgs.writers.writeBash "gripe.sh" ''${sidepipe} '(:\d+:|-\d+-|--)(\x1b[[]K)?' "$@"''; - haskellDefinition = pkgs.writers.writeBash "hdef.sh" '' - paths="" - while true; do - if [ -d "$1" ]; then - paths="$paths $1" - else - break - fi - shift - done - str="$1" - shift - - lower=$(echo "$str" | tr A-Z a-z) - if [ "''${lower:0:1}" == "''${str:0:1}" ]; then - expr="($str( |$)|[[:space:]]+$str[[:space:]]*::)" - else - kws="(class|data|type|newtype)" - eow="([ \n\t]|$)" - expr="$kws[[:space:]]+($str$eow|[^=]+=>[[:space:]]+$str$eow)" - fi - - ${haskellFind} $paths -print0 | xargs -0 grep -En --colour=never -A10 "$@" "^$expr" | ${gripe} hcol | ${highlight} $str - ''; - haskellFind = pkgs.writers.writeDash "hfind.sh" '' - paths="" - while true; do - if [ -d "$1" ]; then - paths="$paths $1" - else - break - fi - shift - done - find $paths \( -name "*.hs" -or -name "*.hsi" -or -name "*.lhs" -or -name "*.hs-boot" \) -a -not \( -name ".*" -or -path "*/_darcs/*" -o -name '.£*' \) "$@" - ''; - haskellGrep = pkgs.writers.writeDash "hgrep.sh" '' - if [ -z "$1" -o "$1" == "--help" -o "$1" == "-h" ]; then - echo "Usage: hg [PATH] IDENTIFIER [GREP OPTIONS...]" - echo "Seaches for uses of the given Haskell identifier." - exit 1 - fi - - paths="" - while true; do - if [ -d "$1" ]; then - paths="$paths $1" - else - break - fi - shift - done - - colour=always - if [ "$TERM" == "dumb" -o "$NO_COLORS" == "1" ]; then - colour=never - fi - ${haskellFind} $paths -print0 | xargs -0 grep -nw --colour=$colour "$@" - ''; - highlight = pkgs.writers.writePython3 "hl.py" { - libraries = [ pkgs.python36Packages.ansicolors ]; - flakeIgnore = [ "E302" "E999" "E231" "E701" "W605" "E231" "E305" ]; - } '' - import os - import sys - import re - from ansicolors import * - - def replfun((re,colfun)): - def onmatch(m): - if m.groups() != (): - buf = [] - p = m.start(0) - mstr = m.string - try: - i = 1 - while True: - (s,e) = m.span(i) - if s == -1: continue - buf.append(mstr[p:s]) - buf.append(colfun(mstr[s:e])) - p = e - i += 1 - except IndexError: - buf.append(mstr[p:m.end(0)]) - return '\'.join(buf) - else: - return colfun(m.expand("\g<0>")) - return lambda s: re.subn(onmatch,s)[0] - - colfuns = [green, red, magenta, cyan, blue] - flags = re.L - if len(sys.argv) > 1 and sys.argv[1] == '-i': - flags = flags | re.I - exps = sys.argv[2:] - else: - exps = sys.argv[1:] - regexps = map(lambda e: re.compile(e, flags), exps) - hlfuns = map(replfun, zip(regexps, colfuns)) - - term = os.getenv("TERM") - no_colors = os.getenv("NO_COLORS") - if term == "dumb" or no_colors == "1": - for line in sys.stdin: - sys.stdout.write(line) - else: - for line in sys.stdin: - sys.stdout.write(reduce(lambda s, f: f(s), hlfuns, line)) - ''; - haskellTags = pkgs.writers.writeDash "htags.sh" '' - id="[a-z_][a-zA-Z0-9_\']*" - ws="[ \\t]" - ID="[A-Z][a-zA-Z0-9_\']*" - - ${pkgs.ctags}/bin/ctags --tag-relative=no \ - '--langdef=haskell' \ - '--langmap=haskell:.hs.lhs' \ - '--regex-haskell=/^(type|data|newtype)[ \t]+([^ \t=]+)/\2/' \ - '--regex-haskell=/^class[^=]+=>[ \t]*([^ \t]+)/\1/' \ - '--regex-haskell=/^class[ \t]+([^ \t]+)[^=]*$/\1/' \ - "--regex-haskell=/^$ws*($id)$ws*::/\1/" \ - "--regex-haskell=/^($id)/\1/" \ - "$@" - ''; - sidepipe = pkgs.writers.writePython3 "sidepipe.py" { flakeIgnore = [ "E302" "E231" "E999" "E265" "E305" ]; } '' - import sys - import re - import os.path - from Queue import Queue - from subprocess import Popen, PIPE - from threading import Thread - - pipeIsLeft = os.path.basename(sys.argv[0]) == "leftpipe" - regex = sys.argv[1] - cmd = sys.argv[2:] - - class WorkerThread(Thread): - def __init__(self, queue, instream, outstream, pipeIsLeft): - Thread.__init__(self) - self.queue = queue - self.instream = instream - self.outstream = outstream - self.pipeIsLeft = pipeIsLeft - - class SplitThread(WorkerThread): - def run(self): - try: - for line in self.instream: - match = re.search(regex,line) - if not match: - print >> sys.stderr, "No match: %r in %r" % (regex,line) - continue - index = match.end() - left, right = line[:index], line[index:] - if pipeIsLeft: - self.outstream.write(left) - self.queue.put(right) - else: - self.outstream.write(right) - self.queue.put(left) - self.outstream.close() - except IOError, e: - print >> sys.stderr, e[1] - self.outstream.close() - while not queue.full(): - queue.put("") - - class JoinThread(WorkerThread): - def run(self): - for pipeline in self.instream: - #print >> sys.stderr, "wait" - passline = self.queue.get() - #print >> sys.stderr, "ok" - if pipeIsLeft: - self.outstream.write(pipeline) - self.outstream.write(passline) - else: - self.outstream.write(passline) - self.outstream.write(pipeline) - - pipe = Popen(cmd, shell=False,stdin=PIPE,stdout=PIPE) - queue = Queue(250) - t1 = SplitThread(queue, sys.stdin, pipe.stdin, pipeIsLeft) - t2 = JoinThread(queue, pipe.stdout, sys.stdout, pipeIsLeft) - t1.start() - t2.start() - t2.join() - ''; - spotifyCli = pkgs.writers.writeBash "sp.sh" '' + spotifyCli = unstable.writers.writeBashBin "sp" '' # This is sp, the command-line Spotify controller. It talks to a running # instance of the Spotify Linux client over dbus, providing an interface not # unlike mpc. @@ -616,29 +318,158 @@ let fi fi ''; - spotifyGenius = pkgs.writers.writeBash "spgenius.sh" '' + spotifyGenius = unstable.writers.writeDashBin "spgenius.sh" '' function normalise { - echo ''${1// /-} + echo "$1" | tr ' ' - } eval $(${spotifyCli} eval) ${pkgs.xdg_utils}/bin/xdg-open "http://genius.com/$(normalise "$SPOTIFY_ARTIST")-$(normalise "$SPOTIFY_TITLE")-lyrics" ''; - generateShellNix = pkgs.fetchurl { - url = "https://raw.githubusercontent.com/kmein/generate-shell-nix/81f77661705ee628d1566f2dea01f2d731fda79d/generate-shell-nix"; - sha256 = "0r661z9s5zw0gas2f73aakplfblj1jjlbijmm7gf513xkq61jxm8"; - executable = true; - }; -in { - compile = compile; - easy-backup = easyBackup; - colorize = colorize; - bing-wallpaper = bingWallpaper; - git-pull-all = gitPullAll; - hdef = haskellDefinition; - hfind = haskellFind; - hgrep = haskellGrep; - htags = haskellTags; - sp = spotifyCli; - spgenius = spotifyGenius; - generate-shell-nix = generateShellNix; -} + generateShellNix = + let generateShellNixPath = pkgs.fetchurl { + url = "https://raw.githubusercontent.com/kmein/generate-shell-nix/81f77661705ee628d1566f2dea01f2d731fda79d/generate-shell-nix"; + sha256 = "0r661z9s5zw0gas2f73aakplfblj1jjlbijmm7gf513xkq61jxm8"; + executable = true; + }; + in unstable.writers.writeDashBin "generate-shell-nix" ''${generateShellNixPath} $*''; + dic = + let dicPath = pkgs.fetchurl { + url = "https://cgit.krebsco.de/dic/plain/dic?id=beeca40313f68874e05568f4041423c16202e9da"; + sha256 = "1d25pm420fnbrr273i96syrcd8jkh8qnflpfgxlsbzmbmfizfzld"; + executable = true; + }; + in unstable.writers.writeDashBin "dic" ''${dicPath} $*''; + font-size = unstable.writers.writeDashBin "font-size" '' + set -efu + + # set_font NORMAL_FONT BOLD_FONT + set_font() { + printf '\033]710;%s\007' "$1" + printf '\033]711;%s\007' "$2" + } + + case ''${1-} in + '''|0|--reset) + set_font \ + "xft:${theme.terminalFont.name}:size=${toString theme.terminalFont.size}" \ + "xft:${theme.terminalFont.name}:size=${toString theme.terminalFont.size}:bold" \ + ;; + [2-9]|[1-9][0-9]|[1-9][0-9][0-9]) + set_font \ + "xft:${theme.terminalFont.name}:size=$1" \ + "xft:${theme.terminalFont.name}:size=$1:bold" \ + ;; + *) + echo "$0: bad argument: $1" >&2 + exit 1 + esac + ''; + wttr = unstable.writers.writeDashBin "wttr" '' + ${pkgs.curl}/bin/curl -s -H "Accept-Language: ''${LANG%_*}" --compressed "wttr.in/''${1-$(${pkgs.curl}/bin/curl -s ipinfo.io | ${pkgs.jq}/bin/jq .loc)}?0" + ''; + q = + let + q-performance = '' + show_load() { + ${pkgs.coreutils}/bin/cat /proc/loadavg | ${pkgs.gawk}/bin/gawk '{ print $1, $2, $3}' + } + + show_memory() { + ${pkgs.procps}/bin/free -h | ${pkgs.gnugrep}/bin/grep "Mem" | ${pkgs.gawk}/bin/gawk '{print $3}' + } + + printf "\x1b[33m%s \x1b[1m%s\x1b[0m\n" "$(show_load)" "$(show_memory)" + ''; + q-isodate = '' + ${pkgs.coreutils}/bin/date '+%Y-%m-%d %H:%M:%S%:z' + ''; + q-volume = '' + is_mute() { + if $(${pkgs.pamixer}/bin/pamixer --get-mute); then + echo "(Mute)" + else + echo + fi + } + + current_volume() { + ${pkgs.pamixer}/bin/pamixer --get-volume + } + + printf "\x1b[36m%d%%\x1b[0m %s\n" "$(current_volume)" "$(is_mute)" + ''; + q-online = '' + if ${pkgs.curl}/bin/curl -s google.com >/dev/null; then + echo 'online' + else + echo 'offline' + fi + ''; + q-battery = '' + BAT_DIR="/sys/class/power_supply/BAT1/" + if test ! -d "$BAT_DIR"; then + exit 1 + fi + + if test -e "$BAT_DIR/charge_now" -a -e "$BAT_DIR/charge_full"; then + FULL_CHARGE="$BAT_DIR/charge_full" + CURR_CHARGE="$BAT_DIR/charge_now" + elif test -e "$BAT_DIR/energy_now" -a -e "$BAT_DIR/energy_full"; then + FULL_CHARGE="$BAT_DIR/energy_full" + CURR_CHARGE="$BAT_DIR/energy_now" + else + ls >&2 + exit 1 + fi + + STATUS="$BAT_DIR/status" + + charge_d=$((100 * $(${pkgs.coreutils}/bin/cat $CURR_CHARGE) / $(${pkgs.coreutils}/bin/cat $FULL_CHARGE))) + if [[ "$charge_d" -lt 10 ]]; then + printf "\x1b[31m" + elif [[ "$charge_d" -lt 20 ]]; then + printf "\x1b[33m" + else + printf "\x1b[32m" + fi + + printf '%s%%\x1b[0m (%s)\n' "$charge_d" $(${pkgs.coreutils}/bin/cat "$STATUS") + ''; + q-todo = '' + TODO_file=$PWD/.todo + if test -e "$TODO_file"; then + printf "\n\x1b[1mTodo\x1b[0m\n" + ${pkgs.coreutils}/bin/cat "$TODO_file" \ + | ${pkgs.gawk}/bin/gawk -v now=$(${pkgs.coreutils}/bin/date +%s) ' + BEGIN { print "remind=0" } + /^[0-9]/{ + x = $1 + gsub(".", "\\\\&", x) + rest = substr($0, index($0, " ")) + rest = $0 + sub(" *", "", rest) + gsub(".", "\\\\&", rest) + print "test $(${pkgs.coreutils}/bin/date +%s -d"x") -lt "now" && \ + echo \"\x1b[93m\""rest esc "\"\x1b[m\" && \ + (( remind++ ))" + } + END { print "test $remind = 0 && echo \"nothing to remind\"" } + ' \ + | { + # bash needed for (( ... )) + ${pkgs.bash}/bin/bash + } + fi + ''; + in unstable.writers.writeBashBin "q" '' + set -eu + export PATH=/var/empty + ${q-isodate} + ${q-performance} + (${q-volume}) & + (${q-battery}) & + (${q-online}) & + wait + (${q-todo}) || : + ''; +in [ spotifyCli dic easyBackup gitPullAll font-size generateShellNix q wttr ] diff --git a/dot/ssh.nix b/dot/ssh.nix index 613a0d9..6c7aa10 100644 --- a/dot/ssh.nix +++ b/dot/ssh.nix @@ -1,22 +1,10 @@ { lib }: with lib; -let huServer = name: '' - Host ${name} - User ${(import ../secrets.nix).eduroam.identity} - HostName ${name}.informatik.hu-berlin.de - IdentityFile ~/.ssh/hu - ''; -in '' - Host github - User git - HostName github.com - - Host gitlab - User git - HostName gitlab.informatik.hu-berlin.de - - Host happysrv - User meinhark - HostName v22017123717458308.happysrv.de - Port 49000 -'' + strings.concatMapStringsSep "\n\n" huServer [ "rabe" "star" "gruenau" "gruenau1" "gruenau2" "gruenau3" "gruenau4" "gruenau5" "gruenau6" "gruenau7" "gruenau8" ] +let huServer = name: { + "${name}" = { + hostname = "${name}.informatik.hu-berlin.de"; + user = (import ../secrets.nix).eduroam.identity; + identityFile = "~/.ssh/hu"; + }; +}; +in lists.foldr (x: xs: huServer x // xs) {} [ "rabe" "star" "gruenau" "gruenau1" "gruenau2" "gruenau3" "gruenau4" "gruenau5" "gruenau6" "gruenau7" "gruenau8" ] diff --git a/dot/urxvt.nix b/dot/urxvt.nix new file mode 100644 index 0000000..06a77f2 --- /dev/null +++ b/dot/urxvt.nix @@ -0,0 +1,15 @@ +{ pkgs }: +with import ../theme.nix; +{ + enable = true; + package = pkgs.rxvt_unicode-with-plugins; + keybindings = { + "Shift-Control-C" = "eval:selection_to_clipboard"; + "Shift-Control-V" = "eval:paste_clipboard"; + }; + scroll.bar.enable = false; + extraConfig = { + perl-ext-common = "default,clipboard,url-select,keyboard-select"; + fading = 50; + }; +} diff --git a/dot/xresources.nix b/dot/xresources.nix index 50572c5..c503dd6 100644 --- a/dot/xresources.nix +++ b/dot/xresources.nix @@ -1,13 +1,16 @@ -'' -XTerm*termName: xterm-256color -XTerm*locale: true -XTerm*saveLines: 4096 -XTerm*geometry: 80x32 -XTerm*reverseVideo: true -XTerm*faceName: Source Code Pro for Powerline:size=10:antialias=true -XTerm*font: 7x13 -Xterm*charClass: 33:48,35:48,37:48,43:48,45-47:48,64:48,95:48,126:48 -XTerm*translations: #override \n\ - Ctrl Shift C: copy-selection(CLIPBOARD) \n\ - Ctrl Shift V: insert-selection(CLIPBOARD) -'' +{ lib }: +let theme = import ../theme.nix; +in with lib; lists.foldr + (i: cs: cs // { "*color${toString i}" = builtins.elemAt theme.colorPalette i; }) + { + "*background" = theme.colorScheme.background; + "*foreground" = theme.colorScheme.foreground; + "*fadeColor" = theme.colorScheme.fadeColor; + "*cursorColor" = theme.colorScheme.cursorColor; + "*pointerColorForeground" = theme.colorScheme.pointerColorForeground; + "*pointerColorBackground" = theme.colorScheme.pointerColorBackground; + "*.font" = "xft:${theme.terminalFont.name}:size=${toString theme.terminalFont.size}"; + "*.boldFont" = "xft:${theme.terminalFont.name}:style=Bold:size=${toString theme.terminalFont.size}"; + "*.italicFont" = "xft:${theme.terminalFont.name}:style=Italic:size=${toString theme.terminalFont.size}"; + } + (lists.range 0 15) diff --git a/dot/zathura.nix b/dot/zathura.nix new file mode 100644 index 0000000..da918e6 --- /dev/null +++ b/dot/zathura.nix @@ -0,0 +1,5 @@ +{ + options = { + selection-clipboard = "clipboard"; + }; +} diff --git a/options.nix b/options.nix index e583b98..5d21fc0 100644 --- a/options.nix +++ b/options.nix @@ -13,11 +13,11 @@ let default = def; }; in { - options.defaultApplications = mapAttrs (const stringOption) { - terminal = "${pkgs.xterm}/bin/xterm"; + options.defaultApplications = mapAttrs (const stringOption) rec { + terminal = "${pkgs.rxvt_unicode-with-plugins}/bin/urxvtc"; browser = "${pkgs.chromium}/bin/chromium"; - fileManager = "${pkgs.xterm}/bin/xterm ${pkgs.ranger}/bin/ranger"; - locker = "${pkgs.i3lock}/bin/i3lock -e -c ${strings.removePrefix "#" gray.dark}"; + fileManager = "${terminal} ${pkgs.ranger}/bin/ranger"; + locker = "${pkgs.i3lock}/bin/i3lock -u -c ${strings.removePrefix "#" colorScheme.background}"; }; options.constants = { @@ -29,12 +29,13 @@ in { ignore = mkOption { type = types.listOf types.string; - default = [ "*~" ".stack-work/" "__pycache__/" ".mypy_cache/" "*.o" "*.hi" "*.aux" "*.class" "*.dyn_hi" "*.dyn_o" "dist/" ]; + default = [ "*~" ".stack-work/" "__pycache__/" ".mypy_cache/" "*.py[co]" "*.o" "*.hi" "*.aux" "*.class" "*.dyn_hi" "*.dyn_o" "dist/" ]; }; theme = mapAttrs (const themeOption) { - gtk = { name = "Paper"; package = pkgs.paper-gtk-theme; }; - icon = { name = "Paper"; package = pkgs.paper-icon-theme; }; + gtk = { name = "Breeze-Dark"; package = pkgs.breeze-gtk; }; + icon = { name = "Adwaita"; package = pkgs.gnome3.adwaita-icon-theme; }; + cursor = { name = "capitaine-cursors"; package = pkgs.capitaine-cursors; }; }; }; diff --git a/theme.nix b/theme.nix index bec73a1..238ef97 100644 --- a/theme.nix +++ b/theme.nix @@ -1,28 +1,53 @@ -rec { - uiFont = { name = "Roboto"; size = 10; }; - terminalFont = { - regular = { name = "Source Code Pro for Powerline"; }; - bold = { name = "Source Code Pro Bold for Powerline"; }; - italic = { name = "Source Code Pro Italic for Powerline"; }; - boldItalic = { name = "Source Code Pro Bold Italic for Powerline"; }; - size = 10; +let + antares = rec { + black = { light = "#151515"; dark = "#000000"; }; + red = { light = "#de575c"; dark = "#de575c"; }; + yellow = { light = "#ebe971"; dark = "#ebe971"; }; + green = { light = "#00b853"; dark = "#00b853"; }; + blue = { light = "#90d0f0"; dark = "#7fc6f0"; }; + magenta = { light = "#cf9ffa"; dark = "#cf9ffa"; }; + cyan = { light = "#4ae5e8"; dark = "#4ae5e8"; }; + white = { light = "#ffffff"; dark = "#bbbbbb"; }; + background = black.dark; + foreground = white.dark; }; + solarizedDark = rec { + black = { dark = "#073642"; light = "#002b36"; }; + red = { dark = "#dc322f"; light = "#cb4b16"; }; + yellow = { dark = "#b58900"; light = "#657b83"; }; + green = { dark = "#859900"; light = "#586e75"; }; + blue = { dark = "#268bd2"; light = "#839496"; }; + magenta = { dark = "#d33682"; light = "#6c71c4"; }; + cyan = { dark = "#2aa198"; light = "#93a1a1"; }; + white = { dark = "#eee8d5"; light = "#fdf6e3"; }; + background = black.light; + foreground = blue.light; + fadeColor = black.light; + cursorColor = cyan.light; + pointerColorBackground = green.light; + pointerColorForeground = cyan.light; + }; + solarizedLight = solarizedDark // { + background = solarizedDark.white.light; + foreground = solarizedDark.yellow.light; + fadeColor = solarizedDark.white.light; + cursorColor = solarizedDark.green.light; + pointerColorBackground = solarizedDark.cyan.light; + pointerColorForeground = solarizedDark.green.light; + }; +in rec { + uiFont = { name = "Roboto"; size = 9; }; + terminalFont = { name = "Source Code Pro for Powerline"; size = 9; }; white = "#ffffff"; black = "#000000"; - veryDark = "#080808"; + gray = "#888888"; + + colorScheme = solarizedDark; + invertedColorScheme = solarizedLight; colorPalette = [ - gray.dark red.dark green.dark yellow.dark blue.dark magenta.dark cyan.dark gray.light - gray.dark red.light green.light yellow.light blue.light magenta.light cyan.light gray.light + colorScheme.white.dark colorScheme.red.dark colorScheme.green.dark colorScheme.yellow.dark colorScheme.blue.dark colorScheme.magenta.dark colorScheme.cyan.dark colorScheme.black.dark + colorScheme.white.light colorScheme.red.light colorScheme.green.light colorScheme.yellow.light colorScheme.blue.light colorScheme.magenta.light colorScheme.cyan.light colorScheme.black.light ]; - - # Antares color scheme - gray = { light = "#bbbbbb"; dark = "#151515"; medium = "#aaaaaa"; }; - red = { light = "#de575c"; dark = "#de575c"; }; - yellow = { light = "#ebe971"; dark = "#ebe971"; }; - green = { light = "#00b853"; dark = "#00b853"; }; - blue = { light = "#90d0f0"; dark = "#7fc6f0"; }; - magenta = { light = "#cf9ffa"; dark = "#cf9ffa"; }; - cyan = { light = "#4ae5e8"; dark = "#4ae5e8"; }; }