diff --git a/.config/sway/config b/.config/sway/config
new file mode 100644
index 0000000..e934115
--- /dev/null
+++ b/.config/sway/config
@@ -0,0 +1,394 @@
+set
+{
+ $mod Mod4
+ $left h
+ $down j
+ $up k
+ $right l
+ $lock exec ~/utils/bin/swaylock-wrapper
+ $lockt exec ~/utils/bin/sway-locker -t
+ $term kitty #qterminal alacritty
+ $menu rofi -show drun
+ # $bg "~/Pictures/apod/2019-October-20-Pluto-at-Night.jpg fill #000000"
+ # $bg "~/Pictures/apod/2019-January-2-The-Orion-Nebula-in-Infrared-from-WISE.jpg fit #000000"
+ $bg "~/Pictures/apod/2020-April-29-The-Ion-Tail-of-New-Comet-SWAN.jpg fit #000000"
+ $gtk_theme "Mint-Y-Dark-Blue"
+ $icon_theme "Flat-Remix-Blue-Dark"
+ $pri LVDS-1
+ #$sec HDMI-A-1
+ $sec DP-2
+}
+
+default_border pixel 2
+default_floating_border pixel 2
+
+#smart_gaps on
+gaps outer 8
+gaps inner 5
+
+font pango:Cantarell 14px
+
+exec_always --no-startup-id
+{
+ #pkill fusuma
+ pkill waybar
+ pkill swayidle
+ #pkill "docker-tray"
+ waybar
+ swaymsg output "*" bg $bg
+ dbus-update-activation-environment DISPLAY XAUTHORITY
+ eval $(/usr/bin/gnome-keyring-daemon --start --components=ssh)
+ mako
+ #fusuma -d -c ~/.config/fusuma/config-wl.yml
+ gsettings set org.gnome.desktop.interface gtk-theme '$gtk_theme'
+ gsettings set org.gnome.desktop.interface icon-theme '$icon_theme'
+ #~/utils/docker-tray/docker-tray
+ swayidle -w timeout 3600 "$lock" \
+ timeout 3610 'swaymsg "output * dpms off"' \
+ resume 'swaymsg "output * dpms on"' \
+ before-sleep "$lockt"
+}
+bindsym ctrl+alt+l exec --no-startup-id $lock
+bindsym $mod+grave exec --no-startup-id $lock
+bindswitch lid:on exec --no-startup-id $lock
+output $sec pos 1920 0 res 1920x1200
+
+#--- Window Decorations
+set
+{
+ $nofocus #202020
+ $focus #202020
+ $titletxt #FFFFE8
+ $titlepad 10 center #000000
+ $gaps_change 20
+}
+#--- Notifications
+set
+{
+ $n_anchor top-center
+ $n_layer overlay
+ $n_dim 600
+ $n_margin 20
+ $n_padding 10
+ $n_border 3
+ $n_bg #202020
+ $n_fg #FFFFE8
+}
+
+bindsym
+{
+ $mod+Shift+e exec swaynag -t error -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'
+ $mod+Return exec $term
+ $mod+t exec $term
+ $mod+Shift+t exec alacritty
+ $mod+Shift+q kill
+ alt+F1 exec $menu
+}
+
+input *
+{
+ xkb_layout gb,sk
+ xkb_options grp:win_space_toggle,compose:ralt
+ xkb_variant ",qwerty"
+ repeat_delay 280
+ repeat_rate 30
+
+ tap enabled
+ natural_scroll enabled
+ scroll_method two_finger
+ tap_button_map lrm
+}
+
+focus_follows_mouse yes
+focus_wrapping false
+popup_during_fullscreen leave_fullscreen
+
+
+#--- Floating Windows ------------------------------------------------------
+for_window [class="pop-up"] floating enable; border normal $border
+for_window [window_role="pop-up"] floating enable; border normal $border
+for_window [window_role="task_dialog"] floating enable; border normal $border
+for_window [class="MEGAsync"] floating enable; border pixel 0
+for_window [title=".*JetBrains.*"] floating enable; border pixel 1
+for_window [class="matplotlib"] floating enable; border normal $border
+for_window [class="dosbox"] floating enable; border normal $border
+for_window [title="ImageMagick.*"]
+{
+ floating enable;
+ border normal $border
+ title_format " %title"
+}
+for_window [app_id="nm-connection-editor"]
+{
+ floating enable
+ resize set width 882px
+ resize set height 600px
+}
+for_window [app_id="pavucontrol"]
+{
+ floating enable
+ resize set width 882px
+ resize set height 600px
+}
+
+#--- Applications with CSD -------------------------------------------------
+for_window [app_id="glade"] border pixel 2
+for_window [app_id="baobab"] border pixel 2
+for_window [title=".*eston.*"] border pixel 0
+for_window [app_id="wdisplays"] border pixel 0
+for_window [app_id="gnome-.*"] border pixel 1
+for_window [app_id="qterminal"] border pixel 2
+for_window [app_id="xterm"] border pixel 2
+for_window [title=".*Brave.*"] border pixel 1 inhibit_idle fullscreen
+for_window [title=".*Firefox.*"] border pixel 2 inhibit_idle fullscreen
+for_window [class="vlc"] border pixel 2 inhibit_idle fullscreen
+for_window [app_id="vlc"] border pixel 2 inhibit_idle fullscreen
+for_window [app_id="nautilus"] border pixel 1
+
+#--- Xtk Applications ------------------------------------------------------
+for_window [title="xclock"] floating enable
+for_window [title="Calculator"] floating enable
+
+assign [app_id="telegram"] C
+assign [title="Ferdi"] C
+assign [class="vlc"] M
+
+bindsym
+{
+ print exec grim $(xdg-user-dir PICTURES)/grim-$(date +'%Y-%m-%dT%H-%M-%S').png
+ Shift+print exec grim -g "$(slurp)" - | wl-copy
+ $mod+c exec gnome-calculator
+ $mod+n exec nemo
+ $mod+m exec QT_QPA_PLATFORMTHEME=wayland vlc
+ $mod+Shift+b exec brave-browser-beta --incognito
+ $mod+Shift+w exec MOZ_USE_XINPUT2=1 MOZ_ENABLE_WAYLAND=1 ~/Downloads/firefox-dev/firefox --private-window
+ $mod+Shift+g exec MOZ_USE_XINPUT2=1 MOZ_ENABLE_WAYLAND=1 firefox --private-window
+ $mod+Shift+v exec ferdi
+ $mod+Shift+a exec chromium-freeworld --incognito
+ --locked $mod+Escape exec systemctl suspend -i
+ $mod+Shift+o exec alacritty -e bash -c 'sudo cpupower frequency-set -g powersave;figlet powersave;sleep 2'
+ $mod+Shift+p exec alacritty -e bash -c 'sudo cpupower frequency-set -g performance;figlet performance;sleep 2'
+ $mod+ctrl+Shift+a exec ~/.local/bin/keepmenu
+}
+
+# Notifications
+bindsym Control+Space exec makoctl dismiss
+bindsym Control+Shift+Space exec makoctl dismiss --all
+
+#
+# Moving around:
+#
+bindsym
+{
+ # Move your focus around
+ $mod+$left focus left
+ $mod+$down focus down
+ $mod+$up focus up
+ $mod+$right focus right
+ # Or use $mod+[up|down|left|right]
+ $mod+Left focus left
+ $mod+Down focus down
+ $mod+Up focus up
+ $mod+Right focus right
+
+ # Move the focused window with the same, but add Shift
+ $mod+Shift+$left move left
+ $mod+Shift+$down move down
+ $mod+Shift+$up move up
+ $mod+Shift+$right move right
+ # Ditto, with arrow keys
+ $mod+Shift+Left move left
+ $mod+Shift+Down move down
+ $mod+Shift+Up move up
+ $mod+Shift+Right move right
+
+ $mod+Shift+c move position center
+}
+
+#
+# Workspaces:
+#
+ # Switch to workspace
+bindsym --to-code
+{
+ $mod+Shift+comma workspace prev_on_output
+ $mod+Shift+period workspace next_on_output
+ $mod+Shift+tab workspace back_and_forth
+ $mod+comma focus output right
+ $mod+period focus output left
+ $mod+0 exec ~/.local/bin/swws.py 0
+ $mod+1 exec ~/.local/bin/swws.py 1
+ $mod+2 exec ~/.local/bin/swws.py 2
+ $mod+3 exec ~/.local/bin/swws.py 3
+ $mod+4 exec ~/.local/bin/swws.py 4
+ $mod+5 exec ~/.local/bin/swws.py 5
+ $mod+6 exec ~/.local/bin/swws.py 6
+ $mod+7 exec ~/.local/bin/swws.py 7
+ $mod+8 exec ~/.local/bin/swws.py 8
+ $mod+9 exec ~/.local/bin/swws.py 9
+ $mod+F2 workspace C
+ $mod+F3 workspace M
+}
+ # Switch directly to workspace of another monitor
+bindsym --to-code
+{
+ $mod+ctrl+0 exec "~/.local/bin/swws.py 0 -c"
+ $mod+ctrl+1 exec "~/.local/bin/swws.py 1 -c"
+ $mod+ctrl+2 exec "~/.local/bin/swws.py 2 -c"
+ $mod+ctrl+3 exec "~/.local/bin/swws.py 3 -c"
+ $mod+ctrl+4 exec "~/.local/bin/swws.py 4 -c"
+ $mod+ctrl+5 exec "~/.local/bin/swws.py 5 -c"
+ $mod+ctrl+6 exec "~/.local/bin/swws.py 6 -c"
+ $mod+ctrl+7 exec "~/.local/bin/swws.py 7 -c"
+ $mod+ctrl+8 exec "~/.local/bin/swws.py 8 -c"
+ $mod+ctrl+9 exec "~/.local/bin/swws.py 9 -c"
+}
+ # Move focused container to workspace
+bindsym --to-code
+{
+ $mod+Shift+0 exec "~/.local/bin/swws.py 0 -s"
+ $mod+Shift+1 exec "~/.local/bin/swws.py 1 -s"
+ $mod+Shift+2 exec "~/.local/bin/swws.py 2 -s"
+ $mod+Shift+3 exec "~/.local/bin/swws.py 3 -s"
+ $mod+Shift+4 exec "~/.local/bin/swws.py 4 -s"
+ $mod+Shift+5 exec "~/.local/bin/swws.py 5 -s"
+ $mod+Shift+6 exec "~/.local/bin/swws.py 6 -s"
+ $mod+Shift+7 exec "~/.local/bin/swws.py 7 -s"
+ $mod+Shift+8 exec "~/.local/bin/swws.py 8 -s"
+ $mod+Shift+9 exec "~/.local/bin/swws.py 9 -s"
+ $mod+Shift+F2 move container to workspace C
+ $mod+Shift+F3 move container to workspace M
+}
+ # Move focused container to workspace of another monitor
+bindsym --to-code
+{
+ ctrl+$mod+Shift+0 exec "~/.local/bin/swws.py 0 -t"
+ ctrl+$mod+Shift+1 exec "~/.local/bin/swws.py 1 -t"
+ ctrl+$mod+Shift+2 exec "~/.local/bin/swws.py 2 -t"
+ ctrl+$mod+Shift+3 exec "~/.local/bin/swws.py 3 -t"
+ ctrl+$mod+Shift+4 exec "~/.local/bin/swws.py 4 -t"
+ ctrl+$mod+Shift+5 exec "~/.local/bin/swws.py 5 -t"
+ ctrl+$mod+Shift+6 exec "~/.local/bin/swws.py 6 -t"
+ ctrl+$mod+Shift+7 exec "~/.local/bin/swws.py 7 -t"
+ ctrl+$mod+Shift+8 exec "~/.local/bin/swws.py 8 -t"
+ ctrl+$mod+Shift+9 exec "~/.local/bin/swws.py 9 -t"
+}
+
+#
+# Workspace-monitor assignments
+#
+workspace 0 output $pri
+workspace 1 output $pri
+workspace 2 output $pri
+workspace 3 output $pri
+workspace 4 output $pri
+workspace 5 output $pri
+workspace 6 output $pri
+workspace 7 output $pri
+workspace 8 output $pri
+workspace 9 output $pri
+workspace C output $pri
+workspace M output $pri
+workspace 10 output $sec
+workspace 11 output $sec
+workspace 12 output $sec
+workspace 13 output $sec
+workspace 14 output $sec
+workspace 15 output $sec
+workspace 16 output $sec
+workspace 17 output $sec
+workspace 18 output $sec
+workspace 19 output $sec
+
+#
+# Layout stuff:
+#
+bindsym
+{
+ # You can "split" the current object of your focus with
+ # $mod+b or $mod+v, for horizontal and vertical splits
+ # respectively.
+ $mod+b splith
+ $mod+v splitv
+
+ # Switch the current container between different layout styles
+ $mod+s layout stacking
+ $mod+w layout tabbed
+ $mod+e layout toggle split
+
+ # Make the current focus fullscreen
+ $mod+f fullscreen
+
+ # Toggle the current focus between tiling and floating mode
+ #bindsym $mod+Shift+space floating toggle
+ $mod+Shift+d floating toggle
+
+ # Swap focus between the tiling area and the floating area
+ #bindsym $mod+space focus mode_toggle
+ $mod+d focus mode_toggle
+
+ # Move focus to the parent container
+ $mod+a focus parent
+}
+
+#
+# Scratchpad:
+#
+ # Sway has a "scratchpad", which is a bag of holding for windows.
+ # You can send windows there and get them back later.
+
+bindsym --to-code
+{
+ # Move the currently focused window to the scratchpad
+ $mod+Shift+minus move scratchpad
+
+ # Show the next scratchpad window or hide the focused scratchpad window.
+ # If there are multiple scratchpad windows, this command cycles through them.
+ $mod+minus scratchpad show
+}
+
+#
+# Resizing containers:
+#
+mode "resize"
+{
+ # left will shrink the containers width
+ # right will grow the containers width
+ # up will shrink the containers height
+ # down will grow the containers height
+ bindsym
+ {
+ $left resize shrink width 10px
+ $down resize grow height 10px
+ $up resize shrink height 10px
+ $right resize grow width 10px
+
+ # Ditto, with arrow keys
+ Left resize shrink width 10px
+ Down resize grow height 10px
+ Up resize shrink height 10px
+ Right resize grow width 10px
+
+ # Return to default mode
+ Return mode "default"
+ Escape mode "default"
+ $mod+r mode "default"
+ }
+}
+bindsym $mod+r mode "resize"
+bindsym $mod+Shift+r reload
+
+#
+# media keys
+#
+bindsym
+{
+ --locked XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%
+ --locked XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%
+ --locked XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle
+ --locked XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle
+ --locked XF86MonBrightnessUp exec light -A 5
+ --locked XF86MonBrightnessDown exec light -U 5
+}
+
+include /etc/sway/config.d/*
diff --git a/.config/waybar/config b/.config/waybar/config
new file mode 100644
index 0000000..d754216
--- /dev/null
+++ b/.config/waybar/config
@@ -0,0 +1,106 @@
+{
+ "layer": "top",
+ "position": "top",
+ "height": 28,
+
+ "modules-left": ["sway/workspaces", "sway/mode"],
+ "modules-center": ["sway/window"],
+ "modules-right": ["tray", "pulseaudio", "network", "custom/storage", "memory", "cpu", "idle_inhibitor", "battery", "clock#date", "clock#time"],
+ "sway/workspaces": {
+ "format": "{name}",
+ "disable-scroll": true,
+ "disable-markup" : false
+ },
+ "sway/mode": {
+ "format": "{}", // Icon: expand-arrows-alt
+ "tooltip": false
+ },
+ "sway/window": {
+ "max-length": 120,
+ "tooltip": false
+ },
+ "clock#time": {
+ "interval": 1,
+ "format": "{:%H:%M:%S} ",
+ "tooltip": false
+ },
+ "clock#date": {
+ "interval": 10,
+ "format": " {:%a %d %b} ",
+ "tooltip": false
+ },
+ "memory": {
+ "interval": 5,
+ "format": "{}% ",
+ "on-click": "exec alacritty -e ytop"
+ },
+ "cpu": {
+ "interval": 5,
+ "format": "{usage:2}% "
+ },
+ "battery": {
+ "format": "{capacity}% {icon}",
+ "format-alt": "{time} {icon}",
+ "format-icons": ["", "", "", "", ""],
+ "format-charging": "~{capacity}%",
+ "interval": 30,
+ "states": {
+ "warning": 25,
+ "critical": 10
+ },
+ "tooltip": false
+ },
+ "network": {
+ "format-wifi": "{icon} {essid} ({signalStrength}%) ",
+ "format-ethernet": "{icon} {ifname}: {ipaddr}/{cidr}",
+ "format-linked": "{ifname} (No IP)",
+ "format-icons": {
+ "wifi": [""],
+ "ethernet": ["🖧"],
+ "disconnected": ["disconnected"]
+ },
+ "on-click": "nm-connection-editor",
+ "on-click-right": "exec kitty nmtui",
+ "rotate": true,
+ "tooltip": false
+ },
+ "pulseaudio": {
+ "format": "{icon} {volume}% {format_source}",
+ "format-bluetooth": "{volume}% {icon} {format_source}",
+ "format-bluetooth-muted": "🔇 {icon} {format_source}",
+ "format-muted": "✖ {format_source}",
+ "format-source": " {volume}%",
+ "format-source-muted": "",
+ "format-icons": {
+ "headphone": "",
+ "hands-free": "",
+ "headset": "",
+ "phone": "",
+ "portable": "",
+ "car": "",
+ "default": ["", "", ""]
+ },
+ "scroll-step": 1,
+ "on-click": "pavucontrol",
+ "tooltip": false
+ },
+ "custom/storage": {
+ "format": "{percentage}% ",
+ "format-alt": "{} ",
+ "format-alt-click": "click",
+ "return-type": "json",
+ "interval": 60,
+ "exec": "~/.config/waybar/modules/storage.sh"
+ },
+ "idle_inhibitor": {
+ "format": "{icon}",
+ "format-icons": {
+ "activated": "",
+ "deactivated": ""
+ },
+ "tooltip": false
+ },
+ "tray": {
+ "icon-size": 18
+ }
+}
diff --git a/.config/waybar/modules/storage.sh b/.config/waybar/modules/storage.sh
new file mode 100755
index 0000000..967f6c0
--- /dev/null
+++ b/.config/waybar/modules/storage.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+mount="/"
+warning=20
+critical=10
+
+df -h -P -l "$mount" | awk -v warning=$warning -v critical=$critical '
+/\/.*/ {
+ text=$4
+ use=$5
+ exit 0
+}
+END {
+ class=""
+ gsub(/%$/,"",use)
+ if ((100 - use) < critical) {
+ class="critical"
+ } else if ((100 - use) < warning) {
+ class="warning"
+ }
+ print "{\"text\":\""text"\", \"percentage\":"use", \"class\":\""class"\"}"
+}
+'
diff --git a/.config/waybar/style.css b/.config/waybar/style.css
new file mode 100644
index 0000000..b11ae90
--- /dev/null
+++ b/.config/waybar/style.css
@@ -0,0 +1,137 @@
+* {
+ border: none;
+ border-radius: 0;
+ font-family: DejaVu Sans;
+ font-size: 13px;
+ box-shadow: none;
+ text-shadow: none;
+ transition-duration: 0s;
+}
+
+/* The whole bar */
+#waybar {
+ background: #323232;
+ color: white;
+ font-family: Cantarell, Noto Sans, sans-serif;
+ font-size: 13px;
+}
+
+window {
+ color: rgba(217, 216, 216, 1);
+ background: rgba(35, 31, 32, 0.00);
+}
+
+window#waybar.solo {
+ color: rgba(217, 216, 216, 1);
+}
+
+#mode {
+ background: #791455;
+ padding: .1em .2em;
+}
+
+#workspaces {
+ margin: 0 0px;
+}
+
+#workspaces button {
+ border-top: 2px solid transparent;
+ /* To compensate for the top border and still have vertical centering */
+ padding: .1em .2em;
+ color: #888888;
+}
+
+#workspaces button.visible {
+ color: rgba(217, 216, 216, 1);
+}
+
+#workspaces button.focused {
+ border-color: #4c7899;
+ color: white;
+ background-color: #285577;
+}
+
+#workspaces button.urgent {
+ border-color: #c9545d;
+ color: #c9545d;
+}
+
+#mode, #battery, #cpu, #memory, #network, #pulseaudio, #idle_inhibitor, #backlight, #custom-storage, #custom-spotify, #custom-weather, #custom-mail {
+ margin: 0px 5px 0px 5px;
+ min-width: 25px;
+}
+
+#clock.date {
+ margin: 0px 0px 0px 10px;
+}
+#clock.time {
+ margin: 0px 10px 0px 0px
+}
+
+@keyframes blink {
+ to {
+ color: white;
+ }
+}
+#battery.warning {
+ color: rgba(255, 210, 4, 1);
+}
+#battery.critical {
+ color: rgba(238, 46, 36, 1);
+ animation: blink .7s linear infinite alternate;
+}
+#battery.charging {
+ color: rgba(59, 176, 216, 1);
+ font-weight: bold;
+ animation: blink 1s linear infinite alternate;
+}
+
+#network.disconnected {
+ color: red;
+}
+
+#custom-storage.warning {
+ color: rgba(255, 210, 4, 1);
+}
+#custom-storage.critical {
+ color: rgba(238, 46, 36, 1);
+}
+#custom-storage {
+ margin: 0 0 0 10px;
+}
+#memory {
+ /* color: #859900; */
+}
+#cpu {
+ /* color: #6c71c4; */
+ margin: 0 5px 0 0;
+}
+
+#tray {
+ margin: 0 5px 0 10px;
+}
+#pulseaudio {
+ margin: 0 5px 0 5px;
+}
+
+
+/* dark theme */
+/*#mode {
+ background: #64727D;
+ padding: .1em .2em;
+}*/
+
+/*#workspaces button {
+ padding: 0 2px;
+ color: rgba(217, 216, 216, 0.4);
+}*/
+
+/*#workspaces button.focused {
+ border-top: 2px solid rgba(217, 216, 216, 1);
+ border-bottom: 2px solid rgba(217, 216, 216, 0);
+}*/
+
+/*#workspaces button.urgent {
+ color: rgba(238, 46, 36, 1);
+}*/
+
diff --git a/.vim/vimrc b/.vim/vimrc
new file mode 100644
index 0000000..2590671
--- /dev/null
+++ b/.vim/vimrc
@@ -0,0 +1,298 @@
+" try not to put any lines in your vimrc that you don't understand :)
+set nocompatible
+
+filetype off "required
+
+filetype plugin on " required
+
+" Enable heavy omni completion.
+if !exists('g:neocomplete#sources#omni#input_patterns')
+ let g:neocomplete#sources#omni#input_patterns = {}
+endif
+
+
+if empty(glob('~/.vim/autoload/plug.vim'))
+ silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
+ \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
+ autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
+endif
+
+call plug#begin()
+Plug 'drewtempelmeyer/palenight.vim', { 'as': 'palenight' }
+Plug 'jacoborus/tender.vim'
+Plug 'dracula/vim', { 'as': 'dracula' }
+Plug 'lervag/vimtex', { 'for': 'tex' }
+Plug 'xuhdev/vim-latex-live-preview', { 'for': 'tex' }
+Plug 'vim-airline/vim-airline'
+Plug 'vim-airline/vim-airline-themes'
+Plug 'ctrlpvim/ctrlp.vim'
+Plug 'justmao945/vim-clang'
+Plug 'tpope/vim-surround'
+Plug 'tpope/vim-fugitive'
+Plug 'tpope/vim-repeat'
+Plug 'gorodinskiy/vim-coloresque'
+Plug 'rhysd/git-messenger.vim'
+Plug 'Yggdroot/indentLine'
+Plug 'cespare/vim-toml'
+Plug 'preservim/nerdcommenter'
+Plug 'preservim/nerdtree'
+Plug 'Xuyuanp/nerdtree-git-plugin'
+Plug 'mfukar/robotframework-vim'
+Plug 'roxma/nvim-yarp'
+Plug 'roxma/vim-hug-neovim-rpc'
+Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
+Plug 'vim-syntastic/syntastic'
+"Plug 'rust-lang/rust.vim', { 'for': 'rust' }
+call plug#end()
+
+let g:airline_powerline_fonts = 1
+let g:Powerline_symbols = "fancy" " sth like this probably set as a default but won't hurt here
+let g:airline_highlighting_cache = 1
+" let g:airline_theme = 'dracula'
+let g:airline#extensions#tabline#enabled = 1
+let g:airline#extensions#tabline#formatter = 'unique_tail'
+
+let g:gitgutter_terminal_reports_focus=0
+let g:gitgutter_async = 1
+let g:gitgutter_sign_allow_clobber=0
+
+let g:deoplete#enable_at_startup = 1
+let g:deoplete#enable_ignore_case = 1
+
+let g:livepreview_cursorhold_recompile = 0
+let g:livepreview_previewer = 'evince'
+let g:livepreview_engine = 'pdflatex -shell-escape -interaction=nonstopmode'
+let g:vimtex_compiler_progname = 'pdflatex -shell-escape --interaction=nonstopmode'
+let g:tex_flavor = 'latex'
+
+" Add spaces after comment delimiters by default
+let g:NERDSpaceDelims = 1
+" Allow commenting and inverting empty lines (useful when commenting a region)
+let g:NERDCommentEmptyLines = 1
+" Enable trimming of trailing whitespace when uncommenting
+let g:NERDTrimTrailingWhitespace = 1
+"""" Enable NERDCommenterToggle to check all selected lines is commented or not
+"""let g:NERDToggleCheckAllLines = 1
+" Add your own custom formats or override the defaults
+let g:NERDCustomDelimiters = { 'vim': { 'left': '"','right': '' }, 'c': { 'left': '/**','right': '*/' } }
+
+let g:indentLine_setColors = 1
+let g:indentLine_char_list = ['|', '¦', '┆', '┊', ':']
+
+
+let g:git_messenger_close_on_cursor_moved = v:false
+let g:git_messenger_always_into_popup = v:true
+
+
+let g:syntastic_always_populate_loc_list = 0
+let g:syntastic_auto_loc_list = 2
+let g:syntastic_loc_list_height = 8
+let g:syntastic_check_on_open = 1
+let g:syntastic_check_on_wq = 0
+let g:syntastic_aggregate_errors = 1
+let g:syntastic_id_checkers = 1
+let g:syntastic_error_symbol = "✗"
+let g:syntastic_warning_symbol = "⚠"
+
+set statusline+=%#warningmsg#
+set statusline+=%{SyntasticStatuslineFlag()}
+set statusline+=%*
+
+let g:syntastic_javascript_checkers = ['jsl']
+let g:syntastic_python_checkers = ['pylint']
+let g:syntastic_c_compiler = 'clang'
+let g:syntastic_c_check_header = 1
+let g:syntastic_c_auto_refresh_includes = 1
+let g:syntastic_cpp_check_header = 1
+let g:syntastic_cpp_auto_refresh_includes = 1
+let g:syntastic_c_cpplint_exec = 'cppcheck'
+
+" change cursor shape for different editing modes, neovim does this by default
+if !has('nvim')
+ if exists('$TMUX')
+ let &t_SI = "\Ptmux;\\e[2 q\\\"
+ let &t_SR = "\Ptmux;\\e[4 q\\\"
+ let &t_EI = "\Ptmux;\\e[2 q\\\"
+ else
+ let &t_SI = "\e[6 q"
+ let &t_SR = "\e[4 q"
+ let &t_EI = "\e[2 q"
+ endif
+endif
+
+command! W execute 'silent w !sudo tee % >/dev/null' | edit!
+command! -nargs=* Make write | make! | cwindow
+
+" open a terminal in $PWD
+nnoremap tt :terminal
+" toggle showing whitespace
+noremap :set list!
+" make shortcut
+nnoremap :make!
+" NERDTree
+nmap nt :NERDTreeToggle
+
+vmap gb :!git blame % -L=line("'<") ,=line("'>")
+nmap gb :!git blame %
+nmap ll :w! !pdflatex -shell-escape -interaction=nonstopmode $PWD/*.tex
+
+
+" ------ wayland copy
+xnoremap "+y y:call system("wl-copy", @")
+nnoremap "+p :let @"=substitute(system("wl-paste --no-newline"), '', '', 'g')p
+nnoremap "*p :let @"=substitute(system("wl-paste --no-newline --primary"), '', '', 'g')p
+
+inoremap pumvisible() ? "\" : "\"
+
+" ------ autocmd ------
+
+" Enable omni completion.
+autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
+autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
+autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
+autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
+autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags
+
+" automatically open NERDTree if vim is open on it's own (argc() ==0 )
+" autocmd StdinReadPre * let s:std_in=1
+" autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
+
+" Reload changes if file changed outside of vim requires autoread
+augroup load_changed_file
+ autocmd!
+ autocmd FocusGained,BufEnter * if mode() !=? 'c' | checktime | endif
+ autocmd FileChangedShellPost * echo "Changes loaded from source file"
+augroup END
+
+" when quitting a file, save the cursor position
+augroup save_cursor_position
+ autocmd!
+ autocmd BufReadPost * call setpos(".", getpos("'\""))
+augroup END
+
+" when not running in a console or a terminal that doesn't support 256 colors
+" enable cursorline in the currently active window and disable it in inactive ones
+if $DISPLAY !=? '' && &t_Co == 256
+ augroup cursorline
+ autocmd!
+ autocmd VimEnter,WinEnter,BufWinEnter * setlocal cursorline
+ autocmd WinLeave * setlocal nocursorline
+ augroup END
+endif
+
+" when entering insert mode, relative line
+" numbers are turned off, leaving absolute line numbers turned on
+augroup numbertoggle
+ autocmd!
+ autocmd BufEnter,FocusGained,InsertLeave * set number relativenumber
+ autocmd BufLeave,FocusLost,InsertEnter * set number norelativenumber
+augroup END
+
+hi clear CursorLine
+augroup CLClear
+ autocmd! ColorScheme * hi clear CursorLine
+augroup END
+
+hi CursorLineNR cterm=bold
+augroup CLNRSet
+ set cursorline
+ autocmd! ColorScheme * hi CursorLineNR cterm=bold
+augroup END
+
+" define indent-based folding, after loading a file switch to manual folding
+augroup vimrc
+ au BufReadPre * setlocal foldmethod=indent
+ au BufWinEnter * if &fdm == 'indent' | setlocal foldmethod=manual | endif
+augroup END
+
+""" autosave and load views
+au BufWinLeave ?* mkview
+au BufWinEnter ?* silent loadview
+
+au FileType xml setlocal shiftwidth=4 tabstop=4
+au FileType html setlocal shiftwidth=4 tabstop=4
+
+au BufNewFile,BufRead *.js
+ \ setlocal shiftwidth=4 tabstop=4 softtabstop=4 expandtab autoindent fileformat=unix
+
+au FileType c setl ofu=ccomplete#CompleteCpp
+au BufNewFile,BufRead *.py,*.pyw,*.pyx,?akefil*
+ \ setlocal tabstop=4 shiftwidth=4 noexpandtab autoindent
+ \ fileformat=unix
+" Linux kernel style tabs
+au BufNewFile,BufRead *.c,*.h,*.cpp
+ \ setlocal tabstop=8 shiftwidth=8 softtabstop=8 noexpandtab autoindent
+ \ textwidth=79 fileformat=unix
+
+" ------ adv maps ------
+
+" strip trailing whitespace, ss (strip space)
+nnoremap ss
+ \ :let b:_p = getpos(".")
+ \ let b:_s = (@/ != '') ? @/ : ''
+ \ %s/\s\+$//e
+ \ let @/ = b:_s
+ \ nohlsearch
+ \ unlet b:_s
+ \ call setpos('.', b:_p)
+ \ unlet b:_p
+
+match Todo /\s\+$/
+
+
+set softtabstop=4
+set tabstop=4
+set shiftwidth=4
+set expandtab
+set smarttab
+
+set errorformat+=%.%#PHP:\ %m\ \(in\ %f\ on\ line\ %l\)%.%#,
+ \%E%[0-9]%#.%m:%f?rev=%.%##L%l\ %.%#,%C%.%#
+
+
+set tags=.tags;
+
+set incsearch " incrimental search
+set hlsearch " highlighting when searching
+
+filetype indent plugin on
+set autoindent
+set backspace=2
+
+set splitbelow splitright " splits open at bottom and right
+set lazyredraw " don't redraw while executing macros (good performance config)
+
+set listchars=trail:•,tab:>-
+set list " show/hide tabs and EOL chars (hidden characters)
+set confirm " ask confirmation like save before quit.
+set wildmenu " Tab completion menu when using command mode
+set scrolloff=5 " scroll offset, min lines above/below cursor
+"set scrolljump=5 " jump 5 lines when running out of the screen - NO
+set sidescroll=10 " minimum columns to scroll horizontally
+set showcmd " show command status
+set showmatch " flashes matching parenthese when cursor over the other one
+set mat=2 " how many tenths of a second to blink when matching brackets
+set noshowmode " show editing mode in status (-- INSERT --)
+set ruler " show cursor position
+set noerrorbells " bells in vim
+set undolevels=1000 " number of undos stored
+set viminfo='50,"50 " '=marks for x files, "=registers for x files
+
+set nofoldenable
+"set foldmethod=indent " indent based folding
+
+set encoding=utf-8 " important for powerline besides others
+set ignorecase " searches are case insensitive...
+set smartcase " ... unless they contain at least one capital letter
+set noscrollbind
+set updatetime=1000
+
+syntax enable
+colo palenight " new fav highlighting
+set conceallevel=0 " for jsons
+set ttymouse= " tmux mouse behaviour
+set mouse=a " enable mouse in n,v,i,c,h modes
+
+set laststatus=2 " show powerline status bar
+set t_Co=256
+set notermguicolors
diff --git a/README.md b/README.md
index 3738e15..78541a6 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
# dotfiles
+> loki
+
This is just my desperate attempt to keep track of all the changes I perform onto my dearest dot-files
> **Warning:** Check the files before use
diff --git a/bin/apod b/bin/apod
new file mode 100755
index 0000000..fb75d5c
--- /dev/null
+++ b/bin/apod
@@ -0,0 +1,83 @@
+#!/bin/bash
+# apod.sh largely based on
+# https://gist.github.com/mtking2/c38948f731d9017fee4edb36667c2a70
+
+http_proxy=""
+
+green="\033[32m"
+white="\033[0m"
+blue="\033[34m"
+
+path="$HOME/.cache/apod"
+
+mkdir -p $path
+rm -f $path/*.html
+echo -e "$(date "+%Y-%m-%d %H:%M:%S") get apod started ${green}✓${white}"
+wget -q https://apod.nasa.gov/apod/ap$(date +%y%m%d).html --content-on-error -P $path
+index=$(find $path -type f -name "*.html")
+echo -e "${blue}try \"\$(grep -i \"IMG SRC=\" $index | cut -d\\\" -f2)\":${white} $(grep -i "IMG SRC=" $index || echo "is null")"
+echo -e "${blue}try \"\$(grep -i \"a href=\"image\" $index | cut -d\\\" -f2)\":${white} $(grep -i "a href=\"image" $index || echo "is null")"
+
+get_img() {
+ img="$(grep -i "a href=\"image" $index | cut -d\" -f2 | head -1 | xargs)"
+ if [[ -z "$img" ]]; then
+ img="$(grep -i "IMG SRC=" $index | cut -d\" -f2 | head -1 | xargs)"
+ fi
+}
+get_img
+
+# sometimes the APOD is an iframe containing a video/flash/js element
+# this condition should detect the absence of an image and use the previous APOD
+if [[ -z "$img" ]]; then
+ yesterday="https://apod.nasa.gov/apod/ap$(date --date yesterday +%y%m%d).html"
+ echo -e "${blue}Using yesterday's image:${white} $yesterday"
+ wget -q $yesterday -O $index
+ get_img
+fi
+
+img_name="$(echo "$img" | grep image | head -1 | cut -d\/ -f3)"
+
+# deal with external images
+if [[ $img =~ ^https?://.*$ ]]; then
+ url=$img
+else
+ url="https://apod.nasa.gov/apod/$img"
+fi
+
+apod_title=$(grep "APOD:" $index | sed 's/<\/\?[^>]\+>//g' | sed 's/ APOD: //' | head -1)
+if [[ "$apod_title" =~ ^Astronomy.*$ ]]; then
+ apod_title=$(echo $img_name | sed 's/....$//' )
+fi
+apod_date=$(grep "^$(date +%Y\ %B)" $index | xargs | head -1 | sed 's/ /-/g')
+
+echo -e "${blue}path:${white} $path"
+echo -e "${blue}apod_title:${white} $apod_title"
+echo -e "${blue}img:${white} $img"
+echo -e "${blue}img_name:${white} "$img_name""
+echo -e "${blue}url:${white} $url"
+echo -e "${blue}apod_date:${white} $apod_date"
+
+filename=$(echo $apod_title | xargs | sed 's/- //g' | sed "s/ /-/g").jpg
+
+wget -q $url -O "$path/$filename"
+
+# GNOME
+# possible values for gsettings: "wallpaper", "centered", "scaled", "stretched", "zoom", "spanned"
+# gsettings set org.gnome.desktop.background picture-uri "File://$path/wallpaper.jpg"
+# gsettings set org.gnome.desktop.background picture-options zoom
+
+# Cinnamon
+ #gsettings set org.cinnamon.desktop.background picture-uri "file://$path/$apod_date-$short_title-$img_name"
+ # gsettings set org.cinnamon.desktop.background picture-uri "file://$path/$filename"
+ # gsettings set org.cinnamon.desktop.background picture-options scaled
+
+# Xfce
+# xfconf-query --channel xfce4-desktop --property /backdrop/screen0/monitor0/image-path --set $path/wallpaper.jpg
+
+# feh
+# feh --bg-scale $path/wallpaper.jpg
+
+xdg-open "$path/$filename" 2>&1 >/dev/null &
+rm -f $index
+echo -e "$(date "+%Y-%m-%d %H:%M:%S") done ${green}✓${white}" && \
+notify-send -u critical -i ~/.icons/Flat-Remix-Blue-Dark/apps/scalable/weather-widget.svg "apod just changed ✓" "...to $apod_title"
diff --git a/bin/gethugo b/bin/gethugo
new file mode 100755
index 0000000..4110e96
--- /dev/null
+++ b/bin/gethugo
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+if [ -z $1 ]; then
+ echo "[x] HUGO_VERSION is not set, pass it as \$1"
+ exit 9001
+else
+ HUGO_VERSION=$1
+fi
+
+
+nutmp=$(mktemp -d);cd "$nutmp";unset nutmp
+
+WORKDIR=$(pwd)
+HOMEBIN="/home/$USER/.local/bin"
+mkdir -pv $HOMEBIN
+
+echo "[*] downloading hugo version \"$HUGO_VERSION\""
+curl -sL https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz | bsdtar xfv -
+mv -vf hugo ${HOMEBIN}
+
+cd ..
+rm -rfv $WORKDIR
+echo "[*] hugo updated to version $HUGO_VERSION"
diff --git a/bin/getnebulaconfigs b/bin/getnebulaconfigs
new file mode 100755
index 0000000..d15a375
--- /dev/null
+++ b/bin/getnebulaconfigs
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+# simple config backup script for nebula
+remote="root@dotya.ml"
+myrsync="rsync -auvP"
+
+$myrsync $remote:/etc/gitea/app.ini ~/utils/nebula &
+$myrsync $remote:/etc/nginx/nginx.conf ~/utils/nebula &
+$myrsync $remote:/etc/smtpd/{smtpd.conf,mailname,aliases,vdoms,vusers,creds} ~/utils/nebula/smtpd &
+$myrsync $remote:/etc/ssh/sshd_config ~/utils/nebula &
+$myrsync $remote:/etc/fstab ~/utils/nebula &
+$myrsync $remote:/etc/crypttab ~/utils/nebula &
+$myrsync $remote:/etc/lvm/lvm.conf ~/utils/nebula &
+
+$myrsync $remote:/root/.zshrc ~/utils/nebula/root/zshrc &
+$myrsync $remote:/root/.ssh/ ~/utils/nebula/root/ssh &
+
+$myrsync $remote:/home/vis/.ssh/ ~/utils/nebula/vis/ssh &
+$myrsync $remote:/home/vis/.config/ --exclude="*Bittorrent-data*" ~/utils/nebula/vis/config &
diff --git a/mgp b/bin/mgp
similarity index 100%
rename from mgp
rename to bin/mgp
diff --git a/bin/qst_up b/bin/qst_up
new file mode 100755
index 0000000..151a610
--- /dev/null
+++ b/bin/qst_up
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+BUILDDIR="/tmp/makepkg/QSyncthingTray/cmake-build"
+src="$HOME/utils/QSyncthingTray"
+
+echo "** QSyncthingTray updater **"
+cd $src
+git fetch --all
+mkdir -pv $BUILDDIR
+cd $BUILDDIR
+
+if [ $(pgrep '[Q]Sync') ]; then
+ echo "[*] killing QSyncthingTray..."
+pkill -9 QSyncthingTray
+fi
+
+cmake -S$src ..
+cmake --build . -- -j $(nproc)
+
+cd $src
+mv -vf $BUILDDIR/QSyncthingTray ~/.local/bin
+rm -rf $BUILDDIR
+
+echo "[*] starting QSyncthingTray..."
+QSyncthingTray & > /dev/null 2>&1
+
+git clean -fd --quiet
diff --git a/bin/sway-locker b/bin/sway-locker
new file mode 100755
index 0000000..03a9e1a
--- /dev/null
+++ b/bin/sway-locker
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+# Inhibit screen locker when media players are running
+# Cheap method, add missing players to regex
+isrunning=1
+player=`ps -u $USER | grep -Ec "(rhythmbox|totem|mpv|vlc|*mplayer)"`
+
+if [ "$player" -ge "$isrunning" ]; then
+ if [ "$1" == "-t" ]; then
+ dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
+ else
+ if [ "$1" != "-f" ]; then
+ exit 1
+ fi
+ fi
+fi
+
+
+revert() {
+ swaymsg "output * dpms on"
+ rm -Rf $HOME/.tmp
+}
+
+wdir=$HOME/.tmp/lckr
+screen1=$wdir/l1.png
+icon=/usr/share/pixmaps/fedora-logo-sprite.png # with style
+lwaucj=$wdir/nuvdsp.png
+mkdir -p $wdir && chmod 1700 $wdir
+
+grim -o eDP-1 $screen1 # take a screenshot
+
+convert $screen1 -scale 10% -scale 1000% $screen1
+convert $screen1 $icon -gravity center -composite -matte $lwaucj && rm $screen1
+
+# Lock screen using swaylock showing number of failed attempts, not forking,
+# ignoring empty password (possibly without unlock indicator (-u))
+swaylock -f -n -e -i "$lwaucj" || swaylock -f -e -n -c 141414 # just dark-grey
+trap revert exit
+# EXIT HUP INT TERM - 0 1 3 15
+
+revert
+notify-send 'Welcome back!'
diff --git a/bin/swaylock-wrapper b/bin/swaylock-wrapper
new file mode 100755
index 0000000..953c6d2
--- /dev/null
+++ b/bin/swaylock-wrapper
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+lock="swaylock --screenshots --clock --indicator --indicator-radius 100 --indicator-thickness 7 --effect-blur 7x5 --effect-vignette 0.5:0.5 --ring-color 451e75 --key-hl-color a01b83 --line-color 00000000 --inside-color 00000088 --separator-color 00000000"
+lockt="exec ~/utils/bin/sway-locker -t"
+
+revert() {
+ killall swayidle
+ swayidle -w timeout 3600 "$lock" \
+ timeout 3610 'swaymsg "output * dpms off"' \
+ resume 'swaymsg "output * dpms on"' \
+ before-sleep "$lockt"
+}
+trap revert HUP INT TERM
+swayidle -w timeout 5 'swaymsg "output * dpms off"' \
+resume 'swaymsg "output * dpms on"' &
+swaylock --screenshots --clock --indicator --indicator-radius 100 --indicator-thickness 7 --effect-blur 7x5 --effect-vignette 0.5:0.5 --ring-color 451e75 --key-hl-color a01b83 --line-color 00000000 --inside-color 00000088 --separator-color 00000000
+revert
diff --git a/bin/swws.py b/bin/swws.py
new file mode 100755
index 0000000..e3071d0
--- /dev/null
+++ b/bin/swws.py
@@ -0,0 +1,68 @@
+#!/usr/bin/python
+# thanks to dalahast < https://git.dotya.ml/dalahast >
+
+import json,sys,subprocess
+
+args = sys.argv
+if len(args) > 2:
+ a = args[2]
+else:
+ a = ""
+ws = args[1]
+ws10 = str(10+int(ws))
+msg = json.loads(subprocess.run(["swaymsg", "-t", "get_workspaces"], stdout=subprocess.PIPE).stdout.decode('utf-8'))
+
+def expl_pick(mon_type):
+ if mon_type == "LVDS-1":
+ subprocess.run(["swaymsg", "focus", "output", "HDMI-A-1"])
+ subprocess.run(["swaymsg", "workspace", ws10])
+ else:
+ subprocess.run(["swaymsg", "focus", "output", "LVDS-1"])
+ subprocess.run(["swaymsg", "workspace", ws])
+
+def mov_to(mon_type):
+ if mon_type == "LVDS-1":
+ subprocess.run(["swaymsg", "move", "container", "to", "workspace", ws])
+ else:
+ subprocess.run(["swaymsg", "move", "container", "to", "workspace", ws10])
+
+def mov_to_next_mon(mon_type):
+ if mon_type == "LVDS-1":
+ subprocess.run(["swaymsg", "move", "container", "to", "workspace", ws10])
+ else:
+ subprocess.run(["swaymsg", "move", "container", "to", "workspace", ws])
+
+def wssw(mon_type):
+ if a == '-c':
+ expl_pick(mon_type)
+ elif a == '-s':
+ mov_to(mon_type)
+ elif a == '-t':
+ mov_to_next_mon(mon_type)
+
+for i in range(len(msg)):
+ if msg[i]["focused"] == True:
+ if msg[i]["output"] == "LVDS-1":
+ if not a:
+ subprocess.run(["swaymsg", "workspace", ws])
+ else:
+ mon_type = "LVDS-1"
+ wssw(mon_type)
+ if msg[i]["output"] == "HDMI-A-1":
+ if not a:
+ subprocess.run(["swaymsg", "workspace", ws10])
+ else:
+ mon_type = "HDMI-A-1"
+ wssw(mon_type)
+ if msg[i]["output"] == "DP-2":
+ if not a:
+ subprocess.run(["swaymsg", "workspace", ws10])
+ else:
+ mon_type = "DP-2"
+ wssw(mon_type)
+ if msg[i]["output"] == "DP-3":
+ if not a:
+ subprocess.run(["swaymsg", "workspace", ws10])
+ else:
+ mon_type = "DP-3"
+ wssw(mon_type)