diff --git a/.bash_profile b/.bash_profile
new file mode 100644
index 0000000..e1852a4
--- /dev/null
+++ b/.bash_profile
@@ -0,0 +1,7 @@
+#
+# ~/.bash_profile
+#
+
+[[ -f ~/.bashrc ]] && . ~/.bashrc
+
+[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
diff --git a/.bashrc b/.bashrc
new file mode 100644
index 0000000..51e304f
--- /dev/null
+++ b/.bashrc
@@ -0,0 +1,132 @@
+# Return if not run interactively
+[[ $- != *i* ]] && return
+
+xhost +local:root > /dev/null 2>&1
+
+use_fish=true
+
+# ==================== PATHS ====================
+if [ -d "$HOME/bin" ] ; then
+ export PATH="$HOME/bin:$PATH"
+ export PATH="$HOME/bin/scripts:$PATH"
+fi
+
+export MANPATH="/usr/local/texlive/2020/texmf-dist/doc/man:$MANPATH"
+export INFOPATH="/usr/local/texlive/2020/texmf-dist/doc/info:$INFOPATH"
+export PATH="/usr/local/texlive/2020/bin/x86_64-linux:$PATH"
+
+export PATH="$HOME/.cargo/bin:$PATH"
+# export PATH="$HOME/.gem/ruby/2.7.0/bin/:$PATH"
+
+export PATH="$PATH:$HOME/.rvm/bin"
+
+if [[ $(ps --no-header --pid=$PPID --format=cmd) != "fish" && ${use_fish} ]]
+then
+ exec fish
+fi
+
+# ==================== COLORS ====================
+
+use_color=true
+
+# Set colorful PS1 only on colorful terminals.
+# dircolors --print-database uses its own built-in database
+# instead of using /etc/DIR_COLORS. Try to use the external file
+# first to take advantage of user additions. Use internal bash
+# globbing instead of external grep binary.
+safe_term=${TERM//[^[:alnum:]]/?} # sanitize TERM
+match_lhs=""
+[[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
+[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(/dev/null \
+ && match_lhs=$(dircolors --print-database)
+[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true
+
+if ${use_color} ; then
+ # Enable colors for ls, etc. Prefer ~/.dir_colors #64489
+ if type -P dircolors >/dev/null ; then
+ if [[ -f ~/.dir_colors ]] ; then
+ eval $(dircolors -b ~/.dir_colors)
+ elif [[ -f /etc/DIR_COLORS ]] ; then
+ eval $(dircolors -b /etc/DIR_COLORS)
+ fi
+ fi
+
+ if [[ ${EUID} == 0 ]] ; then
+ PS1='\[\033[01;31m\][\h\[\033[01;36m\] \W\[\033[01;31m\]]\$\[\033[00m\] '
+ else
+ PS1='\[\033[01;32m\][\u@\h\[\033[01;37m\] \W\[\033[01;32m\]]\$\[\033[00m\] '
+ fi
+
+ alias ls='ls --color=auto'
+ alias grep='grep --colour=auto'
+ alias egrep='egrep --colour=auto'
+ alias fgrep='fgrep --colour=auto'
+else
+ if [[ ${EUID} == 0 ]] ; then
+ # show root@ when we don't have colors
+ PS1='\u@\h \W \$ '
+ else
+ PS1='\u@\h \w \$ '
+ fi
+fi
+
+unset use_color safe_term match_lhs sh
+
+# ==================== Settings ====================
+
+# Sudo autocompletiong
+complete -cf sudo
+
+shopt -s checkwinsize
+shopt -s expand_aliases
+shopt -s autocd
+
+# ==================== ANACONDA ====================
+
+# >>> conda initialize >>>
+# !! Contents within this block are managed by 'conda init' !!
+__conda_setup="$('/home/pavel/Programs/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
+if [ $? -eq 0 ]; then
+ eval "$__conda_setup"
+else
+ if [ -f "/home/pavel/Programs/miniconda3/etc/profile.d/conda.sh" ]; then
+ . "/home/pavel/Programs/miniconda3/etc/profile.d/conda.sh"
+ else
+ export PATH="/home/pavel/Programs/miniconda3/bin:$PATH"
+ fi
+fi
+unset __conda_setup
+# <<< conda initialize <<<
+
+
+# ==================== BASH_IT ====================
+
+# History
+eval "$(starship init bash)"
+
+shopt -s histappend
+export HISTCONTROL=ignoredups:erasedups
+# if [[ (! $PROMPT_COMMAND =~ .*history.*) && -z $TMUX ]]; then
+# export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"
+# fi
+HISTSIZE=
+HISTFILESIZE=
+
+# ==================== AUTOCOMPLETION ====================
+
+[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
+source /usr/share/fzf/completion.bash
+source /usr/share/fzf/key-bindings.bash
+
+
+# ==================== ALIASES ====================
+alias v="nvim"
+alias gg="lazygit"
+alias ls="exa --icons"
+alias ll="exa -lah --icons"
+alias q="exit"
+alias c="clear"
+
+
diff --git a/.config/dunst/dunstrc b/.config/dunst/dunstrc
new file mode 100644
index 0000000..b25c73c
--- /dev/null
+++ b/.config/dunst/dunstrc
@@ -0,0 +1,400 @@
+[global]
+ monitor = 0
+
+ follow = mouse
+
+ # The geometry of the window:
+ # [{width}]x{height}[+/-{x}+/-{y}]
+ # The geometry of the message window.
+ # The height is measured in number of notifications everything else
+ # in pixels. If the width is omitted but the height is given
+ # ("-geometry x2"), the message window expands over the whole screen
+ # (dmenu-like). If width is 0, the window expands to the longest
+ # message displayed. A positive x is measured from the left, a
+ # negative from the right side of the screen. Y is measured from
+ # the top and down respectively.
+ # The width can be negative. In this case the actual width is the
+ # screen width minus the width defined in within the geometry option.
+ geometry = "300x5-30+20"
+
+ # Show how many messages are currently hidden (because of geometry).
+ indicate_hidden = yes
+
+ # Shrink window if it's smaller than the width. Will be ignored if
+ # width is 0.
+ shrink = no
+
+ # The transparency of the window. Range: [0; 100].
+ # This option will only work if a compositing window manager is
+ # present (e.g. xcompmgr, compiz, etc.).
+ transparency = 15
+
+ # The height of the entire notification. If the height is smaller
+ # than the font height and padding combined, it will be raised
+ # to the font height and padding.
+ notification_height = 0
+
+ # Draw a line of "separator_height" pixel height between two
+ # notifications.
+ # Set to 0 to disable.
+ separator_height = 2
+
+ # Padding between text and separator.
+ padding = 8
+
+ # Horizontal padding.
+ horizontal_padding = 8
+
+ # Defines width in pixels of frame around the notification window.
+ # Set to 0 to disable.
+ frame_width = 3
+
+ # Defines color of the frame around the notification window.
+ frame_color = "#aaaaaa"
+
+ # Define a color for the separator.
+ # possible values are:
+ # * auto: dunst tries to find a color fitting to the background;
+ # * foreground: use the same color as the foreground;
+ # * frame: use the same color as the frame;
+ # * anything else will be interpreted as a X color.
+ separator_color = frame
+
+ # Sort messages by urgency.
+ sort = yes
+
+ # Don't remove messages, if the user is idle (no mouse or keyboard input)
+ # for longer than idle_threshold seconds.
+ # Set to 0 to disable.
+ # A client can set the 'transient' hint to bypass this. See the rules
+ # section for how to disable this if necessary
+ idle_threshold = 120
+
+ ### Text ###
+
+ font = DejaVu Sans 9
+
+ # The spacing between lines. If the height is smaller than the
+ # font height, it will get raised to the font height.
+ line_height = 0
+
+ # Possible values are:
+ # full: Allow a small subset of html markup in notifications:
+ # bold
+ # italic
+ # strikethrough
+ # underline
+ #
+ # For a complete reference see
+ # .
+ #
+ # strip: This setting is provided for compatibility with some broken
+ # clients that send markup even though it's not enabled on the
+ # server. Dunst will try to strip the markup but the parsing is
+ # simplistic so using this option outside of matching rules for
+ # specific applications *IS GREATLY DISCOURAGED*.
+ #
+ # no: Disable markup parsing, incoming notifications will be treated as
+ # plain text. Dunst will not advertise that it has the body-markup
+ # capability if this is set as a global setting.
+ #
+ # It's important to note that markup inside the format option will be parsed
+ # regardless of what this is set to.
+ markup = full
+
+ # The format of the message. Possible variables are:
+ # %a appname
+ # %s summary
+ # %b body
+ # %i iconname (including its path)
+ # %I iconname (without its path)
+ # %p progress value if set ([ 0%] to [100%]) or nothing
+ # %n progress value if set without any extra characters
+ # %% Literal %
+ # Markup is allowed
+ format = "%s\n%b"
+
+ # Alignment of message text.
+ # Possible values are "left", "center" and "right".
+ alignment = left
+
+ # Show age of message if message is older than show_age_threshold
+ # seconds.
+ # Set to -1 to disable.
+ show_age_threshold = 60
+
+ # Split notifications into multiple lines if they don't fit into
+ # geometry.
+ word_wrap = yes
+
+ # When word_wrap is set to no, specify where to make an ellipsis in long lines.
+ # Possible values are "start", "middle" and "end".
+ ellipsize = middle
+
+ # Ignore newlines '\n' in notifications.
+ ignore_newline = no
+
+ # Stack together notifications with the same content
+ stack_duplicates = true
+
+ # Hide the count of stacked notifications with the same content
+ hide_duplicate_count = false
+
+ # Display indicators for URLs (U) and actions (A).
+ show_indicators = yes
+
+ ### Icons ###
+
+ # Align icons left/right/off
+ icon_position = left
+
+ # Scale larger icons down to this size, set to 0 to disable
+ max_icon_size = 32
+
+ # Paths to default icons.
+ icon_path = /usr/share/icons/Mint-Y/status/32/;/usr/share/icons/Mint-Y/devices/32
+
+ ### History ###
+
+ # Should a notification popped up from history be sticky or timeout
+ # as if it would normally do.
+ sticky_history = yes
+
+ # Maximum amount of notifications kept in history
+ history_length = 20
+
+ ### Misc/Advanced ###
+
+ # dmenu path.
+ dmenu = /usr/bin/dmenu -p dunst:
+
+ # Browser for opening urls in context menu.
+ browser = /usr/bin/sensible-browser
+
+ # Always run rule-defined scripts, even if the notification is suppressed
+ always_run_script = true
+
+ # Define the title of the windows spawned by dunst
+ title = Dunst
+
+ # Define the class of the windows spawned by dunst
+ class = Dunst
+
+ # Print a notification on startup.
+ # This is mainly for error detection, since dbus (re-)starts dunst
+ # automatically after a crash.
+ startup_notification = false
+
+ # Manage dunst's desire for talking
+ # Can be one of the following values:
+ # crit: Critical features. Dunst aborts
+ # warn: Only non-fatal warnings
+ # mesg: Important Messages
+ # info: all unimportant stuff
+ # debug: all less than unimportant stuff
+ verbosity = mesg
+
+ # Define the corner radius of the notification window
+ # in pixel size. If the radius is 0, you have no rounded
+ # corners.
+ # The radius will be automatically lowered if it exceeds half of the
+ # notification height to avoid clipping text and/or icons.
+ corner_radius = 0
+
+ ### Legacy
+
+ # Use the Xinerama extension instead of RandR for multi-monitor support.
+ # This setting is provided for compatibility with older nVidia drivers that
+ # do not support RandR and using it on systems that support RandR is highly
+ # discouraged.
+ #
+ # By enabling this setting dunst will not be able to detect when a monitor
+ # is connected or disconnected which might break follow mode if the screen
+ # layout changes.
+ force_xinerama = false
+
+ ### mouse
+
+ # Defines action of mouse event
+ # Possible values are:
+ # * none: Don't do anything.
+ # * do_action: If the notification has exactly one action, or one is marked as default,
+ # invoke it. If there are multiple and no default, open the context menu.
+ # * close_current: Close current notification.
+ # * close_all: Close all notifications.
+ mouse_left_click = close_current
+ mouse_middle_click = do_action
+ mouse_right_click = close_all
+
+# Experimental features that may or may not work correctly. Do not expect them
+# to have a consistent behaviour across releases.
+[experimental]
+ # Calculate the dpi to use on a per-monitor basis.
+ # If this setting is enabled the Xft.dpi value will be ignored and instead
+ # dunst will attempt to calculate an appropriate dpi value for each monitor
+ # using the resolution and physical size. This might be useful in setups
+ # where there are multiple screens with very different dpi values.
+ per_monitor_dpi = false
+
+[shortcuts]
+
+ # Shortcuts are specified as [modifier+][modifier+]...key
+ # Available modifiers are "ctrl", "mod1" (the alt-key), "mod2",
+ # "mod3" and "mod4" (windows-key).
+ # Xev might be helpful to find names for keys.
+
+ # Close notification.
+ close = ctrl+space
+
+ # Close all notifications.
+ close_all = ctrl+shift+space
+
+ # Redisplay last message(s).
+ # On the US keyboard layout "grave" is normally above TAB and left
+ # of "1". Make sure this key actually exists on your keyboard layout,
+ # e.g. check output of 'xmodmap -pke'
+ history = ctrl+grave
+
+ # Context menu.
+ context = ctrl+shift+period
+
+[urgency_low]
+ # IMPORTANT: colors have to be defined in quotation marks.
+ # Otherwise the "#" and following would be interpreted as a comment.
+ background = "#222222"
+ foreground = "#888888"
+ timeout = 10
+ # Icon for notifications with low urgency, uncomment to enable
+ #icon = /path/to/icon
+
+[urgency_normal]
+ background = "#285577"
+ foreground = "#ffffff"
+ timeout = 10
+ # Icon for notifications with normal urgency, uncomment to enable
+ #icon = /path/to/icon
+
+[urgency_critical]
+ background = "#900000"
+ foreground = "#ffffff"
+ frame_color = "#ff0000"
+ timeout = 0
+ # Icon for notifications with critical urgency, uncomment to enable
+ #icon = /path/to/icon
+
+# Every section that isn't one of the above is interpreted as a rules to
+# override settings for certain messages.
+#
+# Messages can be matched by
+# appname (discouraged, see desktop_entry)
+# body
+# category
+# desktop_entry
+# icon
+# match_transient
+# msg_urgency
+# stack_tag
+# summary
+#
+# and you can override the
+# background
+# foreground
+# format
+# frame_color
+# fullscreen
+# new_icon
+# set_stack_tag
+# set_transient
+# timeout
+# urgency
+#
+# Shell-like globbing will get expanded.
+#
+# Instead of the appname filter, it's recommended to use the desktop_entry filter.
+# GLib based applications export their desktop-entry name. In comparison to the appname,
+# the desktop-entry won't get localized.
+#
+# SCRIPTING
+# You can specify a script that gets run when the rule matches by
+# setting the "script" option.
+# The script will be called as follows:
+# script appname summary body icon urgency
+# where urgency can be "LOW", "NORMAL" or "CRITICAL".
+#
+# NOTE: if you don't want a notification to be displayed, set the format
+# to "".
+# NOTE: It might be helpful to run dunst -print in a terminal in order
+# to find fitting options for rules.
+
+# Disable the transient hint so that idle_threshold cannot be bypassed from the
+# client
+#[transient_disable]
+# match_transient = yes
+# set_transient = no
+#
+# Make the handling of transient notifications more strict by making them not
+# be placed in history.
+#[transient_history_ignore]
+# match_transient = yes
+# history_ignore = yes
+
+# fullscreen values
+# show: show the notifications, regardless if there is a fullscreen window opened
+# delay: displays the new notification, if there is no fullscreen window active
+# If the notification is already drawn, it won't get undrawn.
+# pushback: same as delay, but when switching into fullscreen, the notification will get
+# withdrawn from screen again and will get delayed like a new notification
+#[fullscreen_delay_everything]
+# fullscreen = delay
+#[fullscreen_show_critical]
+# msg_urgency = critical
+# fullscreen = show
+
+#[espeak]
+# summary = "*"
+# script = dunst_espeak.sh
+
+#[script-test]
+# summary = "*script*"
+# script = dunst_test.sh
+
+#[ignore]
+# # This notification will not be displayed
+# summary = "foobar"
+# format = ""
+
+#[history-ignore]
+# # This notification will not be saved in history
+# summary = "foobar"
+# history_ignore = yes
+
+#[skip-display]
+# # This notification will not be displayed, but will be included in the history
+# summary = "foobar"
+# skip_display = yes
+
+#[signed_on]
+# appname = Pidgin
+# summary = "*signed on*"
+# urgency = low
+#
+#[signed_off]
+# appname = Pidgin
+# summary = *signed off*
+# urgency = low
+#
+#[says]
+# appname = Pidgin
+# summary = *says*
+# urgency = critical
+#
+#[twitter]
+# appname = Pidgin
+# summary = *twitter.com*
+# urgency = normal
+#
+#[stack-volumes]
+# appname = "some_volume_notifiers"
+# set_stack_tag = "volume"
+#
+# vim: ft=cfg
diff --git a/.config/fish/config.fish b/.config/fish/config.fish
new file mode 100644
index 0000000..b19f3fe
--- /dev/null
+++ b/.config/fish/config.fish
@@ -0,0 +1,19 @@
+starship init fish | source
+
+fish_vi_key_bindings
+
+alias c="clear"
+alias v="nvim"
+alias gg="lazygit"
+alias ls="exa --icons"
+alias ll="exa -lah --icons"
+alias q="exit"
+
+# >>> conda initialize >>>
+# !! Contents within this block are managed by 'conda init' !!
+eval /home/pavel/Programs/miniconda3/bin/conda "shell.fish" "hook" $argv | source
+# <<< conda initialize <<<
+
+if ! test -n "$TMUX"; and ! test -n "$IS_EMACS";
+ colorscript random
+end
\ No newline at end of file
diff --git a/.config/fontconfig/fonts.conf b/.config/fontconfig/fonts.conf
new file mode 100644
index 0000000..45d01f3
--- /dev/null
+++ b/.config/fontconfig/fonts.conf
@@ -0,0 +1,32 @@
+
+
+
+
+
+ monospace
+
+
+ DejaVu Sans Mono
+
+
+
+
+ sans-serif
+
+
+ DejaVu Sans
+
+
+
+
diff --git a/.config/fselect/config.toml b/.config/fselect/config.toml
new file mode 100644
index 0000000..0818898
--- /dev/null
+++ b/.config/fselect/config.toml
@@ -0,0 +1,12 @@
+no_color = false
+gitignore = false
+hgignore = false
+dockerignore = false
+is_zip_archive = [".zip", ".jar", ".war", ".ear"]
+is_archive = [".7z", ".bz2", ".bzip2", ".gz", ".gzip", ".lz", ".rar", ".tar", ".xz", ".zip"]
+is_audio = [".aac", ".aiff", ".amr", ".flac", ".gsm", ".m4a", ".m4b", ".m4p", ".mp3", ".ogg", ".wav", ".wma"]
+is_book = [".azw3", ".chm", ".djvu", ".epub", ".fb2", ".mobi", ".pdf"]
+is_doc = [".accdb", ".doc", ".docm", ".docx", ".dot", ".dotm", ".dotx", ".mdb", ".ods", ".odt", ".pdf", ".potm", ".potx", ".ppt", ".pptm", ".pptx", ".rtf", ".xlm", ".xls", ".xlsm", ".xlsx", ".xlt", ".xltm", ".xltx", ".xps"]
+is_image = [".bmp", ".gif", ".heic", ".jpeg", ".jpg", ".png", ".psb", ".psd", ".tiff", ".webp"]
+is_source = [".asm", ".bas", ".c", ".cc", ".ceylon", ".clj", ".coffee", ".cpp", ".cs", ".d", ".dart", ".elm", ".erl", ".go", ".groovy", ".h", ".hh", ".hpp", ".java", ".js", ".jsp", ".kt", ".kts", ".lua", ".nim", ".pas", ".php", ".pl", ".pm", ".py", ".rb", ".rs", ".scala", ".swift", ".tcl", ".vala", ".vb"]
+is_video = [".3gp", ".avi", ".flv", ".m4p", ".m4v", ".mkv", ".mov", ".mp4", ".mpeg", ".mpg", ".webm", ".wmv"]
diff --git a/.config/i3/config b/.config/i3/config
new file mode 100644
index 0000000..863e311
--- /dev/null
+++ b/.config/i3/config
@@ -0,0 +1,397 @@
+set $mod Mod4
+font pango:monospace 10
+#
+# Use Mouse+$mod to drag floating windows to their wanted position
+floating_modifier $mod
+
+mouse_warping output
+
+# Apply XFCE Settings
+# exec "bash /home/pavel/.screenlayout/layout.sh"
+exec xfsettingsd
+exec xiccd
+
+# start a terminal
+bindsym $mod+Return exec "i3-msg 'workspace 1 🚀; exec st'"
+
+# kill focused window
+bindsym $mod+Shift+q kill
+
+# change focus
+bindsym $mod+h focus left
+bindsym $mod+j focus down
+bindsym $mod+k focus up
+bindsym $mod+l focus right
+
+# alternatively, you can use the cursor keys:
+bindsym $mod+Left focus left
+bindsym $mod+Down focus down
+bindsym $mod+Up focus up
+bindsym $mod+Right focus right
+
+# move focused window
+bindsym $mod+Shift+h move left
+bindsym $mod+Shift+j move down
+bindsym $mod+Shift+k move up
+bindsym $mod+Shift+l move right
+
+# alternatively, you can use the cursor keys:
+bindsym $mod+Shift+Left move left
+bindsym $mod+Shift+Down move down
+bindsym $mod+Shift+Up move up
+bindsym $mod+Shift+Right move right
+
+# split in horizontal orientation
+bindsym $mod+s split h
+
+# split in vertical orientation
+bindsym $mod+v split v
+
+# enter fullscreen mode for the focused container
+bindsym $mod+f fullscreen toggle
+
+# change container layout (stacked, tabbed, toggle split)
+bindsym $mod+w layout stacking
+bindsym $mod+t layout tabbed
+bindsym $mod+e layout toggle split
+
+# toggle tiling / floating
+bindsym $mod+Shift+f floating toggle
+
+bindsym $mod+Tab move workspace to output right
+bindsym $mod+q focus output right
+
+# change focus between tiling / floating windows
+# bindsym $mod+space focus mode_toggle
+
+# focus the parent container
+bindsym $mod+a focus parent
+
+# focus the child container
+bindsym $mod+Shift+A focus child
+
+# switch to workspace
+
+set $w1 "1 🚀"
+set $w2 "2 🌍"
+set $w3 "3 💬"
+set $w4 "4 🛠️️"
+set $w7 "7 🛰️"
+set $w8 "8 📝"
+set $w9 "9 🎵"
+set $w10 "10 📦"
+
+bindsym $mod+1 workspace $w1
+bindsym $mod+2 workspace $w2
+bindsym $mod+3 workspace $w3
+bindsym $mod+4 workspace $w4
+bindsym $mod+5 workspace 5
+bindsym $mod+6 workspace 6
+bindsym $mod+7 workspace $w7
+bindsym $mod+8 workspace $w8
+bindsym $mod+9 workspace $w9
+bindsym $mod+0 workspace $w10
+
+# move focused container to workspace
+bindsym $mod+Shift+1 move container to workspace $w1
+bindsym $mod+Shift+2 move container to workspace $w2
+bindsym $mod+Shift+3 move container to workspace $w3
+bindsym $mod+Shift+4 move container to workspace $w4
+bindsym $mod+Shift+5 move container to workspace 5
+bindsym $mod+Shift+6 move container to workspace 6
+bindsym $mod+Shift+7 move container to workspace $w7
+bindsym $mod+Shift+8 move container to workspace $w8
+bindsym $mod+Shift+9 move container to workspace $w9
+bindsym $mod+Shift+0 move container to workspace $w10
+
+# Cycle workspaces
+bindsym $mod+comma workspace prev
+bindsym $mod+period workspace next
+
+assign [class="qutebrowser"] $w2
+assign [class="firefox"] $w2
+assign [class="VK"] $w3
+assign [class="Slack"] $w3
+assign [class="discord"] $w3
+assign [class="TelegramDesktop"] $w3
+assign [class="Postman"] $w4
+assign [class="Chromium-browse"] $w4
+assign [class="chromium"] $w4
+assign [class="google-chrome"] $w4
+assign [title="Vue Developer Tools"] $w4
+assign [class="Google Play Music Desktop Player"] $w9
+assign [class="jetbrains-datagrip"] $w4
+assign [class="zoom"] $w7
+assign [class="skype"] $w7
+assign [class="Mailspring"] $w8
+assign [class="Thunderbird"] $w8
+assign [class="Joplin"] $w8
+
+for_window [title="ncmpcpp.*"] move to workspace $w9
+for_window [class="cinnamon-settings*"] floating enable
+for_window [title="Picture-in-Picture"] sticky enable
+# reload the configuration file
+bindsym $mod+Shift+c reload
+# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
+bindsym $mod+Shift+r restart
+# exit i3 (logs you out of your X session)
+bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -b 'Yes, exit i3' 'i3-msg exit'"
+
+# Scratchpad
+for_window [instance="dropdown_*"] floating enable
+for_window [instance="dropdown_*"] move scratchpad
+for_window [instance="dropdown_*"] sticky enable
+for_window [instance="dropdown_*"] scratchpad show
+for_window [instance="dropdown_*"] move position center
+
+bindsym $mod+u exec ~/bin/scripts/dropdown
+
+# Borders
+# for_window [class=".*"] border pixel 0
+default_border pixel 3
+hide_edge_borders both
+
+# Gaps
+set $default_inner 10
+set $default_outer 0
+
+gaps inner $default_inner
+gaps outer $default_outer
+
+smart_gaps on
+
+mode "inner gaps" {
+ bindsym plus gaps inner current plus 5
+ bindsym minus gaps inner current minus 5
+ bindsym Shift+plus gaps inner all plus 5
+ bindsym Shift+minus gaps inner all minus 5
+ bindsym 0 gaps inner current set 0
+ bindsym Shift+0 gaps inner all set 0
+
+ bindsym r gaps inner current set $default_inner
+ bindsym Shift+r gaps inner all set $default_inner
+
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+}
+
+mode "outer gaps" {
+ bindsym plus gaps outer current plus 5
+ bindsym minus gaps outer current minus 5
+ bindsym Shift+plus gaps outer all plus 5
+ bindsym Shift+minus gaps outer all minus 5
+ bindsym 0 gaps outer current set 0
+ bindsym Shift+0 gaps outer all set 0
+
+ bindsym r gaps outer current set $default_outer
+ bindsym Shift+r gaps outer all set $default_outer
+
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+}
+
+bindsym $mod+g mode "inner gaps"
+bindsym $mod+Shift+g mode "outer gaps"
+
+# resize window (you can also use the mouse for that)
+mode "resize" {
+ # These bindings trigger as soon as you enter the resize mode
+
+ bindsym h resize shrink width 10 px or 10 ppt
+ bindsym j resize grow height 10 px or 10 ppt
+ bindsym k resize shrink height 10 px or 10 ppt
+ bindsym l resize grow width 10 px or 10 ppt
+
+ bindsym Shift+h resize shrink width 100 px or 100 ppt
+ bindsym Shift+j resize grow height 100 px or 100 ppt
+ bindsym Shift+k resize shrink height 100 px or 100 ppt
+ bindsym Shift+l resize grow width 100 px or 100 ppt
+
+ # same bindings, but for the arrow keys
+ 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 Shift+Left resize shrink width 100 px or 100 ppt
+ bindsym Shift+Down resize grow height 100 px or 100 ppt
+ bindsym Shift+Up resize shrink height 100 px or 100 ppt
+ bindsym Shift+Right resize grow width 100 px or 100 ppt
+
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+}
+
+bindsym $mod+r mode "resize"
+
+bindsym $mod+m mode "move" focus floating
+
+mode "move" {
+ bindsym $mod+Tab focus right
+
+ bindsym Left move left
+ bindsym Down move down
+ bindsym Up move up
+ bindsym Right move right
+
+ bindsym h move left
+ bindsym j move down
+ bindsym k move up
+ bindsym l move right
+
+ # back to normal: Enter or Escape
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+}
+
+# # dmenu
+# bindsym $mod+d exec i3-dmenu-desktop --dmenu="dmenu -l 10"
+# bindsym $mod+apostrophe mode "dmenu"
+
+# mode "dmenu" {
+# bindsym d exec i3-dmenu-desktop --dmenu="dmenu -l 10"; mode default
+# bindsym p exec dmenu_run -l 10; mode default
+# bindsym m exec dmenu-man; mode default
+# bindsym b exec dmenu-buku; mode default
+# bindsym f exec dmenu-explore; mode default
+# bindsym t exec dmenu-tmuxp; mode default
+# bindsym Escape mode "default"
+# }
+
+# bindsym $mod+b exec --no-startup-id dmenu-buku
+
+# rofi
+bindsym $mod+d exec "rofi -modi 'drun,run' -show drun"
+bindsym $mod+apostrophe mode "rofi"
+
+mode "rofi" {
+ bindsym d exec "rofi -modi 'drun,run' -show drun"
+ bindsym m exec rofi-man; mode default
+ bindsym b exec rofi-buku-mine; mode default
+# bindsym f exec dmenu-explore; mode default
+ bindsym k exec rofi-keepassxc -d ~/MEGAsync/Passwords.kdbx; mode default
+ bindsym Escape mode "default"
+}
+
+bindsym $mod+b exec --no-startup-id rofi-buku-mine
+
+
+# Launch apps
+bindsym $mod+semicolon mode "apps"
+
+mode "apps" {
+ bindsym Escape mode "default"
+ bindsym b exec firefox; mode default
+ bindsym v exec vk-messenger; mode default
+ bindsym s exec slack; mode default;
+ bindsym m exec "st -e ncmpcpp"; mode default
+ bindsym c exec "copyq toggle"; mode default
+ bindsym k exec "keepassxc"; mode default
+ bindsym e exec mailspring; mode default
+ bindsym a exec emacs; mode default
+ # bindsym a exec emacsclient -c; mode default
+ # bindsym Shift+a exec emacs; mode default
+}
+
+bindsym $mod+p exec "copyq menu"
+bindsym $mod+Shift+x exec "i3lock -f -i /home/pavel/Pictures/lock-wallpaper-2-1.png"
+
+# Colors
+set $bg-color #292d3e
+set $active-color #82aaff
+set $inactive-bg-color #434758
+set $text-color #f3f4f5
+set $inactive-text-color #aaaaaa
+set $urgent-bg-color #f07178
+set $urgent-text-color #000000
+
+# window colors
+# border background text indicator child border
+client.focused $active-color $bg-color $text-color $bg-color $active-color
+client.unfocused $bg-color $inactive-bg-color $inactive-text-color $bg-color $bg-color
+client.focused_inactive $active-color $inactive-bg-color $inactive-text-color $bg-color $bg-color
+client.urgent $urgent-bg-color $urgent-bg-color $urgent-text-color $bg-color $urgent-bg-color
+
+# bar
+exec_always --no-startup-id "bash /home/pavel/bin/polybar.sh"
+# bar {
+# status_command i3blocks -c ~/.config/i3/i3blocks.conf
+# i3bar_command i3bar
+# font pango:monospace 12
+# output HDMI-A-0
+# tray_output none
+# colors {
+# background $bg-color
+# separator #757575
+# # border background text
+# focused_workspace $bg-color $bg-color $text-color
+# inactive_workspace $inactive-bg-color $inactive-bg-color $inactive-text-color
+# urgent_workspace $urgent-bg-color $urgent-bg-color $urgent-text-color
+# }
+# }
+
+# bar {
+# status_command i3blocks -c ~/.config/i3/i3blocks.conf
+# i3bar_command i3bar
+# font pango:monospace 10
+# output DVI-D-0
+# colors {
+# background $bg-color
+# separator #757575
+# # border background text
+# focused_workspace $bg-color $bg-color $text-color
+# inactive_workspace $inactive-bg-color $inactive-bg-color $inactive-text-color
+# urgent_workspace $urgent-bg-color $urgent-bg-color $urgent-text-color
+# }
+# }
+
+# Pulse Audio controls
+bindsym XF86AudioRaiseVolume exec --no-startup-id "pulseaudio-ctl up && pkill -RTMIN+2 i3blocks"
+bindsym XF86AudioLowerVolume exec --no-startup-id "pulseaudio-ctl down && pkill -RTMIN+2 i3blocks"
+bindsym XF86AudioMute exec --no-startup-id "pulseaudio-ctl mute && pkill -RTMIN+2 i3blocks"
+
+# Media player controls
+bindsym XF86AudioPlay exec mpc toggle
+bindsym XF86AudioPause exec mpc pause
+bindsym XF86AudioNext exec mpc next
+bindsym XF86AudioPrev exec mpc prev
+
+# Screen brightness
+bindsym XF86MonBrightnessUp exec xbacklight -inc 5
+bindsym XF86MonBrightnessDown exec xbacklight -dec 5
+
+exec --no-startup-id pulseeffects --gapplication-service
+
+# Screenshots
+bindsym --release Print exec "flameshot gui"
+bindsym --release Shift+Print exec "xfce4-screenshooter"
+
+# Sudo
+exec --no-startup-id /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
+
+# Wallpaper
+# fallback
+exec_always "feh --bg-fill ~/Pictures/wallpaper-2.jpg"
+# exec_always "/home/pavel/bin/scripts/wallgif /home/pavel/Videos/OMSBG7.mov"
+
+# Compton
+exec compton
+
+# Some scripts
+exec_always --no-startup-id set_layout
+
+# Applets
+exec --no-startup-id /usr/bin/nm-applet
+exec --no-startup-id /usr/bin/blueman-applet
+
+# MPD
+exec --no-startup-id mpd
+
+# Stuff
+exec aw-qt
+exec "bash /home/pavel/bin/bukuserver.sh"
+exec dunst
+exec kde-connect-indicator
+exec copyq
+exec "bash /home/pavel/bin/tabliss.sh"
+# exec emacs --daemon
\ No newline at end of file
diff --git a/.config/i3/i3blocks.conf b/.config/i3/i3blocks.conf
new file mode 100644
index 0000000..7436229
--- /dev/null
+++ b/.config/i3/i3blocks.conf
@@ -0,0 +1,94 @@
+# List of valid properties:
+#
+# align
+# color
+# command
+# full_text
+# instance
+# interval
+# label
+# min_width
+# name
+# separator
+# separator_block_width
+# short_text
+# signal
+# urgent
+
+command=~/bin/i3blocks/$BLOCK_NAME
+separator_block_width=15
+markup=none
+
+[volume]
+label=♪
+instance=Master
+interval=once
+signal=2
+command=~/bin/i3blocks/volume 5 pulse
+separator=false
+
+[mpd]
+label=
+interval=1
+color=#FFA000
+command=~/bin/i3blocks/mpd
+
+[cpu_usage]
+label=
+color=#89ddf
+interval=2
+separator=false
+
+[memory]
+label=
+separator=false
+color=#82aaff
+interval=10
+
+[memory]
+label=
+color=#ffcb6b
+instance=swap
+# separator=false
+interval=10
+
+[wifi]
+# instance=wlp3s0
+instance=wlx58d56e980477
+label=
+color=#c3e88d
+interval=10
+separator=false
+
+[bandwidth3]
+interval=persist
+color=#c3e88d
+label=
+UNIT=KB
+PRINTF_COMMAND=printf "%.0f/%.0f\n", rx, wx;
+separator=false
+
+[ipstack]
+API_KEY=8948d12cd68a3b7ac60d405ed4118b43
+interval=1200
+
+[weather]
+LOCATION="Saint-Petersburg"
+color=#FF9600
+interval=3600
+separator=false
+
+[sun]
+LAT=59.9375N
+LON=30.308611E
+interval=600
+
+# [battery]
+# interval=60
+
+[aw_afk]
+interval=60
+
+[time]
+command=date '+%H:%M'
+interval=10
diff --git a/.config/mpd/mpd.conf b/.config/mpd/mpd.conf
new file mode 100644
index 0000000..339b261
--- /dev/null
+++ b/.config/mpd/mpd.conf
@@ -0,0 +1,398 @@
+# An example configuration file for MPD.
+# Read the user manual for documentation: http://www.musicpd.org/doc/user/
+
+
+# Files and directories #######################################################
+#
+# This setting controls the top directory which MPD will search to discover the
+# available audio files and add them to the daemon's online database. This
+# setting defaults to the XDG directory, otherwise the music directory will be
+# be disabled and audio files will only be accepted over ipc socket (using
+# file:// protocol) or streaming files over an accepted protocol.
+#
+music_directory "~/Music"
+#
+# This setting sets the MPD internal playlist directory. The purpose of this
+# directory is storage for playlists created by MPD. The server will use
+# playlist files not created by the server but only if they are in the MPD
+# format. This setting defaults to playlist saving being disabled.
+#
+playlist_directory "~/.mpd/playlists"
+#
+# This setting sets the location of the MPD database. This file is used to
+# load the database at server start up and store the database while the
+# server is not up. This setting defaults to disabled which will allow
+# MPD to accept files over ipc socket (using file:// protocol) or streaming
+# files over an accepted protocol.
+#
+db_file "~/.mpd/database"
+#
+# These settings are the locations for the daemon log files for the daemon.
+# These logs are great for troubleshooting, depending on your log_level
+# settings.
+#
+# The special value "syslog" makes MPD use the local syslog daemon. This
+# setting defaults to logging to syslog.
+#
+log_file "~/.mpd/log"
+#
+# This setting sets the location of the file which stores the process ID
+# for use of mpd --kill and some init scripts. This setting is disabled by
+# default and the pid file will not be stored.
+#
+pid_file "~/.mpd/pid"
+#
+# This setting sets the location of the file which contains information about
+# most variables to get MPD back into the same general shape it was in before
+# it was brought down. This setting is disabled by default and the server
+# state will be reset on server start up.
+#
+state_file "~/.mpd/state"
+#
+# The location of the sticker database. This is a database which
+# manages dynamic information attached to songs.
+#
+sticker_file "~/.mpd/sticker.sql"
+#
+###############################################################################
+
+
+# General music daemon options ################################################
+#
+# This setting specifies the user that MPD will run as. MPD should never run as
+# root and you may use this setting to make MPD change its user ID after
+# initialization. This setting is disabled by default and MPD is run as the
+# current user.
+#
+#user "nobody"
+#
+# This setting specifies the group that MPD will run as. If not specified
+# primary group of user specified with "user" setting will be used (if set).
+# This is useful if MPD needs to be a member of group such as "audio" to
+# have permission to use sound card.
+#
+#group "nogroup"
+#
+# This setting sets the address for the daemon to listen on. Careful attention
+# should be paid if this is assigned to anything other then the default, any.
+# This setting can deny access to control of the daemon. Not effective if
+# systemd socket activiation is in use.
+#
+# For network
+#bind_to_address "any"
+#
+# And for Unix Socket
+#bind_to_address "~/.mpd/socket"
+#
+# This setting is the TCP port that is desired for the daemon to get assigned
+# to.
+#
+#port "6600"
+#
+# This setting controls the type of information which is logged. Available
+# setting arguments are "default", "secure" or "verbose". The "verbose" setting
+# argument is recommended for troubleshooting, though can quickly stretch
+# available resources on limited hardware storage.
+#
+#log_level "default"
+#
+# Setting "restore_paused" to "yes" puts MPD into pause mode instead
+# of starting playback after startup.
+#
+#restore_paused "no"
+#
+# This setting enables MPD to create playlists in a format usable by other
+# music players.
+#
+#save_absolute_paths_in_playlists "no"
+#
+# This setting defines a list of tag types that will be extracted during the
+# audio file discovery process. The complete list of possible values can be
+# found in the user manual.
+#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc"
+#
+# This example just enables the "comment" tag without disabling all
+# the other supported tags:
+#metadata_to_use "+comment"
+#
+# This setting enables automatic update of MPD's database when files in
+# music_directory are changed.
+#
+#auto_update "yes"
+#
+# Limit the depth of the directories being watched, 0 means only watch
+# the music directory itself. There is no limit by default.
+#
+#auto_update_depth "3"
+#
+###############################################################################
+
+
+# Symbolic link behavior ######################################################
+#
+# If this setting is set to "yes", MPD will discover audio files by following
+# symbolic links outside of the configured music_directory.
+#
+#follow_outside_symlinks "yes"
+#
+# If this setting is set to "yes", MPD will discover audio files by following
+# symbolic links inside of the configured music_directory.
+#
+#follow_inside_symlinks "yes"
+#
+###############################################################################
+
+
+# Zeroconf / Avahi Service Discovery ##########################################
+#
+# If this setting is set to "yes", service information will be published with
+# Zeroconf / Avahi.
+#
+#zeroconf_enabled "yes"
+#
+# The argument to this setting will be the Zeroconf / Avahi unique name for
+# this MPD server on the network. %h will be replaced with the hostname.
+#
+#zeroconf_name "Music Player @ %h"
+#
+###############################################################################
+
+
+# Permissions #################################################################
+#
+# If this setting is set, MPD will require password authorization. The password
+# setting can be specified multiple times for different password profiles.
+#
+#password "password@read,add,control,admin"
+#
+# This setting specifies the permissions a user has who has not yet logged in.
+#
+#default_permissions "read,add,control,admin"
+#
+###############################################################################
+
+
+# Database #######################################################################
+#
+
+#database {
+# plugin "proxy"
+# host "other.mpd.host"
+# port "6600"
+#}
+
+# Input #######################################################################
+#
+
+input {
+ plugin "curl"
+# proxy "proxy.isp.com:8080"
+# proxy_user "user"
+# proxy_password "password"
+}
+
+#
+###############################################################################
+
+# Audio Output ################################################################
+#
+# MPD supports various audio output types, as well as playing through multiple
+# audio outputs at the same time, through multiple audio_output settings
+# blocks. Setting this block is optional, though the server will only attempt
+# autodetection for one sound card.
+#
+# An example of an ALSA output:
+#
+#audio_output {
+# type "alsa"
+# name "My ALSA Device"
+## device "hw:0,0" # optional
+## mixer_type "hardware" # optional
+## mixer_device "default" # optional
+## mixer_control "PCM" # optional
+## mixer_index "0" # optional
+#}
+#
+# An example of an OSS output:
+#
+#audio_output {
+# type "oss"
+# name "My OSS Device"
+## device "/dev/dsp" # optional
+## mixer_type "hardware" # optional
+## mixer_device "/dev/mixer" # optional
+## mixer_control "PCM" # optional
+#}
+#
+# An example of a shout output (for streaming to Icecast):
+#
+#audio_output {
+# type "shout"
+# encoder "vorbis" # optional
+# name "My Shout Stream"
+# host "localhost"
+# port "8000"
+# mount "/mpd.ogg"
+# password "hackme"
+# quality "5.0"
+# bitrate "128"
+# format "44100:16:1"
+## protocol "icecast2" # optional
+## user "source" # optional
+## description "My Stream Description" # optional
+## url "http://example.com" # optional
+## genre "jazz" # optional
+## public "no" # optional
+## timeout "2" # optional
+## mixer_type "software" # optional
+#}
+#
+# An example of a recorder output:
+#
+#audio_output {
+# type "recorder"
+# name "My recorder"
+# encoder "vorbis" # optional, vorbis or lame
+# path "/var/lib/mpd/recorder/mpd.ogg"
+## quality "5.0" # do not define if bitrate is defined
+# bitrate "128" # do not define if quality is defined
+# format "44100:16:1"
+#}
+#
+# An example of a httpd output (built-in HTTP streaming server):
+#
+#audio_output {
+# type "httpd"
+# name "My HTTP Stream"
+# encoder "vorbis" # optional, vorbis or lame
+# port "8000"
+# bind_to_address "0.0.0.0" # optional, IPv4 or IPv6
+## quality "5.0" # do not define if bitrate is defined
+# bitrate "128" # do not define if quality is defined
+# format "44100:16:1"
+# max_clients "0" # optional 0=no limit
+#}
+#
+# An example of a pulseaudio output (streaming to a remote pulseaudio server)
+#
+audio_output {
+ type "pulse"
+ name "My Pulse Output"
+# server "remote_server" # optional
+# sink "remote_server_sink" # optional
+}
+
+audio_output {
+ type "fifo"
+ name "my_fifo"
+ path "/tmp/mpd.fifo"
+ format "44100:16:2"
+}
+
+#
+# An example of a winmm output (Windows multimedia API).
+#
+#audio_output {
+# type "winmm"
+# name "My WinMM output"
+## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
+# or
+## device "0" # optional
+## mixer_type "hardware" # optional
+#}
+#
+# An example of an openal output.
+#
+#audio_output {
+# type "openal"
+# name "My OpenAL output"
+## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
+#}
+#
+# An example of an sndio output.
+#
+#audio_output {
+# type "sndio"
+# name "sndio output"
+# mixer_type "hardware"
+#}
+#
+# An example of an OS X output:
+#
+#audio_output {
+# type "osx"
+# name "My OS X Device"
+## device "Built-in Output" # optional
+## channel_map "-1,-1,0,1" # optional
+#}
+#
+## Example "pipe" output:
+#
+#audio_output {
+# type "pipe"
+# name "my pipe"
+# command "aplay -f cd 2>/dev/null"
+## Or if you're want to use AudioCompress
+# command "AudioCompress -m | aplay -f cd 2>/dev/null"
+## Or to send raw PCM stream through PCM:
+# command "nc example.org 8765"
+# format "44100:16:2"
+#}
+#
+## An example of a null output (for no audio output):
+#
+#audio_output {
+# type "null"
+# name "My Null Output"
+# mixer_type "none" # optional
+#}
+#
+###############################################################################
+
+
+# Normalization automatic volume adjustments ##################################
+#
+# This setting specifies the type of ReplayGain to use. This setting can have
+# the argument "off", "album", "track" or "auto". "auto" is a special mode that
+# chooses between "track" and "album" depending on the current state of
+# random playback. If random playback is enabled then "track" mode is used.
+# See for more details about ReplayGain.
+# This setting is off by default.
+#
+#replaygain "album"
+#
+# This setting sets the pre-amp used for files that have ReplayGain tags. By
+# default this setting is disabled.
+#
+#replaygain_preamp "0"
+#
+# This setting sets the pre-amp used for files that do NOT have ReplayGain tags.
+# By default this setting is disabled.
+#
+#replaygain_missing_preamp "0"
+#
+# This setting enables or disables ReplayGain limiting.
+# MPD calculates actual amplification based on the ReplayGain tags
+# and replaygain_preamp / replaygain_missing_preamp setting.
+# If replaygain_limit is enabled MPD will never amplify audio signal
+# above its original level. If replaygain_limit is disabled such amplification
+# might occur. By default this setting is enabled.
+#
+#replaygain_limit "yes"
+#
+# This setting enables on-the-fly normalization volume adjustment. This will
+# result in the volume of all playing audio to be adjusted so the output has
+# equal "loudness". This setting is disabled by default.
+#
+#volume_normalization "no"
+#
+###############################################################################
+
+# Character Encoding ##########################################################
+#
+# If file or directory names do not display correctly for your locale then you
+# may need to modify this setting.
+#
+#filesystem_charset "UTF-8"
+#
+###############################################################################
diff --git a/.config/ncmpcpp/bindings b/.config/ncmpcpp/bindings
new file mode 100644
index 0000000..757f109
--- /dev/null
+++ b/.config/ncmpcpp/bindings
@@ -0,0 +1,543 @@
+##############################################################
+## This is the example bindings file. Copy it to ##
+## ~/.ncmpcpp/bindings or $XDG_CONFIG_HOME/ncmpcpp/bindings ##
+## and set up your preferences ##
+##############################################################
+##
+##### General rules #####
+##
+## 1) Because each action has runtime checks whether it's
+## ok to run it, a few actions can be bound to one key.
+## Actions will be bound in order given in configuration
+## file. When a key is pressed, first action in order
+## will test itself whether it's possible to run it. If
+## test succeeds, action is executed and other actions
+## bound to this key are ignored. If it doesn't, next
+## action in order tests itself etc.
+##
+## 2) It's possible to bind more that one action at once
+## to a key. It can be done using the following syntax:
+##
+## def_key "key"
+## action1
+## action2
+## ...
+##
+## This creates a chain of actions. When such chain is
+## executed, each action in chain is run until the end of
+## chain is reached or one of its actions fails to execute
+## due to its requirements not being met. If multiple actions
+## and/or chains are bound to the same key, they will be
+## consecutively run until one of them gets fully executed.
+##
+## 3) When ncmpcpp starts, bindings configuration file is
+## parsed and then ncmpcpp provides "missing pieces"
+## of default keybindings. If you want to disable some
+## bindings, there is a special action called 'dummy'
+## for that purpose. Eg. if you want to disable ability
+## to crop playlists, you need to put the following
+## into configuration file:
+##
+## def_key "C"
+## dummy
+##
+## After that ncmpcpp will not bind any default action
+## to this key.
+##
+## 4) To let you write simple macros, the following special
+## actions are provided:
+##
+## - push_character "character" - pushes given special
+## character into input queue, so it will be immediately
+## picked by ncmpcpp upon next call to readKey function.
+## Accepted values: mouse, up, down, page_up, page_down,
+## home, end, space, enter, insert, delete, left, right,
+## tab, ctrl-a, ctrl-b, ..., ctrl-z, ctrl-[, ctrl-\\,
+## ctrl-], ctrl-^, ctrl-_, f1, f2, ..., f12, backspace.
+## In addition, most of these names can be prefixed with
+## alt-/ctrl-/shift- to be recognized with the appropriate
+## modifier key(s).
+##
+## - push_characters "string" - pushes given string into
+## input queue.
+##
+## - require_runnable "action" - checks whether given action
+## is runnable and fails if it isn't. This is especially
+## useful when mixed with previous two functions. Consider
+## the following macro definition:
+##
+## def_key "key"
+## push_characters "custom_filter"
+## apply_filter
+##
+## If apply_filter can't be currently run, we end up with
+## sequence of characters in input queue which will be
+## treated just as we typed them. This may lead to unexpected
+## results (in this case 'c' will most likely clear current
+## playlist, 'u' will trigger database update, 's' will stop
+## playback etc.). To prevent such thing from happening, we
+## need to change above definition to this one:
+##
+## def_key "key"
+## require_runnable "apply_filter"
+## push_characters "custom_filter"
+## apply_filter
+##
+## Here, first we test whether apply_filter can be actually run
+## before we stuff characters into input queue, so if condition
+## is not met, whole chain is aborted and we're fine.
+##
+## - require_screen "screen" - checks whether given screen is
+## currently active. accepted values: browser, clock, help,
+## media_library, outputs, playlist, playlist_editor,
+## search_engine, tag_editor, visualizer, last_fm, lyrics,
+## selected_items_adder, server_info, song_info,
+## sort_playlist_dialog, tiny_tag_editor.
+##
+## - run_external_command "command" - runs given command using
+## system() function.
+##
+## 5) In addition to binding to a key, you can also bind actions
+## or chains of actions to a command. If it comes to commands,
+## syntax is very similar to defining keys. Here goes example
+## definition of a command:
+##
+## def_command "quit" [deferred]
+## stop
+## quit
+##
+## If you execute the above command (which can be done by
+## invoking action execute_command, typing 'quit' and pressing
+## enter), ncmpcpp will stop the player and then quit. Note the
+## presence of word 'deferred' enclosed in square brackets. It
+## tells ncmpcpp to wait for confirmation (ie. pressing enter)
+## after you typed quit. Instead of 'deferred', 'immediate'
+## could be used. Then ncmpcpp will not wait for confirmation
+## (enter) and will execute the command the moment it sees it.
+##
+## Note: while command chains are executed, internal environment
+## update (which includes current window refresh and mpd status
+## update) is not performed for performance reasons. However, it
+## may be desirable to do so in some situration. Therefore it's
+## possible to invoke by hand by performing 'update enviroment'
+## action.
+##
+## Note: There is a difference between:
+##
+## def_key "key"
+## action1
+##
+## def_key "key"
+## action2
+##
+## and
+##
+## def_key "key"
+## action1
+## action2
+##
+## First one binds two single actions to the same key whilst
+## second one defines a chain of actions. The behavior of
+## these two is different and is described in (1) and (2).
+##
+## Note: Function def_key accepts non-ascii characters.
+##
+##### List of unbound actions #####
+##
+## The following actions are not bound to any key/command:
+##
+## - set_volume
+##
+#
+#def_key "mouse"
+# mouse_event
+#
+#def_key "up"
+# scroll_up
+#
+#def_key "shift-up"
+# select_item
+# scroll_up
+#
+#def_key "down"
+# scroll_down
+#
+#def_key "shift-down"
+# select_item
+# scroll_down
+#
+#def_key "["
+# scroll_up_album
+#
+#def_key "]"
+# scroll_down_album
+#
+#def_key "{"
+# scroll_up_artist
+#
+#def_key "}"
+# scroll_down_artist
+#
+#def_key "page_up"
+# page_up
+#
+#def_key "page_down"
+# page_down
+#
+#def_key "home"
+# move_home
+#
+#def_key "end"
+# move_end
+#
+#def_key "insert"
+# select_item
+#
+#def_key "enter"
+# enter_directory
+#
+#def_key "enter"
+# toggle_output
+#
+#def_key "enter"
+# run_action
+#
+#def_key "enter"
+# play_item
+#
+#def_key "space"
+# add_item_to_playlist
+#
+#def_key "space"
+# toggle_lyrics_update_on_song_change
+#
+#def_key "space"
+# toggle_visualization_type
+#
+#def_key "delete"
+# delete_playlist_items
+#
+#def_key "delete"
+# delete_browser_items
+#
+#def_key "delete"
+# delete_stored_playlist
+#
+#def_key "right"
+# next_column
+#
+#def_key "right"
+# slave_screen
+#
+#def_key "right"
+# volume_up
+#
+#def_key "+"
+# volume_up
+#
+#def_key "left"
+# previous_column
+#
+#def_key "left"
+# master_screen
+#
+#def_key "left"
+# volume_down
+#
+#def_key "-"
+# volume_down
+#
+#def_key ":"
+# execute_command
+#
+#def_key "tab"
+# next_screen
+#
+#def_key "shift-tab"
+# previous_screen
+#
+def_key "h"
+ show_help
+#
+#def_key "1"
+# show_playlist
+#
+#def_key "2"
+# show_browser
+#
+#def_key "2"
+# change_browse_mode
+#
+#def_key "3"
+# show_search_engine
+#
+#def_key "3"
+# reset_search_engine
+#
+#def_key "4"
+# show_media_library
+#
+#def_key "4"
+# toggle_media_library_columns_mode
+#
+#def_key "5"
+# show_playlist_editor
+#
+#def_key "6"
+# show_tag_editor
+#
+#def_key "7"
+# show_outputs
+#
+#def_key "8"
+# show_visualizer
+#
+#def_key "="
+# show_clock
+#
+#def_key "@"
+# show_server_info
+#
+#def_key "s"
+# stop
+#
+#def_key "p"
+# pause
+#
+#def_key ">"
+# next
+#
+#def_key "<"
+# previous
+#
+#def_key "ctrl-h"
+# jump_to_parent_directory
+#
+#def_key "ctrl-h"
+# replay_song
+#
+#def_key "backspace"
+# jump_to_parent_directory
+#
+#def_key "backspace"
+# replay_song
+#
+#def_key "f"
+# seek_forward
+#
+#def_key "b"
+# seek_backward
+#
+#def_key "r"
+# toggle_repeat
+#
+#def_key "z"
+# toggle_random
+#
+#def_key "y"
+# save_tag_changes
+#
+#def_key "y"
+# start_searching
+#
+#def_key "y"
+# toggle_single
+#
+#def_key "R"
+# toggle_consume
+#
+#def_key "Y"
+# toggle_replay_gain_mode
+#
+#def_key "T"
+# toggle_add_mode
+#
+#def_key "|"
+# toggle_mouse
+#
+#def_key "#"
+# toggle_bitrate_visibility
+#
+#def_key "Z"
+# shuffle
+#
+#def_key "x"
+# toggle_crossfade
+#
+#def_key "X"
+# set_crossfade
+#
+#def_key "u"
+# update_database
+#
+#def_key "ctrl-s"
+# sort_playlist
+#
+#def_key "ctrl-s"
+# toggle_browser_sort_mode
+#
+#def_key "ctrl-s"
+# toggle_media_library_sort_mode
+#
+#def_key "ctrl-r"
+# reverse_playlist
+#
+#def_key "ctrl-f"
+# apply_filter
+#
+#def_key "ctrl-_"
+# select_found_items
+#
+#def_key "/"
+# find
+#
+#def_key "/"
+# find_item_forward
+#
+#def_key "?"
+# find
+#
+#def_key "?"
+# find_item_backward
+#
+#def_key "."
+# next_found_item
+#
+#def_key ","
+# previous_found_item
+#
+#def_key "w"
+# toggle_find_mode
+#
+#def_key "e"
+# edit_song
+#
+#def_key "e"
+# edit_library_tag
+#
+#def_key "e"
+# edit_library_album
+#
+#def_key "e"
+# edit_directory_name
+#
+#def_key "e"
+# edit_playlist_name
+#
+#def_key "e"
+# edit_lyrics
+#
+#def_key "i"
+# show_song_info
+#
+#def_key "I"
+# show_artist_info
+#
+#def_key "g"
+# jump_to_position_in_song
+#
+#def_key "l"
+# show_lyrics
+#
+#def_key "ctrl-v"
+# select_range
+#
+#def_key "v"
+# reverse_selection
+#
+#def_key "V"
+# remove_selection
+#
+#def_key "B"
+# select_album
+#
+#def_key "a"
+# add_selected_items
+#
+#def_key "c"
+# clear_playlist
+#
+#def_key "c"
+# clear_main_playlist
+#
+#def_key "C"
+# crop_playlist
+#
+#def_key "C"
+# crop_main_playlist
+#
+#def_key "m"
+# move_sort_order_up
+#
+#def_key "m"
+# move_selected_items_up
+#
+#def_key "n"
+# move_sort_order_down
+#
+#def_key "n"
+# move_selected_items_down
+#
+#def_key "M"
+# move_selected_items_to
+#
+#def_key "A"
+# add
+#
+#def_key "S"
+# save_playlist
+#
+#def_key "o"
+# jump_to_playing_song
+#
+#def_key "G"
+# jump_to_browser
+#
+#def_key "G"
+# jump_to_playlist_editor
+#
+#def_key "~"
+# jump_to_media_library
+#
+#def_key "E"
+# jump_to_tag_editor
+#
+#def_key "U"
+# toggle_playing_song_centering
+#
+#def_key "P"
+# toggle_display_mode
+#
+#def_key "\\"
+# toggle_interface
+#
+#def_key "!"
+# toggle_separators_between_albums
+#
+#def_key "L"
+# toggle_lyrics_fetcher
+#
+#def_key "F"
+# fetch_lyrics_in_background
+#
+#def_key "alt-l"
+# toggle_fetching_lyrics_in_background
+#
+#def_key "ctrl-l"
+# toggle_screen_lock
+#
+#def_key "`"
+# toggle_library_tag_type
+#
+#def_key "`"
+# refetch_lyrics
+#
+#def_key "`"
+# add_random_items
+#
+#def_key "ctrl-p"
+# set_selected_items_priority
+#
+#def_key "q"
+# quit
+#
diff --git a/.config/ncmpcpp/config b/.config/ncmpcpp/config
new file mode 100644
index 0000000..8c39b9d
--- /dev/null
+++ b/.config/ncmpcpp/config
@@ -0,0 +1,406 @@
+ncmpcpp_directory = ~/.mpd/ncmpcpp
+lyrics_directory = ~/.mpd/lyrics
+#
+##### connection settings #####
+mpd_host = localhost
+mpd_port = 6600
+mpd_connection_timeout = 5
+mpd_music_dir = ~/Music
+
+##### music visualizer #####
+
+audio_output {
+ type "fifo"
+ name "Visualizer feed"
+ path "/tmp/mpd.fifo"
+ format "44100:16:2"
+}
+
+visualizer_fifo_path = /tmp/mpd.fifo
+
+visualizer_output_name = Visualizer feed
+
+visualizer_in_stereo = yes
+
+visualizer_sync_interval = 30
+# Available values: spectrum, wave, wave_filled, ellipse.
+visualizer_type = spectrum
+visualizer_look = ●▮
+#visualizer_color = blue, cyan, green, yellow, magenta, red
+visualizer_color = 41, 83, 119, 155, 185, 215, 209, 203, 197, 161
+
+##### song format #####
+## %l - length
+## %f - filename
+## %D - directory
+## %a - artist
+## %A - album artist
+## %t - title
+## %b - album
+## %y - date
+## %n - track number (01/12 -> 01)
+## %N - full track info (01/12 -> 01/12)
+## %g - genre
+## %c - composer
+## %p - performer
+## %d - disc
+## %C - comment
+## %P - priority
+## $R - begin right alignment
+## - 0 - default window color (discards all other colors)
+## - 1 - black
+## - 2 - red
+## - 3 - green
+## - 4 - yellow
+## - 5 - blue
+## - 6 - magenta
+## - 7 - cyan
+## - 8 - white
+## - 9 - end of current color
+## - b - bold text
+## - u - underline text
+## - r - reverse colors
+## - a - use alternative character set
+
+song_list_format = {%a - }{$7%b$9 - }{%t}|{$8%f$9}$R{$3(%l)$9}
+song_status_format = {{%a{ "%b"{ (%4y)}} - }{%t}}|{%f}
+song_library_format = {%n - }{%t}|{%f}
+alternative_header_first_line_format = $b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b
+alternative_header_second_line_format = {{$4$b%a$/b$9}{ - $7%b$9}{ ($4%4y$9)}}|{%D}
+current_item_prefix = $(yellow)$r
+current_item_suffix = $/r$(end)
+current_item_inactive_column_prefix = $(white)$r
+current_item_inactive_column_suffix = $/r$(end)
+now_playing_prefix = $b
+now_playing_suffix = $/b
+browser_playlist_prefix = "$2playlist$9 "
+selected_item_prefix = $6
+selected_item_suffix = $9
+modified_item_prefix = $3> $9
+song_window_title_format = ncmpcpp - {%a - }{%t}|{%f}
+##
+## Note: Below variables are used for sorting songs in browser. The sort mode
+## determines how songs are sorted, and can be used in combination with a sort
+## format to specify a custom sorting format. Available values for
+## browser_sort_mode are "name", "mtime", "format" and "noop".
+##
+#
+browser_sort_mode = name
+#
+browser_sort_format = {%a - }{%t}|{%f} {(%l)}
+#
+##### columns settings #####
+##
+## syntax of song columns list format is "column column etc."
+##
+## - syntax for each column is:
+##
+## (width of the column)[color of the column]{displayed tag}
+##
+## Note: Width is by default in %, if you want a column to have fixed size, add
+## 'f' after the value, e.g. (10)[white]{a} will be the column that take 10% of
+## screen (so the real width will depend on actual screen size), whereas
+## (10f)[white]{a} will take 10 terminal cells, no matter how wide the screen
+## is.
+##
+## - color is optional (if you want the default one, leave the field empty).
+##
+## Note: You can give a column additional attributes by putting appropriate
+## character after displayed tag character. Available attributes are:
+##
+## - r - column will be right aligned
+## - E - if tag is empty, empty tag marker won't be displayed
+##
+## You can also:
+##
+## - give a column custom name by putting it after attributes, separated with
+## character ':', e.g. {lr:Length} gives you right aligned column of lengths
+## named "Length".
+##
+## - define sequence of tags, that have to be displayed in case predecessor is
+## empty in a way similar to the one in classic song format, i.e. using '|'
+## character, e.g. {a|c|p:Owner} creates column named "Owner" that tries to
+## display artist tag and then composer and performer if previous ones are not
+## available.
+##
+#
+song_columns_list_format = (20)[]{a} (6f)[green]{NE} (50)[white]{t|f:Title} (20)[cyan]{b} (7f)[magenta]{l}
+#
+##### various settings #####
+#
+##
+## Note: Custom command that will be executed each time song changes. Useful for
+## notifications etc.
+##
+#execute_on_song_change = ""
+#
+##
+## Note: Custom command that will be executed each time player state
+## changes. The environment variable MPD_PLAYER_STATE is set to the current
+## state (either unknown, play, pause, or stop) for its duration.
+##
+#
+#execute_on_player_state_change = ""
+#
+#playlist_show_mpd_host = no
+#
+#playlist_show_remaining_time = no
+#
+#playlist_shorten_total_times = no
+#
+#playlist_separate_albums = no
+#
+##
+## Note: Possible display modes: classic, columns.
+##
+#playlist_display_mode = columns
+#
+browser_display_mode = columns
+#
+#search_engine_display_mode = classic
+#
+#playlist_editor_display_mode = classic
+#
+#discard_colors_if_item_is_selected = yes
+#
+#show_duplicate_tags = yes
+#
+incremental_seeking = yes
+#
+#seek_time = 1
+#
+#volume_change_step = 2
+#
+#autocenter_mode = no
+#
+#centered_cursor = no
+#
+##
+## Note: You can specify third character which will be used to build 'empty'
+## part of progressbar.
+##
+progressbar_look = =>
+#
+## Available values: database, playlist.
+##
+#default_place_to_search_in = database
+#
+## Available values: classic, alternative.
+##
+user_interface = classic
+#
+#data_fetching_delay = yes
+#
+## Available values: artist, album_artist, date, genre, composer, performer.
+##
+media_library_primary_tag = album_artist
+#
+media_library_albums_split_by_date = yes
+#
+## Available values: wrapped, normal.
+##
+#default_find_mode = wrapped
+#
+#default_tag_editor_pattern = %n - %t
+#
+#header_visibility = yes
+#
+#statusbar_visibility = yes
+#
+#titles_visibility = yes
+#
+#header_text_scrolling = yes
+#
+#cyclic_scrolling = no
+#
+#lines_scrolled = 2
+#
+lyrics_fetchers = lyricwiki, azlyrics, genius, sing365, lyricsmania, metrolyrics, justsomelyrics, jahlyrics, plyrics, tekstowo, internet
+#
+#follow_now_playing_lyrics = no
+#
+#fetch_lyrics_for_current_song_in_background = no
+#
+#store_lyrics_in_song_dir = no
+#
+#generate_win32_compatible_filenames = yes
+#
+#allow_for_physical_item_deletion = no
+#
+##
+## Note: If you set this variable, ncmpcpp will try to get info from last.fm in
+## language you set and if it fails, it will fall back to english. Otherwise it
+## will use english the first time.
+##
+## Note: Language has to be expressed as an ISO 639 alpha-2 code.
+##
+#lastfm_preferred_language = en
+#
+#space_add_mode = add_remove
+#
+#show_hidden_files_in_local_browser = no
+#
+##
+## How shall screen switcher work?
+##
+## - "previous" - switch between the current and previous screen.
+## - "screen1,...,screenN" - switch between given sequence of screens.
+##
+## Screens available for use: help, playlist, browser, search_engine,
+## media_library, playlist_editor, tag_editor, outputs, visualizer, clock,
+## lyrics, last_fm.
+##
+#screen_switcher_mode = playlist, browser
+#
+##
+## Note: You can define startup screen by choosing screen from the list above.
+##
+startup_screen = media_library
+#
+##
+## Note: You can define startup slave screen by choosing screen from the list
+## above or an empty value for no slave screen.
+##
+#startup_slave_screen = ""
+#
+#startup_slave_screen_focus = no
+#
+##
+## Default width of locked screen (in %). Acceptable values are from 20 to 80.
+##
+#
+#locked_screen_width_part = 50
+#
+#ask_for_locked_screen_width_part = yes
+#
+#jump_to_now_playing_song_at_start = yes
+#
+#ask_before_clearing_playlists = yes
+#
+#clock_display_seconds = no
+#
+#display_volume_level = yes
+#
+#display_bitrate = no
+#
+#display_remaining_time = no
+#
+## Available values: none, basic, extended, perl.
+##
+#regular_expressions = perl
+#
+##
+## Note: if below is enabled, ncmpcpp will ignore leading "The" word while
+## sorting items in browser, tags in media library, etc.
+##
+#ignore_leading_the = no
+#
+##
+## Note: if below is enabled, ncmpcpp will ignore diacritics while searching and
+## filtering lists. This takes an effect only if boost was compiled with ICU
+## support.
+##
+#ignore_diacritics = no
+#
+#block_search_constraints_change_if_items_found = yes
+#
+mouse_support = yes
+#
+#mouse_list_scroll_whole_page = yes
+#
+#empty_tag_marker =
+#
+#tags_separator = " | "
+#
+#tag_editor_extended_numeration = no
+#
+#media_library_sort_by_mtime = no
+#
+#enable_window_title = yes
+#
+##
+## Note: You can choose default search mode for search engine. Available modes
+## are:
+##
+## - 1 - use mpd built-in searching (no regexes, pattern matching)
+##
+## - 2 - use ncmpcpp searching (pattern matching with support for regexes, but
+## if your mpd is on a remote machine, downloading big database to process
+## it can take a while
+##
+## - 3 - match only exact values (this mode uses mpd function for searching in
+## database and local one for searching in current playlist)
+##
+#
+#search_engine_default_search_mode = 1
+#
+external_editor = nvim
+#
+## Note: set to yes if external editor is a console application.
+##
+use_console_editor = yes
+#
+##### colors definitions #####
+##
+## It is possible to set a background color by setting a color value
+## "_", e.g. red_black will set foregound color to red
+## and background color to black.
+##
+## In addition, for terminals that support 256 colors it is possible to set one
+## of them by using a number in range [1, 256] instead of color name,
+## e.g. numerical value corresponding to red_black is 2_1. To find out if the
+## terminal supports 256 colors, run ncmpcpp and check out the bottom of the
+## help screen for list of available colors and their numerical values.
+##
+## What is more, there are two special values for the background color:
+## "transparent" and "current". The first one explicitly sets the background to
+## be transparent, while the second one allows you to preserve current
+## background color and change only the foreground one. It's used implicitly
+## when background color is not specified.
+##
+## Moreover, it is possible to attach format information to selected color
+## variables by appending to their end a colon followed by one or more format
+## flags, e.g. black:b or red:ur. The following variables support this syntax:
+## visualizer_color, color1, color2, empty_tag_color, volume_color,
+## state_line_color, state_flags_color, progressbar_color,
+## progressbar_elapsed_color, player_state_color, statusbar_time_color,
+## alternative_ui_separator_color.
+##
+## Note: due to technical limitations of older ncurses version, if 256 colors
+## are used there is a possibility that you'll be able to use only colors with
+## transparent background.
+#
+#colors_enabled = yes
+#
+#empty_tag_color = cyan
+#
+#header_window_color = default
+#
+#volume_color = default
+#
+#state_line_color = default
+#
+#state_flags_color = default:b
+#
+#main_window_color = yellow
+#
+#color1 = white
+#
+#color2 = green
+#
+#progressbar_color = black:b
+#
+#progressbar_elapsed_color = green:b
+#
+#statusbar_color = default
+#
+#statusbar_time_color = default:b
+#
+#player_state_color = default:b
+#
+#alternative_ui_separator_color = black:b
+#
+#window_border_color = green
+#
+#active_window_border = red
+#
diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim
new file mode 100644
index 0000000..324b3a2
--- /dev/null
+++ b/.config/nvim/init.vim
@@ -0,0 +1,1053 @@
+call plug#begin('~/.local/share/nvim/plugged')
+
+" UI
+Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
+Plug 'xuyuanp/nerdtree-git-plugin'
+Plug 'nathanaelkane/vim-indent-guides'
+" Plug 'Yggdroot/indentLine'
+Plug 'jistr/vim-nerdtree-tabs'
+Plug 'luochen1990/rainbow'
+Plug 'RRethy/vim-illuminate'
+
+Plug 'vim-airline/vim-airline'
+Plug 'vim-airline/vim-airline-themes'
+Plug 'edkolev/tmuxline.vim'
+
+" Plug 'lilydjwg/colorizer'
+Plug 'mhinz/vim-startify'
+
+" Plug 'camspiers/animate.vim'
+" Plug 'camspiers/lens.vim'
+
+" Plug 'kien/tabman.vim'
+
+" LaTeX
+Plug 'lervag/vimtex'
+Plug 'KeitaNakamura/tex-conceal.vim', {'for': 'tex'}
+
+" Python
+Plug 'python-mode/python-mode', { 'branch': 'develop' }
+" Plug 'ivanov/vim-ipython'
+
+" Js & Co.
+Plug 'pangloss/vim-javascript'
+Plug 'posva/vim-vue'
+" Plug 'heavenshell/vim-jsdoc'
+Plug 'leafgarland/typescript-vim'
+Plug 'mattn/emmet-vim'
+Plug 'leafOfTree/vim-svelte-plugin'
+" Plug 'chrisbra/colorizer'
+" Plug 'mxw/vim-jsx'
+
+" C++
+" Plug 'octol/vim-cpp-enhanced-highlight'
+" Plug 'zchee/deoplete-clang'
+
+" Misc file formats
+Plug 'elzr/vim-json'
+Plug 'plasticboy/vim-markdown'
+Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
+" Plug 'adimit/prolog.vim'
+Plug 'jidn/vim-dbml'
+" Plug 'udalov/kotlin-vim'
+" Plug 'suan/vim-instant-markdown', {'for': 'markdown'} "npm -g install instant-markdown-d
+Plug 'euclio/vim-markdown-composer'
+" Plug 'chrisbra/csv.vim'
+Plug 'aklt/plantuml-syntax'
+" Plug 'tyru/open-browser.vim'
+Plug 'weirongxu/plantuml-previewer.vim'
+" Plug 'rvesse/vim-sparql'
+" Plug 'tikhomirov/vim-glsl'
+" Plug 'digitaltoad/vim-jade'
+" Plug 'tpope/vim-jdaddy'
+
+"Git
+Plug 'tpope/vim-fugitive'
+Plug 'junegunn/gv.vim'
+Plug 'airblade/vim-gitgutter'
+Plug 'jreybert/vimagit'
+" Plug 'drn/blamer.nvim', {'branch': 'silence-file-length-fatal-messages'}
+
+"Snippets stuff
+Plug 'honza/vim-snippets'
+Plug 'sirver/ultisnips'
+
+" General powerful plugins
+Plug 'neoclide/coc.nvim', {'branch': 'release'}
+Plug 'w0rp/ale'
+" Plug 'shougo/deoplete.nvim'
+Plug 'janko-m/vim-test'
+" Plug 'metakirby5/codi.vim'
+" Plug 'axvr/zepl.vim'
+" Plug 'valloric/youcompleteme'
+" Plug 'scrooloose/syntastic'
+
+" Coding & navigation
+Plug 'valloric/matchtagalways'
+Plug 'alvan/vim-closetag'
+Plug 'tpope/vim-surround'
+Plug 'junegunn/vim-easy-align'
+Plug 'tpope/vim-commentary'
+Plug 'justinmk/vim-sneak'
+Plug 'christoomey/vim-sort-motion'
+Plug 'AndrewRadev/splitjoin.vim'
+" Plug 'AndrewRadev/sideways.vim'
+Plug 'unblevable/quick-scope'
+" Plug 'terryma/vim-multiple-cursors'
+" Plug 'scrooloose/nerdcommenter'
+" Plug 'chrisbra/nrrwrgn'
+
+Plug 'jiangmiao/auto-pairs'
+" Plug 'raimondi/delimitmate'
+" Plug 'cohama/lexima.vim'
+
+" Plug 'dhruvasagar/vim-table-mode'
+Plug 'bronson/vim-trailing-whitespace'
+
+Plug 'dkprice/vim-easygrep'
+Plug 'easymotion/vim-easymotion'
+" Plug 'liuchengxu/vista.vim'
+Plug 'pechorin/any-jump.vim'
+Plug 'vim-scripts/restore_view.vim'
+Plug 'tpope/vim-repeat'
+Plug 'kkoomen/vim-doge'
+" Plug 'kshenoy/vim-signature'
+" Plug 'ericbn/vim-relativize'
+" Plug 'majutsushi/tagbar'
+" Plug 'yuttie/comfortable-motion.vim'
+" Plug 'derekwyatt/vim-fswitch'
+
+" Different extensions
+Plug 'kana/vim-submode'
+Plug 'skywind3000/asynctasks.vim'
+Plug 'skywind3000/asyncrun.vim'
+Plug 'chrisbra/unicode.vim'
+
+" Undo tree implementation
+Plug 'sjl/gundo.vim'
+" Plug 'mbbill/undotree'
+" Plug 'simnalamburt/vim-mundo'
+
+" Custom text objects
+Plug 'kana/vim-textobj-user'
+Plug 'kana/vim-textobj-indent'
+Plug 'kana/vim-textobj-line'
+" Plug 'kana/vim-textobj-entire'
+
+" Themes
+Plug 'drewtempelmeyer/palenight.vim'
+Plug 'https://gitlab.com/protesilaos/tempus-themes-vim.git'
+" Plug 'crusoexia/vim-monokai'
+" Plug 'lifepillar/vim-solarized8'
+" Plug 'haishanh/night-owl.vim'
+" Plug 'arcticicestudio/nord-vim'
+
+" fuzzy file stuff
+Plug 'liuchengxu/vim-clap'
+" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --bin' }
+" Plug 'ctrlpvim/ctrlp.vim'
+
+" Misc
+Plug 'wakatime/vim-wakatime'
+Plug 'ActivityWatch/aw-watcher-vim'
+Plug 'vimwiki/vimwiki'
+" Plug 'tpope/vim-rhubarb'
+" Plug 'mtth/scratch.vim'
+
+" Has to be plugged the last
+Plug 'ryanoasis/vim-devicons'
+Plug 'tiagofumo/vim-nerdtree-syntax-highlight'
+call plug#end()
+
+" General settings {{{
+set runtimepath+=~/.config/nvim/my-snippets/
+let $FZF_DEFAULT_COMMAND='fd --type f --exclude .git'
+
+set hidden
+
+set nobackup
+set nowritebackup
+set shortmess+=c
+
+set exrc
+set secure
+set number
+set relativenumber
+set linebreak
+set nojoinspaces
+
+set hlsearch
+set cursorline
+set mouse=a
+set splitbelow
+set splitright
+set inccommand=split
+set switchbuf=vsplit
+set redrawtime=500
+
+" Indent
+set tabstop=4
+set shiftwidth=4
+set smarttab
+set expandtab
+set autoindent
+
+" Folding
+set foldmethod=syntax
+set foldlevelstart=20
+
+" }}}
+
+" Mappings {{{
+nnoremap :NERDTreeToggle
+nnoremap "+p
+" nnoremap :Files
+nnoremap :Clap files
+nnoremap ca :Clap grep
+nnoremap aa :Clap grep
+nnoremap cl :Clap blines
+nnoremap cc :Clap filer
+nnoremap ch :Clap history
+nnoremap cj :Clap jumps
+
+" nnoremap s :%s/\<\>/
+
+tnoremap
+tnoremap :call chansend(b:terminal_job_id, "\Esc>")i
+nnoremap q :lclose :pclose :cclose :noh
+
+noremap - ddkP
+noremap _ ddp
+nnoremap H ^
+nnoremap L $
+
+nnoremap $
+
+" Toggle conceal
+nnoremap hc :let &cole=(&cole == 2) ? 0 : 2 echo 'conceallevel ' . &cole
+
+" lens.vim
+nnoremap hl :call lens#toggle()
+
+" colorizer
+nnoremap ho :ColorToggle
+
+" Delete line into _
+nnoremap d "_d
+vnoremap d "_d
+
+" lol
+" nnoremap ; :
+
+nnoremap u :GundoToggle
+
+" noremap :call comfortable_motion#flick(40)
+" noremap :call comfortable_motion#flick(-40)
+" nnoremap :TagbarToggle
+nnoremap :Vista!!
+
+" vim-test
+nnoremap tl :TestLast
+nnoremap tf :TestFile
+nnoremap ts :TestSuit
+nnoremap tn :TestNearest
+nnoremap tv :TestVisit
+
+" Tabs
+nnoremap gn :tabnew
+nnoremap gN :tabclose
+" nnoremap t1 1gt
+" nnoremap t2 2gt
+" nnoremap t3 3gt
+" nnoremap t4 4gt
+" nnoremap t5 5gt
+" nnoremap t6 6gt
+" nnoremap t7 7gt
+" nnoremap t8 8gt
+" nnoremap t9 9gt
+
+" ALE
+nnoremap af :ALEFix
+nnoremap ad :ALEGoToDefinition
+nnoremap asd :ALEGoToDefinitionInVSplit
+nnoremap assd :ALEGoToDefinitionInSplit
+nnoremap atd :ALEGoToDefinitionInTab
+nnoremap ar :ALEFindReferences
+nnoremap ah :ALEHover
+nnoremap ac :ALERename
+
+" coc
+" nnoremap ad (coc-definition)
+" nnoremap ai (coc-implementation)
+" nnoremap ar (coc-references)
+" nnoremap ac (coc-rename)
+
+" Async tasks
+nnoremap wl :AsyncTaskList
+nnoremap wr :AsyncTask
+nnoremap wa :CocList tasks
+
+
+" Replace
+nnoremap r :%s/\<\>/
+
+" Sideways
+nnoremap gh :SidewaysLeft
+nnoremap gl :SidewaysRight
+nnoremap g :SidewaysLeft
+nnoremap g :SidewaysRight
+
+omap aa SidewaysArgumentTextobjA
+xmap aa SidewaysArgumentTextobjA
+omap ia SidewaysArgumentTextobjI
+xmap ia SidewaysArgumentTextobjI
+
+" REPL
+" nnoremap r :Repl
+
+" EasyAlign
+xmap ga (EasyAlign)
+nmap ga (EasyAlign)
+
+" quick-scope
+let g:qs_highlight_on_keys = ['f', 'F', 't', 'T']
+
+" vim-sneak
+let g:sneak#s_next = 1
+
+" Close vim-clap with Esc
+autocmd FileType clap_input inoremap :call clap#handler#exit()
+
+" vimwiki
+" nnoremap wah :VimwikiAll2HTML
+" nnoremap wl :VimwikiTabnewLink
+
+nmap thestupidkeybinding1 VimwikiNextLink
+let g:vimwiki_key_mappings =
+ \ {
+ \ 'table_mappings': 0,
+ \ }
+
+" FSwitch
+" noremap + :FSAbove
+
+" Snippets
+let g:UltiSnipsUsePythonVersion = 3
+let g:UltiSnipsExpandTrigger=""
+let g:UltiSnipsJumpForwardTrigger=""
+let g:UltiSnipsJumpBackwardTrigger=""
+
+" Multiple cursors
+let g:multi_cursor_start_word_key = ''
+
+" Scratch
+let g:scratch_no_mappings = 1
+
+"}}}
+
+" Windows management mode {{{
+" Submode settings
+let g:submode_always_show_submode = 1
+let g:submode_timeout = 0
+let g:submode_keyseqs_to_leave = []
+
+" Enter and leave the mode
+call submode#enter_with('Windows', 'n', '', 's', ':call WindowsModeEnter()')
+call submode#map('Windows', 'n', 'x', '', ':call WindowsModeLeave()')
+
+function! WindowsModeEnter()
+ if g:lens#disabled == 0
+ let g:lens#disabled = 1
+ endif
+endfunction
+
+function! WindowsModeLeave()
+ let g:lens#disabled = 0
+ call lens#run()
+endfunction
+
+" Switch to the left. If the window is left-most, swith to the right-most window
+" of the previous tab
+function! SwitchLeft()
+ let l:win = winnr()
+ execute 'wincmd h'
+ if l:win == winnr()
+ normal gT
+ execute winnr('$') . 'wincmd w'
+ endif
+endfunction
+
+" The same for the left
+function! SwitchRight()
+ let l:win = winnr()
+ execute 'wincmd l'
+ if l:win == winnr()
+ normal gt
+ execute 1 . 'wincmd w'
+ endif
+endfunction
+
+" Switching
+call submode#map('Windows', 'n', '', 'j', 'j')
+call submode#map('Windows', 'n', '', 'k', 'k')
+call submode#map('Windows', 'n', '', 'h', ':call SwitchLeft()')
+call submode#map('Windows', 'n', '', 'l', ':call SwitchRight()')
+
+call submode#map('Windows', 'n', '', '', 'j')
+call submode#map('Windows', 'n', '', '', 'k')
+call submode#map('Windows', 'n', '', '', ':call SwitchLeft()')
+call submode#map('Windows', 'n', '', '', ':call SwitchRight()')
+
+" Closing
+call submode#map('Windows', 'n', '', 'q', 'c')
+call submode#map('Windows', 'n', '', 'Q', ':q!')
+
+" Moving windows
+call submode#map('Windows', 'n', '', '', 'J')
+call submode#map('Windows', 'n', '', '', 'K')
+call submode#map('Windows', 'n', '', '', 'H')
+call submode#map('Windows', 'n', '', '', 'L')
+
+call submode#map('Windows', 'n', '', '', 'J')
+call submode#map('Windows', 'n', '', '', 'K')
+call submode#map('Windows', 'n', '', '', 'H')
+call submode#map('Windows', 'n', '', '', 'L')
+
+call submode#map('Windows', 'n', '', 't', 'T')
+
+" New splits
+call submode#map('Windows', 'n', '', 'v', 'v')
+call submode#map('Windows', 'n', '', 's', 's')
+
+" Mappings for normal mode
+nnoremap j
+nnoremap k
+nnoremap :call SwitchLeft()
+nnoremap :call SwitchRight()
+
+nnoremap j
+nnoremap k
+nnoremap :call SwitchLeft()
+nnoremap :call SwitchRight()
+" }}}
+
+" Misc plugins settings {{{
+" NERDTree
+let NERDTreeIgnore = ['\.pyc$', '^__pycache__$']
+let NERDTreeMinimalUI = 1
+let NERDTreeDirArrows = 1
+let NERDTreeMouseMode = 2
+
+" csv
+let g:csv_arrange_align = 'l*'
+
+" git
+autocmd BufWritePost * GitGutter
+let g:magit_default_fold_level = 0
+" let g:blamer_enabled = 1
+" let g:blamer_delay = 1000
+" let g:blamer_prefix = ' > '
+
+
+" splitjoin
+let g:splitjoin_align = 1
+let g:splitjoin_python_brackets_on_separate_lines = 1
+
+" asyncrun
+let g:asyncrun_open = 6
+let g:asyncrun_rootmarks = ['.nvimrc', '.git']
+let g:asynctasks_term_pos = 'tab'
+
+" vimwiki
+let g:vimwiki_list = [{'path': '~/MEGAsync/Sync/vimwiki/', 'path_html': '~/MEGAsync/Sync/vimwiki-html/', 'ext': '.wiki'}]
+let g:vimwiki_global_ext = 0
+
+" }}}
+
+" Filetype-specific settings {{{
+
+" web-dev {{{
+augroup filetype_pug
+ autocmd!
+ autocmd Filetype pug setlocal foldmethod=indent
+ autocmd Filetype pug setlocal foldlevel=20
+augroup END
+
+augroup filetype_vue
+ autocmd!
+ autocmd Filetype vue command! -register JsDoc call jsdoc#insert()
+ autocmd Filetype vue setlocal conceallevel=2
+augroup END
+
+autocmd Filetype javascript setlocal conceallevel=2
+
+autocmd Filetype typescript execute ':CloseTagDisableBuffer'
+
+let g:mta_filetypes = { 'html' : 1, 'xhtml' : 1, 'xml' : 1, 'jinja' : 1, 'xsd': 1, 'vue': 1 }
+let g:closetag_filenames = '*.html,*.xhtml,*.vue,*.svelte'
+let g:closetag_filetypes = 'html,xhtml,vue,xml,xsd,svelte'
+let g:colorizer_auto_filetype='css,html,python,javascript,vue'
+
+let g:jsdoc_allow_input_prompt = 1
+let g:jsdoc_enable_es6 = 1
+let g:jsdoc_input_description = 1
+
+let g:vue_pre_processors = []
+let g:vim_svelte_plugin_use_sass = 1
+
+let g:javascript_plugin_jsdoc = 1
+
+" let g:javascript_conceal_function = "ƒ"
+" let g:javascript_conceal_null = "ø"
+" let g:javascript_conceal_this = "#"
+" let g:javascript_conceal_return = "⮜"
+" let g:javascript_conceal_undefined = "¿"
+" let g:javascript_conceal_NaN = "ℕ"
+" let g:javascript_conceal_prototype = "¶"
+" let g:javascript_conceal_static = "•"
+" let g:javascript_conceal_super = "Ω"
+" let g:javascript_conceal_arrow_function = "⮞"
+" let g:javascript_conceal_noarg_arrow_function = "🞅"
+" let g:javascript_conceal_underscore_arrow_function = "🞅"
+
+" }}}
+
+" LaTeX {{{
+let g:tex_flavor='latex'
+let g:vimtex_fold_enabled = 1
+let g:vimtex_view_method='zathura'
+let g:vimtex_quickfix_mode=0
+let g:tex_conceal='abdmgs'
+let g:ale_tex_chktex_options='-I --nowarn 32'
+" let g:syntastic_tex_lacheck_quiet_messages = { 'regex': ['\Vpossible unwanted space at', '\VUse ` to begin'] }
+
+augroup filetype_tex
+ autocmd!
+ autocmd Filetype tex setlocal foldlevel=0
+ autocmd Filetype tex
+ \ let b:AutoPairs = {"(": ")", '[': ']', '{': '}', '$': '$', '\left(': '\right)',
+ \ '\left[': 'right]', "''": '``', "``": "''", '"': '"', 'sympy': 'sympy', '<<': '>>'}
+ autocmd Filetype tex setlocal conceallevel=2
+augroup END
+
+" }}}
+
+" Python {{{
+autocmd Filetype python
+ \ setlocal foldmethod=indent
+
+" let g:python_host_prog='/usr/bin/python'
+" let g:python3_host_prog='/usr/bin/python3'
+let g:pymode_python = 'python3'
+let g:pymode_lint = 0
+let g:pymode_rope = 0
+let g:pymode_rope_completion = 0
+let g:pymode_rope_autoimport = 0
+let g:pymode_doc = 1
+" }}}
+
+" GO {{{
+let g:go_fmt_autosave = 0
+let g:go_imports_autosave = 0
+let g:go_mod_fmt_autosave = 0
+
+augroup filetype_go
+ autocmd!
+ autocmd FileType go set noexpandtab
+augroup END
+" }}}
+
+" REPL {{{
+augroup zepl
+ autocmd!
+ autocmd FileType python let b:repl_config = { 'cmd': 'ipython --colors=Linux' }
+ autocmd FileType javascript let b:repl_config = { 'cmd': 'node' }
+augroup END
+" }}}
+
+" Misc file commands {{{
+augroup filetype_vim
+ autocmd!
+ autocmd Filetype vim setlocal foldmethod=marker
+ autocmd Filetype vim setlocal foldlevel=0
+augroup END
+
+augroup filetype_sparql let g:rainbow_active = 0
+augroup END
+
+au BufNewFile,BufRead *.frag,*.vert,*.fp,*.vp,*.glsl setf glsl
+au BufNewFile,BufRead *.pl setf prolog
+au BufNewFile,BufRead *.sparql setf sparql
+
+au TermEnter * IndentGuidesDisable
+au TermLeave * IndentGuidesEnable
+
+let g:vim_markdown_conceal = 2
+let g:instant_markdown_autostart = 0
+let g:instant_markdown_mathjax = 1
+let g:instant_markdown_open_to_the_world = 1
+let g:instant_markdown_allow_external_content = 1
+
+let g:markdown_composer_autostart = 0
+" }}}
+
+" }}}
+
+" Syntax check & autocomplete {{{
+" coc {{{
+inoremap
+ \ pumvisible() ? "\" :
+ \ check_back_space() ? "\" :
+ \ coc#refresh()
+inoremap pumvisible() ? "\" : "\"
+inoremap pumvisible() ? "\" : "\u\"
+
+function! s:check_back_space() abort
+ let col = col('.') - 1
+ return !col || getline('.')[col - 1] =~# '\s'
+endfunction
+
+" Use to trigger completion.
+inoremap coc#refresh()
+function! s:cocActionsOpenFromSelected(type) abort
+ execute 'CocCommand actions.open ' . a:type
+endfunction
+xmap p :execute 'CocCommand actions.open ' . visualmode()
+nmap p :set operatorfunc=cocActionsOpenFromSelectedg@
+nnoremap K :call show_documentation()
+
+function! s:show_documentation()
+ if (index(['vim','help'], &filetype) >= 0)
+ execute 'h '.expand('')
+ else
+ call CocAction('doHover')
+ endif
+endfunction
+
+autocmd CursorHold * silent call CocActionAsync('highlight')
+
+let g:coc_global_extensions =
+ \ [
+ \ 'coc-actions',
+ \ 'coc-calc',
+ \ 'coc-css',
+ \ 'coc-json',
+ \ 'coc-marketplace',
+ \ 'coc-python',
+ \ 'coc-tasks',
+ \ 'coc-tsserver',
+ \ 'coc-ultisnips',
+ \ 'coc-vetur',
+ \ 'coc-vimtex'
+ \ ]
+
+" }}}
+
+
+" Syntastic {{{
+" set statusline+=%#warningmsg#
+" set statusline+=%{SyntasticStatuslineFlag()}
+" set statusline+=%*
+"
+" let g:syntastic_ignore_files = ['\.py$', '\.tex$']
+" let g:syntastic_always_populate_loc_list = 1
+" let g:syntastic_auto_loc_list = 1
+" let g:syntastic_check_on_open = 1
+" let g:syntastic_check_on_wq = 0
+" }}}
+
+" ALE {{{
+let g:ale_open_list = 'on_save'
+let g:ale_list_window_size = 7
+let g:ale_close_preview_on_insert = 1
+let g:ale_lint_on_text_changed = 'never'
+let g:ale_lint_on_enter = 0
+let g:ale_lint_on_insert_leave = 0
+let g:ale_completion_enabled = 0
+let g:ale_linter_aliases = {'svelte': ['css', 'javascript']}
+let g:ale_linters = {'python': ['prospector'], 'tex': ['chktex'], 'cpp': ['clang'], 'vue': ['eslint'], 'typescript': ['tsserver', 'tslint'], 'svelte': ['eslint']}
+let g:ale_fixers = {
+ \ 'python': ['yapf', 'isort', 'remove_trailing_lines', 'trim_whitespace'],
+ \ 'tex': ['latexindent', 'textlint', 'remove_trailing_lines', 'trim_whitespace'],
+ \ 'js': ['prettier', 'eslint'],
+ \ 'javascript': ['prettier', 'eslint'],
+ \ 'typescript': ['prettier', 'tslint'],
+ \ 'jsx': ['prettier', 'eslint'],
+ \ 'vue': ['prettier', 'eslint'],
+ \ 'cpp': ['clang-format', 'remove_trailing_lines', 'trim_whitespace'],
+ \ 'json': ['prettier'],
+ \ 'svelte': ['eslint'],
+ \ 'go': ['gofmt']
+ \}
+let g:airline#extensions#ale#enabled = 1
+" }}}
+
+" Deoplete {{{
+" call deoplete#custom#var('omni', 'input_patterns', {
+" \ 'tex': g:vimtex#re#deoplete
+" \})
+"
+" let g:deoplete#enable_at_startup = 1
+" call deoplete#custom#source('ale', 'rank', 999)
+"
+" inoremap
+" \ pumvisible() ? "\" :
+" \ check_back_space() ? "\" :
+" \ deoplete#mappings#manual_complete()
+" function! s:check_back_space() abort
+" let col = col('.') - 1
+" return !col || getline('.')[col - 1] =~ '\s'
+" endfunction
+"
+" let g:deoplete#sources#clang#libclang_path = '/usr/lib/llvm-6.0/lib/libclang.so.1'
+" let g:deoplete#sources#clang#clang_header = '/usr/lib/llvm-6.0/lib/clang/6.0.0/include'
+" }}}
+
+" Auto-pairs
+let g:AutoPairsFlyMode = 0
+let g:AutoPairsShortcutBackInsert = ''
+
+" }}}
+
+" My scripts {{{
+" Subterminal {{{
+
+function! GetSubTerminalName()
+ let current_tabpage = tabpagenr()
+ return current_tabpage . '_terminal'
+endfunction
+
+function! SubTerminal()
+ let subterminal_name = GetSubTerminalName()
+ let terminal_num = bufnr(subterminal_name)
+ if terminal_num == -1
+ execute ':new ' . subterminal_name
+ execute ':resize 10'
+ if isdirectory("venv")
+ execute ':terminal'
+ else
+ execute ':terminal'
+ endif
+ normal i
+ else
+ execute ':bwipeout! ' . terminal_num
+ execute ':bwipeout! ' . (terminal_num + 1)
+ endif
+endfunction
+
+function! WipeSubTerminalBuffer()
+ let subterminal_name = GetSubTerminalName()
+ let terminal_num = bufnr(subterminal_name)
+ if terminal_num != -1
+ execute ':bwipeout! ' . terminal_num
+ endif
+endfunction
+
+autocmd BufWipeout term://* call WipeSubTerminalBuffer()
+
+nnoremap ` :call SubTerminal()
+
+" }}}
+
+" Terminal in tab {{{
+function! OpenTerminalInTab()
+ execute ':tabnew'
+ execute ':terminal'
+ normal i
+endfunction
+
+nnoremap ~ :call OpenTerminalInTab()
+" }}}
+
+" Diff with saved {{{
+function! s:DiffWithSaved()
+ let filetype=&ft
+ diffthis
+ vnew | r # | normal! 1Gdd
+ diffthis
+ exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
+endfunction
+
+com! DiffSaved call s:DiffWithSaved()
+" }}}
+
+" Git diff stats {{{
+function! Gstats()
+ execute '!git diff --stat'
+endfunction
+
+command! Gstats call Gstats()
+
+" }}}
+
+" Uptime {{{
+let s:start_time = localtime()
+
+function! UptimeSeconds()
+ let l:current_time = localtime()
+ let l:uptime = l:current_time - s:start_time
+ return l:uptime
+endfunction
+
+function! s:AddLeadingZero(i)
+ if a:i == 0
+ return "00"
+ elseif a:i < 10
+ return "0" . a:i
+ else
+ return "" . a:i
+ endif
+endfu
+
+function! Uptime(...)
+ let l:show_seconds = get(a:, 1, 0)
+ let l:uptime = UptimeSeconds()
+ let l:m_s = (l:uptime) % 60
+ let l:m_m = (l:uptime/ 60) % 60
+ let l:m_h = (l:uptime/ (60 * 60)) % 24
+ let l:m_d = (l:uptime/ (60 * 60 * 24))
+
+ let l:msg = ""
+ if (l:m_d > 0)
+ let l:msg = l:msg . l:m_d . "d "
+ endif
+ let l:msg = l:msg . s:AddLeadingZero(l:m_h) . ":" .
+ \ s:AddLeadingZero(l:m_m)
+ if l:show_seconds == 1
+ let l:msg = l:msg . ":" . s:AddLeadingZero(l:m_s)
+ endif
+ return l:msg
+endfunction
+
+command! Uptime echo Uptime(1)
+
+" }}}
+
+" {{{ Delete Hidden buffers
+function! DeleteHiddenBuffers()
+ let tpbl=[]
+ let closed = 0
+ let terminals = 0
+ call map(range(1, tabpagenr('$')), 'extend(tpbl, tabpagebuflist(v:val))')
+ for buf in filter(range(1, bufnr('$')), 'bufexists(v:val) && index(tpbl, v:val)==-1')
+ if getbufvar(buf, '&mod') == 0
+ if matchstr(bufname(buf), '^term:\/\/.*$') == ''
+ silent execute 'bwipeout' buf
+ let closed += 1
+ else
+ silent execute 'bwipeout!' buf
+ let closed += 1
+ let terminals += 1
+ endif
+ endif
+ endfor
+ echo "Closed " .closed. " hidden buffers (" . terminals . " terminals)"
+endfunction
+
+command! DeleteHiddenBuffers call DeleteHiddenBuffers()
+
+" }}}
+
+" {{{ Fugitive conflict resolution
+
+function! GitVMergeSplit()
+ execute 'Gdiffsplit!'
+ wincmd k
+ wincmd H
+ let s:leftMergeBuffer = bufnr('%')
+ wincmd l
+ wincmd j
+ wincmd L
+ let s:rightMergeBuffer = bufnr('%')
+ wincmd h
+endfunction
+
+function! GitMergeGetLeft()
+ execute ":diffget" . s:leftMergeBuffer
+endfunction
+
+function! GitMergeGetRight()
+ execute ":diffget" . s:rightMergeBuffer
+endfunction
+
+command! Gdiffmerge call GitVMergeSplit()
+nnoremap gdh :call GitMergeGetLeft()
+nnoremap gdl :call GitMergeGetRight()
+nnoremap gd :call GitMergeGetLeft()
+nnoremap gd :call GitMergeGetRight()
+
+" }}}
+
+" {{{ Folding
+
+function! SetFoldLevel() range
+ execute ":set foldlevel=" . v:count
+ echo("set foldlevel=" . v:count)
+endfunction
+
+function! OnSpace()
+ if foldlevel('.')
+ if foldclosed('.') != -1
+ return 'zO'
+ else
+ return 'za'
+ endif
+ else
+ return "\"
+ endif
+endfunction
+
+nnoremap ff :call SetFoldLevel()
+nnoremap @=(OnSpace())
+
+" }}}
+
+" {{{ Better Home
+function! Home()
+ let l:before = getpos('.')
+ normal ^
+ let l:after = getpos('.')
+ if l:before[2] == l:after[2]
+ call cursor(l:after[0], 1)
+ endif
+endfunction
+
+nnoremap :call Home()
+
+" }}}
+
+" {{{ Deoplete and multiple cursors
+" function! Multiple_cursors_before()
+" if deoplete#is_enabled()
+" call deoplete#disable()
+" let g:deoplete_is_enable_before_multi_cursors = 1
+" else
+" let g:deoplete_is_enable_before_multi_cursors = 0
+" endif
+" endfunc
+" function! Multiple_cursors_after()
+" if g:deoplete_is_enable_before_multi_cursors
+" call deoplete#enable()
+" endif
+" endfunction
+" }}}
+
+" {{{ Switch to project root
+let g:markers = split('.git') " TODO nvimrc
+function! CdToRepoRoot() abort
+ for marker in g:markers
+ let root = finddir(marker, expand('%:p:h') . ';')
+ if !empty(root)
+ let root = fnamemodify(root, ':h')
+ execute 'cd ' . root
+ echo 'cd ' . root . ' (found ' . marker . ')'
+ return
+ endif
+ endfor
+ echoerr 'No repo root found.'
+endfunction
+
+nnoremap cr :call CdToRepoRoot()
+" }}}
+
+" Put current time
+command! Timestamp :put =strftime('%d-%m-%y %H:%M:%S')
+" }}}
+
+" UI settings {{{
+set background=dark
+" let g:solarized_visibility='high'
+" tmux cursor
+ if exists('+termguicolors')
+ set termguicolors
+ endif
+"set guifont=DroidSansMono\ Nerd\ Font\ 11
+augroup qs_colors
+ autocmd!
+ autocmd ColorScheme * highlight QuickScopePrimary guifg='#ff0000' gui=underline ctermfg=155 cterm=underline
+ autocmd ColorScheme * highlight QuickScopeSecondary guifg='#ffff00' gui=underline ctermfg=81 cterm=underline
+augroup END
+
+set laststatus=2
+colorscheme palenight
+
+highlight! TermCursorNC guibg=red
+"highlight Conceal guibg=Normal guifg=Normal
+hi Normal guibg=NONE ctermbg=NONE
+highlight! link Conceal Normal
+highlight! illuminatedWord cterm=underline gui=underline
+
+" Airline
+let g:airline_theme='palenight'
+let g:airline_powerline_fonts = 1
+" let g:airline_extensions = []
+let g:airline#extensions#tabline#enabled = 1
+let g:airline#extensions#tabline#buffer_idx_mode = 1
+let g:airline#extensions#tabline#formatter = 'unique_tail'
+let g:airline_section_b = '%{Uptime()}'
+let g:airline_highlighting_cache = 1
+
+" vim-clap
+"let g:clap_search_box_border_symbols = {'curve': ["f", "g"], 'nil': ['', ''] }
+let g:clap_search_box_border_style = 'nul'
+let g:clap_layout = { 'relative': 'editor' }
+
+" Gundo
+let g:gundo_preview_height = 15
+
+" tmux line
+let g:tmuxline_preset = {
+ \'a' : '#S',
+ \'b' : '#W',
+ \'win' : '#I #W #[align=left]',
+ \'cwin' : '#I #W',
+ \'x' : '%-H:%M',
+ \'y' : '%a, %b %d',
+ \'z' : '#H'}
+
+" Indent guides
+let g:indent_guides_enable_on_vim_startup = 1
+let g:indent_guides_exclude_filetypes = ['help', 'nerdtree', 'tagbar', 'startify', 'vim-plug', 'clap_input', 'codi']
+let g:indent_guides_guide_size = 1
+
+" let g:indentLine_fileTypeExclude = ['help', 'nerdtree', 'tagbar', 'startify', 'vim-plug', 'clap_input', 'codi']
+" let g:indentLine_char = '┊'
+
+" Autoresize
+let g:lens#disabled = 1
+let g:lens#disabled_filetypes = ['nerdtree', 'tagbar', 'clap_input', 'startify', 'diff', 'gundo']
+let g:lens#width_resize_min = 10
+let g:lens#height_resize_min = 10
+let g:lens#width_resize_max = 90
+
+" Highligh whitespace
+let g:extra_whitespace_ignored_filetypes = ['help', 'nerdtree', 'tagbar', 'startify', 'vim-plug', 'clap_input', 'GV', 'taskedit']
+
+" Brackets
+let g:rainbow_active = 1
+let g:rainbow_conf = {
+ \ 'guifgs': ['red', 'yellow', 'lightgreen', 'lightblue'],
+ \ 'separately': { 'nerdtree': 0, 'vimwiki': 0, 'sparql': 0 }
+ \ }
+
+" Tagbar
+let g:tagbar_sort = 0
+let g:tagbar_show_line_numbers = 1
+let g:tagbar_width = 60
+let g:tagbar_autofocus = 1
+
+let g:vista_sidebar_width = 60
+
+let g:startify_custom_header = [
+ \ ' ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――',
+ \ ' _____ __ __ ____ ____ ',
+ \ ' / ___/____ ______/ /_/ |/ (_)___ __ _______/ __ \____ ___ ',
+ \ ' \__ \/ __ `/ ___/ __/ /|_/ / / __ \/ / / / ___/ / / / __ \/ _ \ ',
+ \ ' ___/ / /_/ / / / /_/ / / / / / / / /_/ (__ ) /_/ / / / / __/ ',
+ \ ' /____/\__, /_/ \__/_/ /_/_/_/ /_/\__,_/____/\____/_/ /_/\___/ ',
+ \ ' /_/ ',
+ \ ' ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――',
+ \ ' Conquering the darkest places ',
+ \ ]
+
+" }}}
diff --git a/.config/nvim/my-snippets/UltiSnips/beamer.snippets b/.config/nvim/my-snippets/UltiSnips/beamer.snippets
new file mode 100644
index 0000000..ed7d48f
--- /dev/null
+++ b/.config/nvim/my-snippets/UltiSnips/beamer.snippets
@@ -0,0 +1 @@
+priority -50
diff --git a/.config/nvim/my-snippets/UltiSnips/eltech.snippets b/.config/nvim/my-snippets/UltiSnips/eltech.snippets
new file mode 100644
index 0000000..e0e775c
--- /dev/null
+++ b/.config/nvim/my-snippets/UltiSnips/eltech.snippets
@@ -0,0 +1,119 @@
+priority -50
+
+global !p
+
+import glob
+
+PRIORITIES = {
+ 'generalPreamble': 0,
+ 'Locale': 1,
+ 'BibTex': 2,
+}
+
+def get_styles(folder):
+ styles = [file[:-4] for file in glob.glob(f'{folder}/*.sty')]
+ priorities = [1] * len(styles)
+ for i, filename in enumerate(styles):
+ for name, priority in PRIORITIES.items():
+ if name in filename:
+ priorities[i] = priority
+ if styles:
+ priorities, styles = zip(*sorted(zip(priorities, styles)))
+ return styles
+
+def try_get_styles(folders):
+ for folder in folders:
+ styles = get_styles(folder)
+ if len(styles) > 0:
+ return styles
+
+endglobal
+
+snippet defdoc "Default document template"
+\documentclass[a4paper, 14pt]{extarticle}
+`!p
+res = ""
+for style in try_get_styles(["./styles", '.', '..', '../styles']):
+ res += "\\usepackage{" + style + "}\n"
+snip.rv = res
+`
+
+\begin{document}
+$0
+\end{document}
+endsnippet
+
+snippet defrep "Default small report template"
+\documentclass[a4paper, 14pt]{extarticle}
+`!p
+res = ""
+for style in get_styles("./styles"):
+ res += "\\usepackage{" + style + "}\n"
+snip.rv = res
+`
+
+\title{$1}
+\author{${2:Корытов Павел, 6304 \\\\ СПбГЭТУ \enquote{ЛЭТИ}}}
+\date{${3:\today}}
+\begin{document}
+\maketitle
+$0
+\end{document}
+endsnippet
+
+snippet etutitle "ETU default report title"
+\begin{titlepage}
+ \centering
+ {\bfseries
+ \uppercase{
+ Минобрнауки России \\\\
+ Санкт-Петербургский государственный \\\\
+ Электротехнический университет \\\\
+ \enquote{ЛЭТИ} им. В.И.Ульянова (Ленина)\\\\
+ }
+ Кафедра ${1:МО ЭВМ}
+
+ \vspace{\fill}
+ \uppercase{${2:Отчёт}} \\\\
+ по ${3:лабораторной работе} ${4:№1} \\\\
+ по дисциплине \enquote{$5} \\\\
+ Тема: $6
+ }
+
+ \vspace{\fill}
+ \begin{tabularx}{0.8\textwidth}{l X c r}
+ Студент гр. 6304 & & \underline{\hspace{3cm}} & Корытов П.В.\\\\
+ Преподаватель & & \underline{\hspace{3cm}} & $7
+ \end{tabularx}
+
+ \vspace{1cm}
+ Санкт-Петербург \\\\
+ \the\year{}
+\end{titlepage}
+
+$0
+endsnippet
+
+snippet fhdr "My default fancy header"
+\usepackage{fancyhdr}
+\pagestyle{fancy}
+
+\newcommand{\theversion}{${1:1.0}}
+
+\fancyhead[L]{
+ \begin{tabular}{ll}
+ \textit{${2:Project}} \\\\
+ ${3:Документ}
+ \end{tabular}
+}
+
+\fancyhead[R]{
+ \begin{tabular}{ll}
+ Версия: & \theversion{} \\\\
+ Дата: & \today{}
+ \end{tabular}
+}
+
+endsnippet
+
+# vim:ft=snippets:
diff --git a/.config/nvim/my-snippets/UltiSnips/python.snippets b/.config/nvim/my-snippets/UltiSnips/python.snippets
new file mode 100644
index 0000000..3fafd8a
--- /dev/null
+++ b/.config/nvim/my-snippets/UltiSnips/python.snippets
@@ -0,0 +1,12 @@
+snippet qinit "def __init__(self, parent=None)"
+def __init__(self, parent=None):
+ super().__init__(parent)
+ $0
+
+endsnippet
+
+
+snippet forl "[action for item in iterable]"
+[$1 for $2 in $3]
+$0
+endsnippet
diff --git a/.config/nvim/my-snippets/UltiSnips/tex.snippets b/.config/nvim/my-snippets/UltiSnips/tex.snippets
new file mode 100644
index 0000000..bca40a3
--- /dev/null
+++ b/.config/nvim/my-snippets/UltiSnips/tex.snippets
@@ -0,0 +1,194 @@
+priority 50
+
+extends eltech
+
+global !p
+import os
+
+def get_last_image():
+ max_time = 0
+ last_image = ''
+ for r, d, files in os.walk(os.path.join(os.getcwd(), 'img')):
+ for f in files:
+ time = os.path.getmtime(os.path.join(r, f))
+ if time > max_time:
+ max_time = time
+ last_image = os.path.relpath(os.path.join(r, f))
+ return last_image
+
+endglobal
+
+snippet 'sympy(.*)sympy' "evaluate sympy" wr
+`!p
+from sympy import *
+x, y, z, t, i = symbols('x y z t i')
+k, m, n = symbols('k m n', integer=True)
+f, g, h = symbols('f g h', cls=Function)
+init_printing()
+snip.rv = eval('latex(' + match.group(1).replace('\\', '') \
+ .replace('^', '**') \
+ .replace('{', '(') \
+ .replace('}', ')') + ')')
+`
+endsnippet
+
+snippet lfigp "last figure path"
+`!p
+snip.rv = get_last_image()
+`
+endsnippet
+
+snippet lfig
+\begin{figure}[h]
+ \centering
+ \includegraphics[width=$1\textwidth]{`!p snip.rv = get_last_image()`}
+ \caption{$2}%
+ \label{img:$3}
+\end{figure}
+
+$0
+endsnippet
+
+snippet ' -' "---" wr
+ --- $0
+endsnippet
+
+snippet vec "vector sign"
+\vec{$1} $0
+endsnippet
+
+snippet suml "\sum\limits"
+\sum\limits^{${1:n}}_{${2:i=1}} $0
+endsnippet
+
+snippet part "\partial"
+\partial $0
+endsnippet
+
+snippet vmat "\begin{pmatrix} \end{pmatrix}"
+\begin{pmatrix} $1 \end{pmatrix}$0
+endsnippet
+
+snippet dfn "\dfn{}"
+\dfn{$1} $0
+endsnippet
+
+snippet fig "Default figure here"
+\begin{figure}[h]
+ \centering
+ \includegraphics[width=$1\textwidth]{$2}
+ \caption{$3}%
+ \label{img:$4}
+\end{figure}
+
+$0
+endsnippet
+
+snippet subfig "Figure with subfigures"
+\begin{figure}[h]
+ \centering
+ \begin{subfigure}[b]{$1\textwidth}
+ \includegraphics[width=\textwidth]{$2}
+ \caption{$3}
+ \end{subfigure}%
+ \hspace{2cm}
+ \begin{subfigure}[b]{$4\textwidth}
+ \includegraphics[width=\textwidth]{$5}
+ \caption{$6}
+ \end{subfigure}
+\end{figure}
+$0
+endsnippet
+
+snippet << "Triangle brackets"
+\left\langle $1 \right\rangle $0
+endsnippet
+
+snippet lorem "\lipsum[1] %TODO"
+\lipsum[1] %TODO
+$0
+endsnippet
+
+snippet /{ "/{ /}"
+/{ $1 /} $0
+endsnippet
+
+snippet \[ "\[ \]"
+\[ $1 \] $0
+endsnippet
+
+snippet <=> "\Reftrightarrow"
+\Leftrightarrow $0
+endsnippet
+
+snippet => "\Rightarrow"
+\Rightarrow $0
+endsnippet
+
+snippet -> "\rightarrow"
+\rightarrow $0
+endsnippet
+
+snippet <= "\Leftarrow"
+\Leftarrow $0
+endsnippet
+
+snippet '(\w+)_' "_\{text}" r
+`!p snip.rv=match.group(1)`_\text{$1} $0
+endsnippet
+
+snippet '".*"' "`` ''" r
+\`\``!p snip.rv=match.group(0)[1:-1]`'' $0
+endsnippet
+
+snippet '<<.*>>' "\enquote{text}" r
+\enquote{`!p snip.rv=match.group(0)[2:-2]`} $0
+endsnippet
+
+snippet <- "\leftarrow"
+\leftarrow $0
+endsnippet
+
+snippet ... "/ldots{}"
+\ldots{} $0
+endsnippet
+
+snippet .. "/ldots"
+\ldots $0
+endsnippet
+
+snippet in "\in"
+\in $0
+endsnippet
+
+snippet a "alpha"
+\alpha $0
+endsnippet
+
+snippet A "Alpha"
+\Alpha $0
+endsnippet
+
+snippet b "beta"
+\beta $0
+endsnippet
+
+snippet d "delta"
+\delta $0
+endsnippet
+
+snippet e "varepsilon"
+\varepsilon $0
+endsnippet
+
+snippet l "lambda"
+\lambda $0
+endsnippet
+
+snippet w "omega"
+\omega $0
+endsnippet
+
+snippet S "Sigma"
+\Sigma $0
+endsnippet
diff --git a/.config/nvim/my-snippets/UltiSnips/vue.snippets b/.config/nvim/my-snippets/UltiSnips/vue.snippets
new file mode 100644
index 0000000..959500e
--- /dev/null
+++ b/.config/nvim/my-snippets/UltiSnips/vue.snippets
@@ -0,0 +1,15 @@
+snippet comp "vue component"
+
+$0
+
+
+
+
+
+endsnippet
diff --git a/.config/picom.conf b/.config/picom.conf
new file mode 100644
index 0000000..9da288a
--- /dev/null
+++ b/.config/picom.conf
@@ -0,0 +1,430 @@
+#################################
+# Shadows #
+#################################
+
+
+# Enabled client-side shadows on windows. Note desktop windows
+# (windows with '_NET_WM_WINDOW_TYPE_DESKTOP') never get shadow,
+# unless explicitly requested using the wintypes option.
+#
+# shadow = false
+shadow = true;
+
+# The blur radius for shadows, in pixels. (defaults to 12)
+# shadow-radius = 12
+shadow-radius = 2;
+
+# The opacity of shadows. (0.0 - 1.0, defaults to 0.75)
+# shadow-opacity = .75
+
+# The left offset for shadows, in pixels. (defaults to -15)
+# shadow-offset-x = -15
+shadow-offset-x = -2;
+
+# The top offset for shadows, in pixels. (defaults to -15)
+# shadow-offset-y = -15
+shadow-offset-y = -2;
+
+# Avoid drawing shadows on dock/panel windows. This option is deprecated,
+# you should use the *wintypes* option in your config file instead.
+#
+# no-dock-shadow = false
+
+# Don't draw shadows on drag-and-drop windows. This option is deprecated,
+# you should use the *wintypes* option in your config file instead.
+#
+# no-dnd-shadow = false
+
+# Red color value of shadow (0.0 - 1.0, defaults to 0).
+# shadow-red = 0
+
+# Green color value of shadow (0.0 - 1.0, defaults to 0).
+# shadow-green = 0
+
+# Blue color value of shadow (0.0 - 1.0, defaults to 0).
+# shadow-blue = 0
+
+# Do not paint shadows on shaped windows. Note shaped windows
+# here means windows setting its shape through X Shape extension.
+# Those using ARGB background is beyond our control.
+# Deprecated, use
+# shadow-exclude = 'bounding_shaped'
+# or
+# shadow-exclude = 'bounding_shaped && !rounded_corners'
+# instead.
+#
+# shadow-ignore-shaped = ''
+
+# Specify a list of conditions of windows that should have no shadow.
+#
+# examples:
+# shadow-exclude = "n:e:Notification";
+#
+# shadow-exclude = []
+shadow-exclude = [
+ "name = 'Notification'",
+ "class_g = 'Conky'",
+ "name ?= 'cpt_frame_window'",
+ "class_g ?= 'Notify-osd'",
+ "class_g = 'Cairo-clock'",
+ "_GTK_FRAME_EXTENTS@:c"
+];
+
+# Specify a X geometry that describes the region in which shadow should not
+# be painted in, such as a dock window region. Use
+# shadow-exclude-reg = "x10+0+0"
+# for example, if the 10 pixels on the bottom of the screen should not have shadows painted on.
+#
+# shadow-exclude-reg = ""
+
+# Crop shadow of a window fully on a particular Xinerama screen to the screen.
+# xinerama-shadow-crop = false
+
+
+#################################
+# Fading #
+#################################
+
+
+# Fade windows in/out when opening/closing and when opacity changes,
+# unless no-fading-openclose is used.
+# fading = false
+fading = true
+
+# Opacity change between steps while fading in. (0.01 - 1.0, defaults to 0.028)
+# fade-in-step = 0.028
+fade-in-step = 0.03;
+
+# Opacity change between steps while fading out. (0.01 - 1.0, defaults to 0.03)
+# fade-out-step = 0.03
+fade-out-step = 0.03;
+
+# The time between steps in fade step, in milliseconds. (> 0, defaults to 10)
+# fade-delta = 10
+
+# Specify a list of conditions of windows that should not be faded.
+# fade-exclude = []
+
+# Do not fade on window open/close.
+# no-fading-openclose = false
+
+# Do not fade destroyed ARGB windows with WM frame. Workaround of bugs in Openbox, Fluxbox, etc.
+# no-fading-destroyed-argb = false
+
+
+#################################
+# Transparency / Opacity #
+#################################
+
+
+# Opacity of inactive windows. (0.1 - 1.0, defaults to 1.0)
+# inactive-opacity = 1
+inactive-opacity = 1;
+
+# Opacity of window titlebars and borders. (0.1 - 1.0, disabled by default)
+# frame-opacity = 1.0
+frame-opacity = 1.0;
+
+# Default opacity for dropdown menus and popup menus. (0.0 - 1.0, defaults to 1.0)
+# menu-opacity = 1.0
+
+# Let inactive opacity set by -i override the '_NET_WM_OPACITY' values of windows.
+# inactive-opacity-override = true
+inactive-opacity-override = false;
+
+# Default opacity for active windows. (0.0 - 1.0, defaults to 1.0)
+# active-opacity = 1.0
+
+# Dim inactive windows. (0.0 - 1.0, defaults to 0.0)
+# inactive-dim = 0.0
+
+# Specify a list of conditions of windows that should always be considered focused.
+# focus-exclude = []
+focus-exclude = [ "class_g = 'Cairo-clock'" ];
+
+# Use fixed inactive dim value, instead of adjusting according to window opacity.
+# inactive-dim-fixed = 1.0
+
+# Specify a list of opacity rules, in the format `PERCENT:PATTERN`,
+# like `50:name *= "Firefox"`. picom-trans is recommended over this.
+# Note we don't make any guarantee about possible conflicts with other
+# programs that set '_NET_WM_WINDOW_OPACITY' on frame or client windows.
+# example:
+# opacity-rule = [ "80:class_g = 'URxvt'" ];
+#
+
+opacity-rule = [
+ "0:_NET_WM_STATE@[0]:32a = '_NET_WM_STATE_HIDDEN'",
+ "0:_NET_WM_STATE@[1]:32a = '_NET_WM_STATE_HIDDEN'",
+ "0:_NET_WM_STATE@[2]:32a = '_NET_WM_STATE_HIDDEN'",
+ "0:_NET_WM_STATE@[3]:32a = '_NET_WM_STATE_HIDDEN'",
+ "0:_NET_WM_STATE@[4]:32a = '_NET_WM_STATE_HIDDEN'"
+];
+
+#################################
+# Background-Blurring #
+#################################
+
+
+# Parameters for background blurring, see the *BLUR* section for more information.
+# blur-method =
+# blur-size = 12
+#
+# blur-deviation = false
+
+# Blur background of semi-transparent / ARGB windows.
+# Bad in performance, with driver-dependent behavior.
+# The name of the switch may change without prior notifications.
+#
+# blur-background = false
+
+# Blur background of windows when the window frame is not opaque.
+# Implies:
+# blur-background
+# Bad in performance, with driver-dependent behavior. The name may change.
+#
+# blur-background-frame = false
+
+
+# Use fixed blur strength rather than adjusting according to window opacity.
+# blur-background-fixed = false
+
+
+# Specify the blur convolution kernel, with the following format:
+# example:
+# blur-kern = "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1";
+#
+# blur-kern = ''
+blur-kern = "3x3box";
+
+
+# Exclude conditions for background blur.
+# blur-background-exclude = []
+blur-background-exclude = [
+ "window_type = 'dock'",
+ "window_type = 'desktop'",
+ "_GTK_FRAME_EXTENTS@:c"
+];
+
+#################################
+# General Settings #
+#################################
+
+# Daemonize process. Fork to background after initialization. Causes issues with certain (badly-written) drivers.
+# daemon = false
+
+# Specify the backend to use: `xrender`, `glx`, or `xr_glx_hybrid`.
+# `xrender` is the default one.
+#
+# backend = 'glx'
+backend = "xrender";
+
+# Enable/disable VSync.
+# vsync = false
+vsync = true
+
+# Enable remote control via D-Bus. See the *D-BUS API* section below for more details.
+# dbus = false
+
+# Try to detect WM windows (a non-override-redirect window with no
+# child that has 'WM_STATE') and mark them as active.
+#
+# mark-wmwin-focused = false
+mark-wmwin-focused = true;
+
+# Mark override-redirect windows that doesn't have a child window with 'WM_STATE' focused.
+# mark-ovredir-focused = false
+mark-ovredir-focused = true;
+
+# Try to detect windows with rounded corners and don't consider them
+# shaped windows. The accuracy is not very high, unfortunately.
+#
+# detect-rounded-corners = false
+detect-rounded-corners = true;
+
+# Detect '_NET_WM_OPACITY' on client windows, useful for window managers
+# not passing '_NET_WM_OPACITY' of client windows to frame windows.
+#
+# detect-client-opacity = false
+detect-client-opacity = true;
+
+# Specify refresh rate of the screen. If not specified or 0, picom will
+# try detecting this with X RandR extension.
+#
+# refresh-rate = 60
+refresh-rate = 0
+
+# Limit picom to repaint at most once every 1 / 'refresh_rate' second to
+# boost performance. This should not be used with
+# vsync drm/opengl/opengl-oml
+# as they essentially does sw-opti's job already,
+# unless you wish to specify a lower refresh rate than the actual value.
+#
+# sw-opti =
+
+# Use EWMH '_NET_ACTIVE_WINDOW' to determine currently focused window,
+# rather than listening to 'FocusIn'/'FocusOut' event. Might have more accuracy,
+# provided that the WM supports it.
+#
+# use-ewmh-active-win = false
+
+# Unredirect all windows if a full-screen opaque window is detected,
+# to maximize performance for full-screen windows. Known to cause flickering
+# when redirecting/unredirecting windows.
+#
+# unredir-if-possible = false
+
+# Delay before unredirecting the window, in milliseconds. Defaults to 0.
+# unredir-if-possible-delay = 0
+
+# Conditions of windows that shouldn't be considered full-screen for unredirecting screen.
+# unredir-if-possible-exclude = []
+
+# Use 'WM_TRANSIENT_FOR' to group windows, and consider windows
+# in the same group focused at the same time.
+#
+# detect-transient = false
+detect-transient = true
+
+# Use 'WM_CLIENT_LEADER' to group windows, and consider windows in the same
+# group focused at the same time. 'WM_TRANSIENT_FOR' has higher priority if
+# detect-transient is enabled, too.
+#
+# detect-client-leader = false
+detect-client-leader = true
+
+# Resize damaged region by a specific number of pixels.
+# A positive value enlarges it while a negative one shrinks it.
+# If the value is positive, those additional pixels will not be actually painted
+# to screen, only used in blur calculation, and such. (Due to technical limitations,
+# with use-damage, those pixels will still be incorrectly painted to screen.)
+# Primarily used to fix the line corruption issues of blur,
+# in which case you should use the blur radius value here
+# (e.g. with a 3x3 kernel, you should use `--resize-damage 1`,
+# with a 5x5 one you use `--resize-damage 2`, and so on).
+# May or may not work with *--glx-no-stencil*. Shrinking doesn't function correctly.
+#
+# resize-damage = 1
+
+# Specify a list of conditions of windows that should be painted with inverted color.
+# Resource-hogging, and is not well tested.
+#
+# invert-color-include = []
+
+# GLX backend: Avoid using stencil buffer, useful if you don't have a stencil buffer.
+# Might cause incorrect opacity when rendering transparent content (but never
+# practically happened) and may not work with blur-background.
+# My tests show a 15% performance boost. Recommended.
+#
+# glx-no-stencil = false
+
+# GLX backend: Avoid rebinding pixmap on window damage.
+# Probably could improve performance on rapid window content changes,
+# but is known to break things on some drivers (LLVMpipe, xf86-video-intel, etc.).
+# Recommended if it works.
+#
+# glx-no-rebind-pixmap = false
+
+# Disable the use of damage information.
+# This cause the whole screen to be redrawn everytime, instead of the part of the screen
+# has actually changed. Potentially degrades the performance, but might fix some artifacts.
+# The opposing option is use-damage
+#
+# no-use-damage = false
+use-damage = true
+
+# Use X Sync fence to sync clients' draw calls, to make sure all draw
+# calls are finished before picom starts drawing. Needed on nvidia-drivers
+# with GLX backend for some users.
+#
+# xrender-sync-fence = false
+
+# GLX backend: Use specified GLSL fragment shader for rendering window contents.
+# See `compton-default-fshader-win.glsl` and `compton-fake-transparency-fshader-win.glsl`
+# in the source tree for examples.
+#
+# glx-fshader-win = ''
+
+# Force all windows to be painted with blending. Useful if you
+# have a glx-fshader-win that could turn opaque pixels transparent.
+#
+# force-win-blend = false
+
+# Do not use EWMH to detect fullscreen windows.
+# Reverts to checking if a window is fullscreen based only on its size and coordinates.
+#
+# no-ewmh-fullscreen = false
+
+# Dimming bright windows so their brightness doesn't exceed this set value.
+# Brightness of a window is estimated by averaging all pixels in the window,
+# so this could comes with a performance hit.
+# Setting this to 1.0 disables this behaviour. Requires --use-damage to be disabled. (default: 1.0)
+#
+# max-brightness = 1.0
+
+# Make transparent windows clip other windows like non-transparent windows do,
+# instead of blending on top of them.
+#
+# transparent-clipping = false
+
+# Set the log level. Possible values are:
+# "trace", "debug", "info", "warn", "error"
+# in increasing level of importance. Case doesn't matter.
+# If using the "TRACE" log level, it's better to log into a file
+# using *--log-file*, since it can generate a huge stream of logs.
+#
+# log-level = "debug"
+log-level = "warn";
+
+# Set the log file.
+# If *--log-file* is never specified, logs will be written to stderr.
+# Otherwise, logs will to written to the given file, though some of the early
+# logs might still be written to the stderr.
+# When setting this option from the config file, it is recommended to use an absolute path.
+#
+# log-file = '/path/to/your/log/file'
+
+# Show all X errors (for debugging)
+# show-all-xerrors = false
+
+# Write process ID to a file.
+# write-pid-path = '/path/to/your/log/file'
+
+# Window type settings
+#
+# 'WINDOW_TYPE' is one of the 15 window types defined in EWMH standard:
+# "unknown", "desktop", "dock", "toolbar", "menu", "utility",
+# "splash", "dialog", "normal", "dropdown_menu", "popup_menu",
+# "tooltip", "notification", "combo", and "dnd".
+#
+# Following per window-type options are available: ::
+#
+# fade, shadow:::
+# Controls window-type-specific shadow and fade settings.
+#
+# opacity:::
+# Controls default opacity of the window type.
+#
+# focus:::
+# Controls whether the window of this type is to be always considered focused.
+# (By default, all window types except "normal" and "dialog" has this on.)
+#
+# full-shadow:::
+# Controls whether shadow is drawn under the parts of the window that you
+# normally won't be able to see. Useful when the window has parts of it
+# transparent, and you want shadows in those areas.
+#
+# redir-ignore:::
+# Controls whether this type of windows should cause screen to become
+# redirected again after been unredirected. If you have unredir-if-possible
+# set, and doesn't want certain window to cause unnecessary screen redirection,
+# you can set this to `true`.
+#
+wintypes:
+{
+ tooltip = { fade = true; shadow = true; opacity = 0.75; focus = true; full-shadow = false; };
+ dock = { shadow = false; }
+ dnd = { shadow = false; }
+ popup_menu = { opacity = 1; }
+ dropdown_menu = { opacity = 1; }
+};
diff --git a/.config/polybar/config b/.config/polybar/config
new file mode 100644
index 0000000..488ef33
--- /dev/null
+++ b/.config/polybar/config
@@ -0,0 +1,287 @@
+[colors]
+; Palenight colorscheme https://github.com/JonathanSpeek/palenight-iterm2
+black = #292d3e
+red = #f07178
+green = #c3e88d
+yellow = #ffcb6b
+blue = #82aaff
+magenta = #c792ea
+cyan = #89ddff
+white = #d0d0d0
+
+black-lighter = #434758
+red-lighter = #ff8b92
+green-lighter = #ddffa7
+yellow-lighter = #ffe585
+blue-lighter = #9cc4ff
+magenta-lighter = #9cc4ff
+cyan-lighter = #9cc4ff
+white-lighter = ffffff
+
+background = ${colors.black}
+; background = #ee292d3e
+foreground = ${colors.white}
+
+[bar/mybar]
+monitor = ${env:MONITOR:}
+width = 100%
+height = ${env:HEIGHT:27}
+offset-x = 0
+offset-y = 0
+radius = 0.0
+fixed-center = false
+bottom=true
+
+background = ${colors.background}
+foreground = ${colors.foreground}
+
+line-size = 3
+line-color = #f00
+
+padding-left = 0
+padding-right = 0
+
+module-margin-left = 1
+module-margin-right = 1
+
+font-0 = ${env:FONT0:pango:monospace:size=10;1}
+font-1 = ${env:FONT1:NotoEmoji:scale=10:antialias=false;0}
+font-2 = ${env:FONT2:fontawesome:pixelsize=10;1}
+font-3 = ${env:FONT3:JetBrains Mono Nerd Font:monospace:size=10;1}
+
+modules-left = i3
+; modules-center = test
+modules-right = ${env:RIGHT_BLOCKS}
+
+tray-position = ${env:TRAY:right}
+tray-padding = 0
+tray-maxsize = 16
+;tray-background = #0063ff
+
+wm-restack = i3
+; override-redirect = true
+
+scroll-up = i3wm-wsnext
+scroll-down = i3wm-wsprev
+
+; cursor-click = pointer
+; cursor-scroll = ns-resize
+
+[module/test]
+type = custom/script
+exec = echo "%{u#0000ff}%{+u} hello %{u-}"
+
+[module/ipstack]
+type = custom/script
+exec = /home/pavel/bin/polybar/ipstack.sh
+interval = 1200
+
+[module/ipstack-vpn]
+type = custom/script
+exec = /home/pavel/bin/polybar/ipstack-vpn.sh
+interval = 1200
+
+[module/aw-afk]
+type = custom/script
+exec = /home/pavel/bin/polybar/aw_afk.sh
+interval = 60
+
+[module/sun]
+type = custom/script
+exec = /home/pavel/bin/polybar/sun.sh
+interval = 60
+
+[module/SEP]
+type = custom/text
+content = "|"
+content-foreground = ${colors.magenta}
+content-padding = 0
+content-margin = 0
+
+[module/TSEP]
+type = custom/script
+exec = /home/pavel/bin/polybar/tray-sep.sh
+format-foreground = ${colors.magenta}
+interval = 0
+
+[module/i3]
+type = internal/i3
+format =
+index-sort = true
+wrapping-scroll = false
+
+; Only show workspaces on the same output as the bar
+pin-workspaces = true
+
+label-mode-padding = 1
+label-mode-foreground = #000
+label-mode-background = ${colors.blue}
+
+; focused = Active workspace on focused monitor
+label-focused = %name%
+label-focused-background = ${colors.background}
+label-focused-underline= ${colors.blue}
+label-focused-padding = 1
+
+; unfocused = Inactive workspace on any monitor
+label-unfocused = %name%
+label-unfocused-padding = 1
+
+; visible = Active workspace on unfocused monitor
+label-visible = %name%
+label-visible-background = ${self.label-focused-background}
+label-visible-underline = ${self.label-focused-underline}
+label-visible-padding = ${self.label-focused-padding}
+
+; urgent = Workspace with urgency hint set
+label-urgent = %name%
+label-urgent-background = ${colors.red}
+label-urgent-foreground = ${colors.black}
+label-urgent-padding = 1
+
+; Separator in between workspaces
+; label-separator = |
+
+[module/xkeyboard]
+type = internal/xkeyboard
+format =
+
+format-underline = ${colors.magenta}
+label-layout = %icon%
+layout-icon-0 = ru;RU
+layout-icon-1 = us;US
+
+[module/mpd]
+type = internal/mpd
+
+format-playing =