diff --git a/src/.bashrc b/src/.bashrc new file mode 100644 index 0000000..ad7153d --- /dev/null +++ b/src/.bashrc @@ -0,0 +1,109 @@ +# Check Interactive +[[ $- != *i* ]] && return + +colors() { + local fgc bgc vals seq0 + + printf "Color escapes are %s\n" '\e[${value};...;${value}m' + printf "Values 30..37 are \e[33mforeground colors\e[m\n" + printf "Values 40..47 are \e[43mbackground colors\e[m\n" + printf "Value 1 gives a \e[1mbold-faced look\e[m\n\n" + + # foreground colors + for fgc in {30..37}; do + # background colors + for bgc in {40..47}; do + fgc=${fgc#37} # white + bgc=${bgc#40} # black + + vals="${fgc:+$fgc;}${bgc}" + vals=${vals%%;} + + seq0="${vals:+\e[${vals}m}" + printf " %-9s" "${seq0:-(default)}" + printf " ${seq0}TEXT\e[m" + printf " \e[${vals:+${vals+$vals;}}1mBOLD\e[m" + done + echo; echo + done +} +[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion +use_color=true + +# Fallback Prompt +# =============== +# 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 + 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 +xhost +local:root > /dev/null 2>&1 +complete -cf sudo + +# Starship bash prompt +# ==================== +# Install using -> curl -fsSL https://starship.rs/install.sh | bash +# To use as prompt -> eval "$(starship init bash)" +eval "$(starship init bash 2>/dev/null)" + +# Set shell options +# ================= +shopt -s checkwinsize +shopt -s expand_aliases +shopt -s histappend # Enable history appending instead of overwriting. + +# SUSPEND CTRL + S +stty -ixon + +# Other Aliases +alias cp="cp -i" # confirm before overwriting something +alias df='df -h' # human-readable sizes +alias free='free -m' # show sizes in MB +alias np='nano -w PKGBUILD' +alias more=less +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' + +# switch between shells +alias tobash="sudo chsh $USER -s /bin/bash && echo 'Now log out.'" +alias tozsh="sudo chsh $USER -s /bin/zsh && echo 'Now log out.'" +alias tofish="sudo chsh $USER -s /bin/fish && echo 'Now log out.'" diff --git a/src/.config/awesome/README.md b/src/.config/awesome/README.md new file mode 100644 index 0000000..248aa0e --- /dev/null +++ b/src/.config/awesome/README.md @@ -0,0 +1,4 @@ +## Awesome WM Config + + +![](Demo.png) diff --git a/src/.config/awesome/configuration/apps.lua b/src/.config/awesome/configuration/apps.lua new file mode 100644 index 0000000..fd51585 --- /dev/null +++ b/src/.config/awesome/configuration/apps.lua @@ -0,0 +1,38 @@ +local filesystem = require('gears.filesystem') +local beautiful = require('beautiful') + +-- Thanks to jo148 on github for making rofi dpi aware! +local with_dpi = require('beautiful').xresources.apply_dpi +local get_dpi = require('beautiful').xresources.get_dpi +local rofi_command = 'env /usr/bin/rofi -dpi ' .. get_dpi() .. ' -width ' .. with_dpi(100) .. + ' -show drun -display-drun -theme ' .. filesystem.get_configuration_dir() .. + '/configuration/rofi.rasi -icon-theme ' .. beautiful.icon_theme .. + ' -run-command "/bin/bash -c -i \'shopt -s expand_aliases; {cmd}\'"' + +return { + -- List of apps to start by default on some actions + default = { + terminal = 'kitty', + rofi = rofi_command, + lock = 'i3lock-fancy', + quake = 'kitty', + power_command = '~/.config/awesome/configuration/utils/rofi-power', + screenshot = '~/.config/awesome/configuration/utils/screenshot -m', + region_screenshot = '~/.config/awesome/configuration/utils/screenshot -r', + delayed_screenshot = '~/.config/awesome/configuration/utils/screenshot --delayed -r', + browser = 'env firefox', + editor = 'gvim', + social = 'env discord', + files = 'nautilus', + power_manager = 'gnome-power-statistics' + }, + -- List of apps to start once on start-up + run_on_start_up = {'~/.config/awesome/configuration/awspawn', + 'compton --config ' .. filesystem.get_configuration_dir() .. '/configuration/compton.conf', + 'nm-applet --indicator', 'ibus-daemon --xim --daemonize', 'scream-start', 'numlockx on', + '/usr/lib/xfce-polkit/xfce-polkit & eval $(gnome-keyring-daemon -s --components=pkcs11,secrets,ssh,gpg)', -- credential manager + 'blueman-tray', + 'xinput set-prop "ETPS/2 Elantech Touchpad" "libinput Natural Scrolling Enabled" 1', + 'xinput set-prop "ETPS/2 Elantech Touchpad" "libinput Tapping Enabled" 1'} +} + diff --git a/src/.config/awesome/configuration/awspawn b/src/.config/awesome/configuration/awspawn new file mode 100755 index 0000000..be2130f --- /dev/null +++ b/src/.config/awesome/configuration/awspawn @@ -0,0 +1,53 @@ +#!/bin/bash +## This configuration file is meant for applications that +# still run in the background when a reload is triggered +# for awesome, this script just kills the running instance +# and starts a new one. +# Only add applications/scripts without parameters here +# (if you want to apply parameters then use a script file!) + +# List of applications to run +# the script $HOME/.config/awesomestart +# is intended to be a copy of this file +# to allow out of tree autostart programs +APPS=( + # keepassxc + # kdeconnect-indicator + radeon-profile + $HOME/.config/awesomestart + ) +# Some applications start child applications that need to be killed on reload +KILL=( + synergyc + nextcloud + ) +# Some applications need to be started without GUI +SILENT=( + gnome-clocks + ) + +#Kill the polkit +killall xfce-polkit + +# First kill lingering apps +for app in "${APPS[@]}" +do + kill -9 $(pidof $app) +done +for app in "${KILL[@]}" +do + kill -9 $(pidof $app) +done + +# Start new instances +for app in "${APPS[@]}" +do + env $app ${@:2} & +done + +# Run silent apps +Xvfb :99 & +for silentapp in "${SILENT[@]}" +do + DISPLAY=:99 $silentapp & +done diff --git a/src/.config/awesome/configuration/client/buttons.lua b/src/.config/awesome/configuration/client/buttons.lua new file mode 100644 index 0000000..2ac6111 --- /dev/null +++ b/src/.config/awesome/configuration/client/buttons.lua @@ -0,0 +1,13 @@ +local awful = require('awful') + +local modkey = require('configuration.keys.mod').modKey + +return awful.util.table.join(awful.button({}, 1, function(c) + _G.client.focus = c + c:raise() +end), awful.button({modkey}, 1, awful.mouse.client.move), awful.button({modkey}, 3, awful.mouse.client.resize), + awful.button({modkey}, 4, function() + awful.layout.inc(1) + end), awful.button({modkey}, 5, function() + awful.layout.inc(-1) + end)) diff --git a/src/.config/awesome/configuration/client/init.lua b/src/.config/awesome/configuration/client/init.lua new file mode 100644 index 0000000..bbd5480 --- /dev/null +++ b/src/.config/awesome/configuration/client/init.lua @@ -0,0 +1 @@ +require('configuration.client.rules') diff --git a/src/.config/awesome/configuration/client/keys.lua b/src/.config/awesome/configuration/client/keys.lua new file mode 100644 index 0000000..410b01e --- /dev/null +++ b/src/.config/awesome/configuration/client/keys.lua @@ -0,0 +1,24 @@ +local awful = require('awful') +require('awful.autofocus') +local modkey = require('configuration.keys.mod').modKey +local altkey = require('configuration.keys.mod').altKey + +local clientKeys = awful.util.table.join(awful.key({modkey}, 'f', function(c) + c.fullscreen = not c.fullscreen + c:raise() +end, { + description = 'toggle fullscreen', + group = 'client' +}), awful.key({modkey, 'Shift'}, 'q', function(c) + c:kill() +end, { + description = 'close', + group = 'client' +}), awful.key({modkey, 'Shift'}, 'c', function(c) + c:kill() +end, { + description = 'close', + group = 'client' +})) + +return clientKeys diff --git a/src/.config/awesome/configuration/client/rules.lua b/src/.config/awesome/configuration/client/rules.lua new file mode 100644 index 0000000..d09de97 --- /dev/null +++ b/src/.config/awesome/configuration/client/rules.lua @@ -0,0 +1,81 @@ +local awful = require('awful') +local gears = require('gears') +local client_keys = require('configuration.client.keys') +local client_buttons = require('configuration.client.buttons') + +-- Rules +awful.rules.rules = {{ + rule = {}, + properties = { + focus = awful.client.focus.filter, + raise = true, + keys = client_keys, + buttons = client_buttons, + screen = awful.screen.preferred, + placement = awful.placement.no_offscreen, + floating = false, + maximized = false, + above = false, + below = false, + ontop = false, + sticky = false, + maximized_horizontal = false, + maximized_vertical = false + } +}, { + rule_any = { + instance = {"QuakeTerminal"} + }, + properties = { + skip_decoration = true + } +}, { + rule_any = { + type = {'dialog'}, + class = {'Wicd-client.py', 'calendar.google.com'} + }, + properties = { + placement = awful.placement.centered, + ontop = true, + floating = true, + drawBackdrop = true, + shape = function() + return function(cr, w, h) + gears.shape.rounded_rect(cr, w, h, 8) + end + end, + skip_decoration = true + } +}, { + rule_any = { + type = {'modal'} + }, + properties = { + titlebars_enabled = true, + floating = true, + above = true, + skip_decoration = true, + placement = awful.placement.centered + } +}, { + rule_any = { + type = {'utility'} + }, + properties = { + titlebars_enabled = false, + floating = true, + skip_decoration = true, + placement = awful.placement.centered + } +}, { + rule_any = { + type = {'splash'}, + name = {'Discord Updater'} + }, + properties = { + floating = true, + above = true, + skip_decoration = true, + placement = awful.placement.centered + } +}} diff --git a/src/.config/awesome/configuration/compton.conf b/src/.config/awesome/configuration/compton.conf new file mode 100644 index 0000000..d292acc --- /dev/null +++ b/src/.config/awesome/configuration/compton.conf @@ -0,0 +1,102 @@ +# corner-radius = 8.0; +# round-borders = 1; + +# Shadow +shadow = true; +no-dnd-shadow = false; +no-dock-shadow = false; +shadow-radius = 15.0; +shadow-offset-x = -11; +shadow-offset-y = -4.5; +shadow-opacity = 0.16; +# shadow-red = 0.0; +# shadow-green = 0.0; +# shadow-blue = 0.0; +shadow-exclude = [ + "name = 'Notification'", + "class_g = 'Conky'", + "class_g = 'slop'", + "class_g = 'Rofi'", + "class_g ?= 'Notify-osd'", + "class_g = 'Cairo-clock'", + "_GTK_FRAME_EXTENTS@:c" +]; +#"window_type = 'splash'" +# shadow-exclude = "n:e:Notification"; +# shadow-exclude-reg = "x10+0+0"; +# xinerama-shadow-crop = true; + +# Opacity +menu-opacity = 1.0; +inactive-opacity = 1.0; +active-opacity = 1.0; +frame-opacity = 1.0; +inactive-opacity-override = false; +alpha-step = 0.06; +# inactive-dim = 0.2; +# inactive-dim-fixed = true; +blur-background = true; +blur-background-frame = true; +blur-method = "kawase"; +blur-strength = 10; +blur-background-fixed = true; +blur-background-exclude = [ + "window_type = 'dock'", + "window_type = 'desktop'", + "class_g = 'slop'", + "_GTK_FRAME_EXTENTS@:c" +]; + +# Fading +fading = true; +fade-delta = 4; +fade-in-step = 0.04; +fade-out-step = 0.04; +no-fading-openclose = false; +# no-fading-destroyed-argb = true; +fade-exclude = [ ]; + +# Other +backend = "glx"; +mark-wmwin-focused = true; +mark-ovredir-focused = true; +# use-ewmh-active-win = true; +detect-rounded-corners = true; +detect-client-opacity = true; +#refresh-rate = 0; +#vsync = "none"; +dbe = false; +# sw-opti = true; +#unredir-if-possible = true; +# unredir-if-possible-delay = 5000; +# unredir-if-possible-exclude = [ ]; +focus-exclude = [ "class_g = 'Cairo-clock'" ]; +detect-transient = true; +detect-client-leader = true; +invert-color-include = [ ]; +# resize-damage = 1; + +# GLX backend +vsync="opengl-swc"; +unredir-if-possible=true; +#paint-on-overlay=true; +#glx-no-stencil=true; +glx-copy-from-front=false; +# glx-no-stencil = true; +# glx-copy-from-front = false; +# glx-use-copysubbuffermesa = true; +glx-no-rebind-pixmap = true; +#glx-swap-method = "exchange"; +#glx-use-gpushader4 = true; +# xrender-sync = true; +# xrender-sync-fence = true; + +# Window type settings +wintypes: +{ + tooltip = { + fade = true; + shadow = true; + focus = true; + }; +}; diff --git a/src/.config/awesome/configuration/init.lua b/src/.config/awesome/configuration/init.lua new file mode 100644 index 0000000..8ea676f --- /dev/null +++ b/src/.config/awesome/configuration/init.lua @@ -0,0 +1,4 @@ +return { + keys = require('configuration.keys'), + apps = require('configuration.apps') +} diff --git a/src/.config/awesome/configuration/keys/global.lua b/src/.config/awesome/configuration/keys/global.lua new file mode 100644 index 0000000..2127f02 --- /dev/null +++ b/src/.config/awesome/configuration/keys/global.lua @@ -0,0 +1,375 @@ +require('awful.autofocus') +local awful = require('awful') +local beautiful = require('beautiful') +local hotkeys_popup = require('awful.hotkeys_popup').widget +local modkey = require('configuration.keys.mod').modKey +local altkey = require('configuration.keys.mod').altKey +local apps = require('configuration.apps') +local dpi = require('beautiful').xresources.apply_dpi +local theme = require('theme') + +-- Key bindings +local globalKeys = awful.util.table.join( -- Hotkeys +awful.key({modkey}, 'h', hotkeys_popup.show_help, { + description = 'show help', + group = 'awesome' +}), awful.key({modkey}, 'F1', hotkeys_popup.show_help, { + description = 'show help', + group = 'awesome' +}), -- Tag browsing +awful.key({modkey}, 'w', awful.tag.viewprev, { + description = 'view previous', + group = 'tag' +}), awful.key({modkey}, 's', awful.tag.viewnext, { + description = 'view next', + group = 'tag' +}), awful.key({altkey, 'Control'}, 'Left', awful.tag.viewprev, { + description = 'view previous', + group = 'tag' +}), awful.key({altkey, 'Control'}, 'Right', awful.tag.viewnext, { + description = 'view next', + group = 'tag' +}), awful.key({modkey}, 'Escape', awful.tag.history.restore, { + description = 'go back', + group = 'tag' +}), -- Default client focus +awful.key({modkey}, 'd', function() + awful.client.focus.byidx(1) +end, { + description = 'focus next by index', + group = 'client' +}), awful.key({modkey}, 'a', function() + awful.client.focus.byidx(-1) +end, { + description = 'focus previous by index', + group = 'client' +}), awful.key({modkey}, 'r', function() + _G.awesome.spawn(apps.default.rofi) +end, { + description = 'show rofi menu', + group = 'awesome' +}), awful.key({modkey}, 'd', function() + local flag = false + for _, c in ipairs(mouse.screen.selected_tag:clients()) do + if c.minimized == true then + flag = true + end + c.minimized = true + end + for _, c in ipairs(mouse.screen.selected_tag:clients()) do + if flag == true then + c.minimized = false + end + end +end, { + description = 'minimize all clients', + group = 'awesome' +}), awful.key({modkey}, 'u', awful.client.urgent.jumpto, { + description = 'jump to urgent client', + group = 'client' +}), awful.key({altkey}, 'Tab', function() + -- awful.client.focus.history.previous() + awful.client.focus.byidx(1) + if _G.client.focus then + _G.client.focus:raise() + end +end, { + description = 'switch to next window', + group = 'client' +}), awful.key({altkey, 'Shift'}, 'Tab', function() + -- awful.client.focus.history.previous() + awful.client.focus.byidx(-1) + if _G.client.focus then + _G.client.focus:raise() + end +end, { + description = 'switch to previous window', + group = 'client' +}), awful.key({modkey}, 'l', function() + awful.spawn(apps.default.lock) +end, { + description = 'lock the screen', + group = 'awesome' +}), awful.key({'Control', 'Shift'}, 'Print', function() + awful.util.spawn_with_shell(apps.default.delayed_screenshot) +end, { + description = 'mark an area and screenshot it (clipboard)', + group = 'screenshots (clipboard)' +}), awful.key({altkey}, 'Print', function() + awful.util.spawn_with_shell(apps.default.screenshot) +end, { + description = 'take a screenshot of your active monitor and copy it to clipboard', + group = 'screenshots (clipboard)' +}), awful.key({'Control'}, 'Print', function() + awful.util.spawn_with_shell(apps.default.region_screenshot) +end, { + description = 'mark an area and screenshot it to your clipboard', + group = 'screenshots (clipboard)' +}), awful.key({modkey}, 'c', function() + awful.util.spawn(apps.default.editor) +end, { + description = 'open a text/code editor', + group = 'launcher' +}), awful.key({modkey}, 'b', function() + awful.util.spawn(apps.default.browser) +end, { + description = 'open a browser', + group = 'launcher' +}), awful.key({modkey}, 't', function() + awful.util.spawn_with_shell(apps.default.terminal) +end, { + description = 'open a terminal', + group = 'launcher' +}), awful.key({modkey, 'Control'}, 'r', _G.awesome.restart, { + description = 'reload awesome', + group = 'awesome' +}), awful.key({modkey, 'Control'}, 'q', _G.awesome.quit, { + description = 'quit awesome', + group = 'awesome' +}), awful.key({modkey, 'Shift'}, 'g', function(t) + t = t or awful.screen.focused().selected_tag + local current_gap = t.gap + local new_gap + if current_gap == 0 then + new_gap = beautiful.gaps + else + new_gap = 0 + end + t.gap = new_gap +end, { + description = 'toggle gaps', + group = 'awesome' +}), awful.key({modkey, 'Shift'}, 'p', function() + awful.util.spawn_with_shell(apps.default.power_command) +end, { + description = 'end session menu', + group = 'awesome' +}), awful.key({altkey, 'Shift'}, 'Right', function() + awful.tag.incmwfact(0.05) +end, { + description = 'increase master width factor', + group = 'layout' +}), awful.key({altkey, 'Shift'}, 'Left', function() + awful.tag.incmwfact(-0.05) +end, { + description = 'decrease master width factor', + group = 'layout' +}), awful.key({altkey, 'Shift'}, 'Down', function() + awful.client.incwfact(0.05) +end, { + description = 'decrease master height factor', + group = 'layout' +}), awful.key({altkey, 'Shift'}, 'Up', function() + awful.client.incwfact(-0.05) +end, { + description = 'increase master height factor', + group = 'layout' +}), awful.key({modkey, 'Shift'}, 'Left', function() + awful.tag.incnmaster(1, nil, true) +end, { + description = 'increase the number of master clients', + group = 'layout' +}), awful.key({modkey, 'Shift'}, 'Right', function() + awful.tag.incnmaster(-1, nil, true) +end, { + description = 'decrease the number of master clients', + group = 'layout' +}), awful.key({modkey, 'Control'}, 'Left', function() + awful.tag.incncol(1, nil, true) +end, { + description = 'increase the number of columns', + group = 'layout' +}), awful.key({modkey, 'Control'}, 'Right', function() + awful.tag.incncol(-1, nil, true) +end, { + description = 'decrease the number of columns', + group = 'layout' +}), awful.key({modkey}, 'space', function() + awful.layout.inc(1) +end, { + description = 'select next layout', + group = 'layout' +}), awful.key({modkey, 'Shift'}, 'space', function() + awful.layout.inc(-1) +end, { + description = 'select previous layout', + group = 'layout' +}), awful.key({altkey, 'Shift'}, 'l', function() + awful.tag.incmwfact(0.05) +end, { + description = 'increase master width factor', + group = 'layout' +}), awful.key({altkey, 'Shift'}, 'h', function() + awful.tag.incmwfact(-0.05) +end, { + description = 'decrease master width factor', + group = 'layout' +}), awful.key({altkey, 'Shift'}, 'j', function() + awful.client.incwfact(0.05) +end, { + description = 'decrease master height factor', + group = 'layout' +}), awful.key({altkey, 'Shift'}, 'k', function() + awful.client.incwfact(-0.05) +end, { + description = 'increase master height factor', + group = 'layout' +}), awful.key({modkey, 'Shift'}, 'h', function() + awful.tag.incnmaster(1, nil, true) +end, { + description = 'increase the number of master clients', + group = 'layout' +}), awful.key({modkey, 'Shift'}, 'l', function() + awful.tag.incnmaster(-1, nil, true) +end, { + description = 'decrease the number of master clients', + group = 'layout' +}), awful.key({modkey, 'Control'}, 'h', function() + awful.tag.incncol(1, nil, true) +end, { + description = 'increase the number of columns', + group = 'layout' +}), awful.key({modkey, 'Control'}, 'l', function() + awful.tag.incncol(-1, nil, true) +end, { + description = 'decrease the number of columns', + group = 'layout' +}), awful.key({modkey, 'Control'}, 'n', function() + local c = awful.client.restore() + -- Focus restored client + if c then + _G.client.focus = c + c:raise() + end +end, { + description = 'restore minimized', + group = 'client' +}), awful.key({altkey, 'Control'}, 'k', function() + _G.toggle_quake() +end, { + description = 'dropdown application', + group = 'launcher' +}), awful.key({}, 'XF86MonBrightnessUp', function() + awful.spawn('xbacklight -inc 10') +end, { + description = '+10%', + group = 'hotkeys' +}), awful.key({}, 'XF86MonBrightnessDown', function() + awful.spawn('xbacklight -dec 10') +end, { + description = '-10%', + group = 'hotkeys' +}), -- ALSA volume control +awful.key({altkey}, 'k', function() + awful.spawn.easy_async('amixer -D pulse sset Master 5%+', function() + _G.update_volume() + end) +end, { + description = 'volume up', + group = 'hotkeys' +}), awful.key({}, 'XF86AudioRaiseVolume', function() + awful.spawn.easy_async('amixer -D pulse sset Master 5%+', function() + _G.update_volume() + end) +end, { + description = 'volume up', + group = 'hotkeys' +}), awful.key({}, 'XF86AudioLowerVolume', function() + awful.spawn.easy_async('amixer -D pulse sset Master 5%-', function() + _G.update_volume() + end) +end, { + description = 'volume down', + group = 'hotkeys' +}), awful.key({altkey}, 'j', function() + awful.spawn.easy_async('amixer -D pulse sset Master 5%-', function() + _G.update_volume() + end) +end, { + description = 'volume down', + group = 'hotkeys' +}), awful.key({altkey}, 'm', function() + awful.spawn('amixer -D pulse set Master 1+ toggle') + _G.update_volume() +end, { + description = 'toggle mute', + group = 'hotkeys' +}), awful.key({}, 'XF86AudioMute', function() + awful.spawn('amixer -D pulse set Master 1+ toggle') + _G.update_volume() +end, { + description = 'toggle mute', + group = 'hotkeys' +}), awful.key({modkey}, 'o', awful.client.movetoscreen, { + description = 'move window to next screen', + group = 'client' +}), awful.key({modkey}, 'n', function() + awful.spawn(awful.screen.focused().selected_tag.defaultApp, { + tag = _G.mouse.screen.selected_tag, + placement = awful.placement.bottom_right + }) +end, { + description = 'open default program for tag/workspace', + group = 'tag' +}), awful.key({'Control', altkey}, 'space', function() + awful.util.spawn_with_shell('vm-attach attach') +end)) + +-- Bind all key numbers to tags. +-- Be careful: we use keycodes to make it works on any keyboard layout. +-- This should map on the top row of your keyboard, usually 1 to 9. +for i = 1, 9 do + -- Hack to only show tags 1 and 9 in the shortcut window (mod+s) + local descr_view, descr_toggle, descr_move, descr_toggle_focus + if i == 1 or i == 9 then + descr_view = { + description = 'view tag #', + group = 'tag' + } + descr_toggle = { + description = 'toggle tag #', + group = 'tag' + } + descr_move = { + description = 'move focused client to tag #', + group = 'tag' + } + descr_toggle_focus = { + description = 'toggle focused client on tag #', + group = 'tag' + } + end + globalKeys = awful.util.table.join(globalKeys, -- View tag only. + awful.key({modkey}, '#' .. i + 9, function() + local screen = awful.screen.focused() + local tag = screen.tags[i] + if tag then + tag:view_only() + end + end, descr_view), -- Toggle tag display. + awful.key({modkey, 'Control'}, '#' .. i + 9, function() + local screen = awful.screen.focused() + local tag = screen.tags[i] + if tag then + awful.tag.viewtoggle(tag) + end + end, descr_toggle), -- Move client to tag. + awful.key({modkey, 'Shift'}, '#' .. i + 9, function() + if _G.client.focus then + local tag = _G.client.focus.screen.tags[i] + if tag then + _G.client.focus:move_to_tag(tag) + end + end + end, descr_move), -- Toggle tag on focused client. + awful.key({modkey, 'Control', 'Shift'}, '#' .. i + 9, function() + if _G.client.focus then + local tag = _G.client.focus.screen.tags[i] + if tag then + _G.client.focus:toggle_tag(tag) + end + end + end, descr_toggle_focus)) +end + +return globalKeys diff --git a/src/.config/awesome/configuration/keys/init.lua b/src/.config/awesome/configuration/keys/init.lua new file mode 100644 index 0000000..9591667 --- /dev/null +++ b/src/.config/awesome/configuration/keys/init.lua @@ -0,0 +1,4 @@ +return { + mod = require('configuration.keys.mod'), + global = require('configuration.keys.global') +} diff --git a/src/.config/awesome/configuration/keys/mod.lua b/src/.config/awesome/configuration/keys/mod.lua new file mode 100644 index 0000000..1d90897 --- /dev/null +++ b/src/.config/awesome/configuration/keys/mod.lua @@ -0,0 +1,4 @@ +return { + modKey = 'Mod4', + altKey = 'Mod1' +} \ No newline at end of file diff --git a/src/.config/awesome/configuration/rofi.rasi b/src/.config/awesome/configuration/rofi.rasi new file mode 100644 index 0000000..4833f14 --- /dev/null +++ b/src/.config/awesome/configuration/rofi.rasi @@ -0,0 +1,148 @@ +/** + * User: deadguy + * Copyright: deadguy + */ + +configuration { + display-drun: "Activate"; + display-run: "Execute"; + show-icons: true; + sidebar-mode: false; +} + +* { + background-color: rgb(0, 0, 0, 0); + text-color: rgb(255, 255, 255); + selbg: rgb(255, 255, 255, 0.5); + urgbg: rgb(255, 255, 255); + actbg: rgb(255, 255, 255, 0.05); + winbg: rgb(255, 255, 255); + + selected-normal-foreground: @winbg; + normal-foreground: @text-color; + selected-normal-background: @actbg; + normal-background: @background-color; + + selected-urgent-foreground: @background-color; + urgent-foreground: @text-color; + selected-urgent-background: @urgbg; + urgent-background: @background-color; + + selected-active-foreground: @winbg; + active-foreground: @text-color; + selected-active-background: @actbg; + active-background: @selbg; + + line-margin: 2; + line-padding: 2; + separator-style: "none"; + hide-scrollbar: "true"; + margin: 0px; + padding: 0px; + font: "FiraCode Nerd Font Mono Medium 10"; +} + +window { + location: west; + anchor: west; + x-offset: 0px; + height: 100%; + width: 30%; + padding: 0%; + orientation: horizontal; + children: [mainbox]; + background-color: rgb(20, 20, 20, 0.9); +} + +mainbox { + spacing: 0em; + padding: 0px; + width: 100%; + children: [ inputbar, listview ]; + expand: true; +} + +button { padding: 5px 2px; } + +button selected { + background-color: @active-background; + text-color: @background-color; +} + +inputbar { + children: [ entry ]; +} + +textbox-prompt-colon { + text-color: inherit; + expand: false; + margin: 0 0.3em 0em 0em; + } + +listview { + spacing: 0em; + dynamic: false; + cycle: false; +} + +element { + padding: 16px; + border: 0 0 0 0 solid; +} + +entry { + expand: true; + text-color: @normal-foreground; + background-color: rgb(0, 0, 0, 0); + vertical-align: 1; + padding: 12px; + font: "FiraCode Nerd Font Mono Bold 18"; +} + +element normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} + +element normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} + +element normal.active { + background-color: @active-background; + text-color: @active-foreground; +} + +element selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; + padding: 16px; + border: 0 0 0 5px solid; + border-color: @active-background; +} + +element selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} + +element selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} + +element alternate.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} + +element alternate.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} + +element alternate.active { + background-color: @active-background; + text-color: @active-foreground; +} \ No newline at end of file diff --git a/src/.config/awesome/configuration/utils/rofi-power b/src/.config/awesome/configuration/utils/rofi-power new file mode 100755 index 0000000..8674f38 --- /dev/null +++ b/src/.config/awesome/configuration/utils/rofi-power @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +# rofi-power +# Use rofi to call systemctl for shutdown, reboot, etc + +# 2016 Oliver Kraitschy - http://okraits.de + +OPTIONS="Power-off\nExit\nReboot\nSuspend\nHibernate" + +config_path=$(dirname "$0") + +LAUNCHER="rofi -dmenu -show-icons -icon-theme papirus -theme $config_path/../rofi.rasi" +USE_LOCKER="false" +LOCKER="i3lock-fancy" + +option=`echo -e $OPTIONS | $LAUNCHER | awk '{print $1}' | tr -d '\r\n'` +case $option in + Exit) + kill -9 -1 + ;; + Reboot) + systemctl reboot + ;; + Power-off) + systemctl poweroff + ;; + Suspend) + $($USE_LOCKER) && "$LOCKER"; systemctl suspend + ;; + Hibernate) + $($USE_LOCKER) && "$LOCKER"; systemctl hibernate + ;; + *) + ;; +esac diff --git a/src/.config/awesome/configuration/utils/screenshot b/src/.config/awesome/configuration/utils/screenshot new file mode 100755 index 0000000..d7f947e --- /dev/null +++ b/src/.config/awesome/configuration/utils/screenshot @@ -0,0 +1,8 @@ +#!/bin/bash +if [ $1 == "--delayed" ]; then + spectacle -b -n ${@:2} -o /tmp/screenshot.png ; xclip -selection clipboard -target image/png -i /tmp/screenshot.png ; paplay /usr/share/sounds/freedesktop/stereo/camera-shutter.oga +else + spectacle -b -n $@ -o /tmp/screenshot.png ; xclip -selection clipboard -target image/png -i /tmp/screenshot.png ; paplay /usr/share/sounds/freedesktop/stereo/camera-shutter.oga +fi + + diff --git a/src/.config/awesome/layout/init.lua b/src/.config/awesome/layout/init.lua new file mode 100644 index 0000000..5111828 --- /dev/null +++ b/src/.config/awesome/layout/init.lua @@ -0,0 +1,39 @@ +local awful = require('awful') +local top_bar = require('layout.top-bar') + +local key_grabber + +-- Create a wibox for each screen and add it +awful.screen.connect_for_each_screen(function(s) + if s.index == 1 then + s.top_bar = top_bar(s, true) + else + s.top_bar = top_bar(s, false) + end +end) + +-- Hide bars when app go fullscreen +function updateBarsVisibility() + for s in screen do + if s.selected_tag then + local fullscreen = s.selected_tag.fullscreenMode + s.top_bar.visible = not fullscreen + end + end +end + +_G.tag.connect_signal('property::selected', function(t) + updateBarsVisibility() +end) + +_G.client.connect_signal('property::fullscreen', function(c) + c.screen.selected_tag.fullscreenMode = c.fullscreen + updateBarsVisibility() +end) + +_G.client.connect_signal('unmanage', function(c) + if c.fullscreen then + c.screen.selected_tag.fullscreenMode = false + updateBarsVisibility() + end +end) diff --git a/src/.config/awesome/layout/top-bar.lua b/src/.config/awesome/layout/top-bar.lua new file mode 100644 index 0000000..3fd5a36 --- /dev/null +++ b/src/.config/awesome/layout/top-bar.lua @@ -0,0 +1,106 @@ +local awful = require('awful') +local beautiful = require('beautiful') +local clickable_container = require('widget.material.clickable-container') +local mat_icon_button = require('widget.material.icon-button') +local wibox = require('wibox') +local TagList = require('widget.tag-list') +local TaskList = require('widget.task-list') +local gears = require('gears') +local icons = require('theme.icons') +local dpi = require('beautiful').xresources.apply_dpi + +local separator = wibox.widget { + orientation = 'vertical', + forced_width = dpi(2), + opacity = 0.5, + widget = wibox.widget.separator +} + +local TopBar = function(s, offset) + + -- LAYOUT BOX + -- ========== + local LayoutBox = require('widget.layoutbox') + + -- BATTERY + -- ======= + local battery_widget = require('widget.battery') + + -- SYSTEM TRAY + -- =========== + local systray = wibox.widget.systray() + systray:set_horizontal(true) + + -- TASK LIST + -- ========= + local task_list = wibox.widget { + nil, + wibox.container.margin(TaskList(s), dpi(2), dpi(2), dpi(3), dpi(3)), + nil, + layout = wibox.layout.align.horizontal + } + + -- SYSTEM DETAILS + -- ============== + local volume_widget = require('widget.volume.volume-percentage') + local date_widget = require('widget.date') + local clock_widget = require('widget.clock') + local mem_widget = require('widget.memory') + local cpu_widget = require('widget.cpu') + local system_details = wibox.widget { + wibox.widget { + wibox.container.background(systray, beautiful.primary.hue_800), + wibox.container.background(battery_widget, beautiful.primary.hue_800), + separator, + wibox.container.background(mem_widget, beautiful.primary.hue_800), + separator, + wibox.container.background(cpu_widget, beautiful.primary.hue_800), + separator, + wibox.container.background(volume_widget, beautiful.primary.hue_800), + separator, + wibox.container.background(date_widget, beautiful.primary.hue_800), + separator, + wibox.container.background(clock_widget, beautiful.primary.hue_800), + layout = wibox.layout.fixed.horizontal + }, + bg = beautiful.primary.hue_900, + widget = wibox.container.background + } + + local calendar = require('widget.calendar') + calendar:attach(date_widget) + + -- TOP BAR + -- ======= + local panel = wibox({ + ontop = false, + screen = s, + height = dpi(24), + width = s.geometry.width, + x = s.geometry.x, + y = s.geometry.y, + stretch = false, + bg = beautiful.primary.hue_900, + fg = beautiful.fg_normal + }) + + panel:struts({ + top = panel.height - panel.y + }) + + panel:setup{ + layout = wibox.layout.align.horizontal, + spacing = dpi(0), + TagList(s), + task_list, + wibox.widget { + wibox.container.margin(system_details, dpi(2), dpi(2), dpi(3), dpi(3)), + LayoutBox(s), + layout = wibox.layout.fixed.horizontal + } + } + + return panel +end + +return TopBar diff --git a/src/.config/awesome/module/auto-start.lua b/src/.config/awesome/module/auto-start.lua new file mode 100644 index 0000000..b6d0746 --- /dev/null +++ b/src/.config/awesome/module/auto-start.lua @@ -0,0 +1,19 @@ +-- MODULE AUTO-START +-- Run all the apps listed in configuration/apps.lua as run_on_start_up only once when awesome start + +local awful = require('awful') +local apps = require('configuration.apps') + +local function run_once(cmd) + local findme = cmd + local firstspace = cmd:find(' ') + if firstspace then + findme = cmd:sub(0, firstspace - 1) + end + awful.spawn.with_shell(string.format('pgrep -u $USER -x %s > /dev/null || (%s)', findme, cmd)) + --This broke compton ===> awful.spawn.single_instance(string.format('pgrep -u $USER -x %s > /dev/null || (%s)', findme, cmd)) +end + +for _, app in ipairs(apps.run_on_start_up) do + run_once(app) +end diff --git a/src/.config/awesome/module/decorate-client.lua b/src/.config/awesome/module/decorate-client.lua new file mode 100644 index 0000000..f5c2405 --- /dev/null +++ b/src/.config/awesome/module/decorate-client.lua @@ -0,0 +1,93 @@ +local awful = require('awful') +local gears = require('gears') +local beautiful = require('beautiful') +local dpi = require('beautiful').xresources.apply_dpi + +local function renderClient(client, mode) + if client.skip_decoration or (client.rendering_mode == mode) then + return + end + + client.rendering_mode = mode + client.floating = false + client.maximized = false + client.above = false + client.below = false + client.ontop = false + client.sticky = false + client.maximized_horizontal = false + client.maximized_vertical = false + + client.border_width = beautiful.border_width + client.shape = function(cr, w, h) + gears.shape.rectangle(cr, w, h) + end +end + +local changesOnScreenCalled = false + +local function changesOnScreen(currentScreen) + local tagIsMax = currentScreen.selected_tag ~= nil and currentScreen.selected_tag.layout == awful.layout.suit.max + local clientsToManage = {} + + for _, client in pairs(currentScreen.clients) do + if not client.skip_decoration and not client.hidden then + table.insert(clientsToManage, client) + end + end + + if (tagIsMax or #clientsToManage == 1) then + currentScreen.client_mode = 'maximized' + else + currentScreen.client_mode = 'tiled' + end + + for _, client in pairs(clientsToManage) do + renderClient(client, currentScreen.client_mode) + end + changesOnScreenCalled = false +end + +function clientCallback(client) + if not changesOnScreenCalled then + if not client.skip_decoration and client.screen then + changesOnScreenCalled = true + local screen = client.screen + gears.timer.delayed_call(function() + changesOnScreen(screen) + end) + end + end +end + +function tagCallback(tag) + if not changesOnScreenCalled then + if tag.screen then + changesOnScreenCalled = true + local screen = tag.screen + gears.timer.delayed_call(function() + changesOnScreen(screen) + end) + end + end +end + +_G.client.connect_signal('manage', clientCallback) + +_G.client.connect_signal('unmanage', clientCallback) + +_G.client.connect_signal('property::hidden', clientCallback) + +_G.client.connect_signal('property::minimized', clientCallback) + +_G.client.connect_signal('property::fullscreen', function(c) + if c.fullscreen then + renderClient(c, 'maximized') + else + clientCallback(c) + end +end) + +_G.tag.connect_signal('property::selected', tagCallback) + +_G.tag.connect_signal('property::layout', tagCallback) diff --git a/src/.config/awesome/module/notifications.lua b/src/.config/awesome/module/notifications.lua new file mode 100644 index 0000000..f7b83cd --- /dev/null +++ b/src/.config/awesome/module/notifications.lua @@ -0,0 +1,53 @@ +local naughty = require('naughty') +local beautiful = require('beautiful') +local gears = require('gears') +local dpi = require('beautiful').xresources.apply_dpi + +-- Naughty presets +naughty.config.padding = 8 +naughty.config.spacing = 8 + +naughty.config.defaults.timeout = 5 +naughty.config.defaults.screen = 1 +naughty.config.defaults.position = 'top_right' +naughty.config.defaults.margin = dpi(16) +naughty.config.defaults.ontop = true +naughty.config.defaults.font = beautiful.font +naughty.config.defaults.icon = nil +naughty.config.defaults.icon_size = dpi(32) +naughty.config.defaults.shape = gears.shape.rectangle +naughty.config.defaults.border_width = dpi(0) +naughty.config.defaults.hover_timeout = nil + +-- Error handling +if _G.awesome.startup_errors then + naughty.notify({ + preset = naughty.config.presets.critical, + title = 'Oops, there were errors during startup!', + text = _G.awesome.startup_errors + }) +end + +do + local in_error = false + _G.awesome.connect_signal('debug::error', function(err) + if in_error then + return + end + in_error = true + + naughty.notify({ + preset = naughty.config.presets.critical, + title = 'Oops, an error happened!', + text = tostring(err) + }) + in_error = false + end) +end + +function log_this(title, txt) + naughty.notify({ + title = 'log: ' .. title, + text = txt + }) +end diff --git a/src/.config/awesome/module/quake-terminal.lua b/src/.config/awesome/module/quake-terminal.lua new file mode 100644 index 0000000..90ce5f3 --- /dev/null +++ b/src/.config/awesome/module/quake-terminal.lua @@ -0,0 +1,66 @@ +local awful = require('awful') +local app = require('configuration.apps').default.quake +local dpi = require('beautiful').xresources.apply_dpi +local beautiful = require('beautiful') +local screen = awful.screen.focused() + +-- Theme +beautiful.init(require('theme')) + +local quake_id = 'notnil' +local quake_client +local opened = false +function create_shell() + quake_id = awful.spawn.with_shell("exec -a QuakeTerminal " .. app) +end + +function open_quake() + quake_client.hidden = false +end + +function close_quake() + quake_client.hidden = true +end + +toggle_quake = function() + opened = not opened + if not quake_client then + create_shell() + else + if opened then + open_quake() + client.focus = quake_client + quake_client:raise() + else + close_quake() + end + end +end + +_G.client.connect_signal('manage', function(c) + if (c.pid == quake_id) then + quake_client = c + c.x = c.screen.geometry.x + c.height = (c.screen.geometry.height / 5) * 3 + c.y = c.screen.geometry.height - c.height - beautiful.border_width + c.floating = true + c.skip_taskbar = true + c.skip_decoration = true + c.ontop = true + c.floating = true + c.above = true + c.sticky = true + c.type = 'dock' + c.hidden = not opened + c.maximized_horizontal = true + c.border_width = beautiful.border_width + c:move_to_tag(screen.tags[3]) + end +end) + +_G.client.connect_signal('unmanage', function(c) + if (c.pid == quake_id) then + opened = false + quake_client = nil + end +end) diff --git a/src/.config/awesome/rc.lua b/src/.config/awesome/rc.lua new file mode 100644 index 0000000..d2ba9d7 --- /dev/null +++ b/src/.config/awesome/rc.lua @@ -0,0 +1,65 @@ +require('awful.autofocus') +local gears = require('gears') +local awful = require('awful') +local naughty = require('naughty') +local beautiful = require('beautiful') + +-- Theme +beautiful.init(require('theme')) + +-- Layout +require('layout') + +-- Init all modules +require('module.notifications') +require('module.auto-start') +require('module.decorate-client') +require('module.quake-terminal') + +-- Setup all configurations +require('configuration.client') +require('configuration.tags') +_G.root.keys(require('configuration.keys.global')) + +-- Create a wibox for each screen and add it +awful.screen.connect_for_each_screen(function(s) + -- If wallpaper is a function, call it with the screen + if beautiful.wallpaper then + if type(beautiful.wallpaper) == "string" then + if beautiful.wallpaper:sub(1, #"#") == "#" then + gears.wallpaper.set(beautiful.wallpaper) + elseif beautiful.wallpaper:sub(1, #"/") == "/" then + gears.wallpaper.maximized(beautiful.wallpaper, s) + end + else + beautiful.wallpaper(s) + end + end +end) + +-- Signal function to execute when a new client appears. +_G.client.connect_signal('manage', function(c) + -- Set the windows at the slave, + -- i.e. put it at the end of others instead of setting it master. + if not _G.awesome.startup then + awful.client.setslave(c) + end + + if _G.awesome.startup and not c.size_hints.user_position and not c.size_hints.program_position then + -- Prevent clients from being unreachable after screen count changes. + awful.placement.no_offscreen(c) + end +end) + +-- Enable sloppy focus, so that focus follows mouse. +-- _G.client.connect_signal('mouse::enter', function(c) +-- c:emit_signal('request::activate', 'mouse_enter', {raise = true}) +-- end) + +-- Make the focused window have a glowing border +_G.client.connect_signal('focus', function(c) + c.border_color = beautiful.border_focus +end) +_G.client.connect_signal('unfocus', function(c) + c.border_color = beautiful.border_normal +end) diff --git a/src/.config/awesome/requirements/fonts/Fira Code Bold Nerd Font Complete Mono.ttf b/src/.config/awesome/requirements/fonts/Fira Code Bold Nerd Font Complete Mono.ttf new file mode 100644 index 0000000..6ad2054 Binary files /dev/null and b/src/.config/awesome/requirements/fonts/Fira Code Bold Nerd Font Complete Mono.ttf differ diff --git a/src/.config/awesome/requirements/fonts/Fira Code Light Nerd Font Complete Mono.ttf b/src/.config/awesome/requirements/fonts/Fira Code Light Nerd Font Complete Mono.ttf new file mode 100644 index 0000000..29beae2 Binary files /dev/null and b/src/.config/awesome/requirements/fonts/Fira Code Light Nerd Font Complete Mono.ttf differ diff --git a/src/.config/awesome/requirements/fonts/Fira Code Medium Nerd Font Complete Mono.ttf b/src/.config/awesome/requirements/fonts/Fira Code Medium Nerd Font Complete Mono.ttf new file mode 100644 index 0000000..bcbb90e Binary files /dev/null and b/src/.config/awesome/requirements/fonts/Fira Code Medium Nerd Font Complete Mono.ttf differ diff --git a/src/.config/awesome/requirements/fonts/Fira Code Regular Nerd Font Complete Mono.ttf b/src/.config/awesome/requirements/fonts/Fira Code Regular Nerd Font Complete Mono.ttf new file mode 100644 index 0000000..c1073e3 Binary files /dev/null and b/src/.config/awesome/requirements/fonts/Fira Code Regular Nerd Font Complete Mono.ttf differ diff --git a/src/.config/awesome/theme/color-schemes.lua b/src/.config/awesome/theme/color-schemes.lua new file mode 100644 index 0000000..256038d --- /dev/null +++ b/src/.config/awesome/theme/color-schemes.lua @@ -0,0 +1,15 @@ +return { + -- Dracula + dracula = { + hue_50 = '#f8f8f2', + hue_100 = '#f1fa8c', + hue_200 = '#50fa7b', + hue_300 = '#8be9fd', + hue_400 = '#ff5555', + hue_500 = '#6272a4', + hue_600 = '#ff79c6', + hue_700 = '#ffb86c', + hue_800 = '#44475a', + hue_900 = '#282a36' + } +} diff --git a/src/.config/awesome/theme/init.lua b/src/.config/awesome/theme/init.lua new file mode 100644 index 0000000..20c672b --- /dev/null +++ b/src/.config/awesome/theme/init.lua @@ -0,0 +1,10 @@ +local gtable = require('gears.table') +local theme = require('theme.theme') + +local final_theme = {} +gtable.crush(final_theme, theme.theme) +gtable.crush(final_theme, theme.theme) +theme.awesome_overrides(final_theme) +theme.awesome_overrides(final_theme) + +return final_theme diff --git a/src/.config/awesome/theme/theme.lua b/src/.config/awesome/theme/theme.lua new file mode 100644 index 0000000..65411b0 --- /dev/null +++ b/src/.config/awesome/theme/theme.lua @@ -0,0 +1,56 @@ +local filesystem = require('gears.filesystem') +local color_schemes = require('theme.color-schemes') +local theme_dir = filesystem.get_configuration_dir() .. '/theme' +local gears = require('gears') +local dpi = require('beautiful').xresources.apply_dpi +local theme = {} +theme.icons = theme_dir .. '/icons/' + +-- Primary Color Scheme +theme.primary = color_schemes.dracula + +local awesome_overrides = function(theme) + theme.dir = os.getenv('HOME') .. '/.config/awesome/theme' + + theme.icons = theme.dir .. '/icons/' + theme.wallpaper = theme.dir .. '/wallpapers/4.png' -- Can be replaced with a color (eg: '#e0e0e0') + theme.font = 'FiraCode Nerd Font Mono bold 9' + + -- Layout + theme.layout_max = theme.icons .. 'layouts/arrow-expand-all.png' + theme.layout_tile = theme.icons .. 'layouts/view-quilt.png' + theme.layout_floating = theme.icons .. 'layouts/floating.png' + + -- Taglist + theme.taglist_font = theme.font + theme.taglist_bg_empty = theme.primary.hue_900 + theme.taglist_bg_occupied = 'linear:0,0:0,' .. dpi(32) .. ':0,' .. theme.primary.hue_800 .. ':0.1,' .. + theme.primary.hue_800 .. ':0.1,' .. theme.primary.hue_900 .. ':0.9,' .. + theme.primary.hue_900 + theme.taglist_bg_urgent = 'linear:0,0:0,' .. dpi(48) .. ':0,' .. theme.primary.hue_700 .. ':0.07,' .. + theme.primary.hue_700 .. ':0.07,' .. theme.primary.hue_900 .. ':1,' .. + theme.primary.hue_900 + theme.taglist_bg_focus = theme.primary.hue_200 + theme.taglist_fg_focus = theme.primary.hue_900 + + -- Tasklist + theme.tasklist_font = theme.font + theme.tasklist_bg_normal = theme.primary.hue_900 + theme.tasklist_bg_focus = theme.primary.hue_800 + theme.tasklist_bg_urgent = theme.primary.hue_900 + + -- Icons + theme.icon_theme = 'Papirus' + + -- Client + theme.gaps = dpi(4) + theme.border_width = dpi(2) + theme.border_focus = theme.primary.hue_200 + theme.border_normal = theme.primary.hue_900 + theme.bg_normal = theme.primary.hue_900 + theme.bg_systray = theme.primary.hue_800 +end +return { + theme = theme, + awesome_overrides = awesome_overrides +} diff --git a/src/.config/awesome/widget/battery/init.lua b/src/.config/awesome/widget/battery/init.lua new file mode 100644 index 0000000..46dea96 --- /dev/null +++ b/src/.config/awesome/widget/battery/init.lua @@ -0,0 +1,107 @@ +------------------------------------------------- +-- Battery Widget for Awesome Window Manager +-- Shows the battery status using the ACPI tool +-- More details could be found here: +-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/battery-widget +-- @author Pavel Makhov +-- @copyright 2017 Pavel Makhov +------------------------------------------------- +local awful = require('awful') +local naughty = require('naughty') +local watch = require('awful.widget.watch') +local wibox = require('wibox') +local clickable_container = require('widget.material.clickable-container') +local gears = require('gears') +local dpi = require('beautiful').xresources.apply_dpi +local apps = require('configuration.apps') + +-- acpi sample outputs +-- Battery 0: Discharging, 75%, 01:51:38 remaining +-- Battery 0: Charging, 53%, 00:57:43 until charged + +local HOME = os.getenv('HOME') +local PATH_TO_ICONS = HOME .. '/.config/awesome/widget/battery/icons/' +local percentage = wibox.widget.textbox() + +local widget = wibox.widget { + { + id = 'icon', + widget = wibox.widget.imagebox, + resize = true + }, + layout = wibox.layout.fixed.horizontal +} + +local battery_widget = wibox.widget { + wibox.container.margin(widget, dpi(4), dpi(4), dpi(3), dpi(3)), + wibox.container.margin(percentage, dpi(0), dpi(4), dpi(4), dpi(4)), + layout = wibox.layout.fixed.horizontal +} + +-- Alternative to naughty.notify - tooltip. You can compare both and choose the preferred one +local battery_popup = awful.tooltip({ + objects = {battery_widget}, + mode = 'outside', + align = 'left', + preferred_positions = {'right', 'left', 'top', 'bottom'} +}) + +-- To use colors from beautiful theme put +-- following lines in rc.lua before require("battery"): +-- beautiful.tooltip_fg = beautiful.fg_normal +-- beautiful.tooltip_bg = beautiful.bg_normal + +watch('acpi -i', 1, function(_, stdout) + local batteryIconName = 'battery' + + local battery_info = {} + local capacities = {} + for s in stdout:gmatch('[^\r\n]+') do + local status, charge_str, time = string.match(s, '.+: (%a+), (%d?%d?%d)%%,?.*') + if status ~= nil then + table.insert(battery_info, { + status = status, + charge = tonumber(charge_str) + }) + else + local cap_str = string.match(s, '.+:.+last full capacity (%d+)') + table.insert(capacities, tonumber(cap_str)) + end + end + + local capacity = 0 + for _, cap in ipairs(capacities) do + capacity = capacity + cap + end + + local charge = 0 + local status + for i, batt in ipairs(battery_info) do + if batt.charge >= charge then + status = batt.status -- use most charged battery status + -- this is arbitrary, and maybe another metric should be used + end + + charge = charge + batt.charge * capacities[i] + end + charge = charge / capacity + + if status == 'Charging' or status == 'Full' then + batteryIconName = batteryIconName .. '-charging' + end + + local roundedCharge = math.floor(charge / 10) * 10 + if (roundedCharge == 0) then + batteryIconName = batteryIconName .. '-outline' + elseif (roundedCharge ~= 100) then + batteryIconName = batteryIconName .. '-' .. roundedCharge + end + + widget.icon:set_image(PATH_TO_ICONS .. batteryIconName .. '.svg') + -- Update popup text + battery_popup.text = string.gsub(stdout, '\n$', '') + percentage.text = math.floor(charge) + collectgarbage('collect') +end, widget) + +return battery_widget diff --git a/src/.config/awesome/widget/cpu/init.lua b/src/.config/awesome/widget/cpu/init.lua new file mode 100644 index 0000000..8096ac0 --- /dev/null +++ b/src/.config/awesome/widget/cpu/init.lua @@ -0,0 +1,44 @@ +local wibox = require('wibox') +local beautiful = require('beautiful') +local icons = require('theme.icons') +local dpi = require('beautiful').xresources.apply_dpi +local watch = require('awful.widget.watch') + +local icon = wibox.widget { + wibox.widget { + image = icons.cpu, + widget = wibox.widget.imagebox + }, + top = dpi(3), + bottom = dpi(3), + widget = wibox.container.margin +} + +local percentage = wibox.widget.textbox() +local total_prev = 0 +local idle_prev = 0 + +watch([[bash -c "cat /proc/stat | grep '^cpu '"]], 1, function(_, stdout) + local user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice = + stdout:match('(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s') + + local total = user + nice + system + idle + iowait + irq + softirq + steal + + local diff_idle = idle - idle_prev + local diff_total = total - total_prev + local diff_usage = (1000 * (diff_total - diff_idle) / diff_total + 5) / 10 + + percentage.text = math.floor(diff_usage) .. '%' + + total_prev = total + idle_prev = idle + collectgarbage('collect') +end) + +local cpu_widget = wibox.widget { + icon, + wibox.container.margin(percentage, dpi(4), dpi(4), dpi(4), dpi(4)), + layout = wibox.layout.fixed.horizontal +} + +return wibox.container.margin(cpu_widget, dpi(4), dpi(4)) diff --git a/src/.config/awesome/widget/material/clickable-container.lua b/src/.config/awesome/widget/material/clickable-container.lua new file mode 100644 index 0000000..bcb09e5 --- /dev/null +++ b/src/.config/awesome/widget/material/clickable-container.lua @@ -0,0 +1,39 @@ +local wibox = require('wibox') + +function build(widget) + local container = wibox.widget { + widget, + widget = wibox.container.background + } + local old_cursor, old_wibox + + container:connect_signal('mouse::enter', function() + container.bg = '#ffffff11' + -- Hm, no idea how to get the wibox from this signal's arguments... + local w = _G.mouse.current_wibox + if w then + old_cursor, old_wibox = w.cursor, w + w.cursor = 'hand1' + end + end) + + container:connect_signal('mouse::leave', function() + container.bg = '#ffffff00' + if old_wibox then + old_wibox.cursor = old_cursor + old_wibox = nil + end + end) + + container:connect_signal('button::press', function() + container.bg = '#ffffff22' + end) + + container:connect_signal('button::release', function() + container.bg = '#ffffff11' + end) + + return container +end + +return build diff --git a/src/.config/awesome/widget/material/icon-button.lua b/src/.config/awesome/widget/material/icon-button.lua new file mode 100644 index 0000000..c4a03bf --- /dev/null +++ b/src/.config/awesome/widget/material/icon-button.lua @@ -0,0 +1,14 @@ +local wibox = require('wibox') +local gears = require('gears') +local clickable_container = require('widget.material.clickable-container') +local dpi = require('beautiful').xresources.apply_dpi + +function build(imagebox, args) + return wibox.widget { + imagebox, + shape = gears.shape.circle, + widget = clickable_container + } +end + +return build diff --git a/src/.config/awesome/widget/material/icon.lua b/src/.config/awesome/widget/material/icon.lua new file mode 100644 index 0000000..82ce50f --- /dev/null +++ b/src/.config/awesome/widget/material/icon.lua @@ -0,0 +1,80 @@ +-- Default widget requirements +local base = require('wibox.widget.base') +local gtable = require('gears.table') +local setmetatable = setmetatable + +-- Commons requirements +local wibox = require('wibox') + +-- Local declarations + +local mat_list_item = {mt = {}} + +function mat_list_item:layout(_, width, height) + local layout = {} + + -- Add divider if present + if self._private.icon then + table.insert( + layout, + base.place_widget_at( + self._private.imagebox, + width / 2 - self._private.size / 2, + height / 2 - self._private.size / 2, + self._private.size, + self._private.size + ) + ) + end + return layout +end + +function mat_list_item:fit(_, width, height) + local min = math.min(width, height) + return min, min +end + +function mat_list_item:set_icon(icon) + self._private.icon = icon + self._private.imagebox.image = icon +end + +function mat_list_item:get_icon() + return self._private.icon +end + +function mat_list_item:set_size(size) + self._private.size = size + self:emit_signal('widget::layout_changed') +end + +function mat_list_item:get_size() + return self._private.size +end + +local function new(icon, size) + local ret = + base.make_widget( + nil, + nil, + { + enable_properties = true + } + ) + + gtable.crush(ret, mat_list_item, true) + ret._private.icon = icon + ret._private.imagebox = wibox.widget.imagebox(icon) + ret._private.size = size + return ret +end + +function mat_list_item.mt:__call(...) + return new(...) +end + +--@DOC_widget_COMMON@ + +--@DOC_object_COMMON@ + +return setmetatable(mat_list_item, mat_list_item.mt) diff --git a/src/.config/awesome/widget/material/list-item.lua b/src/.config/awesome/widget/material/list-item.lua new file mode 100644 index 0000000..f549bf4 --- /dev/null +++ b/src/.config/awesome/widget/material/list-item.lua @@ -0,0 +1,186 @@ +-- Default widget requirements +local base = require('wibox.widget.base') +local gtable = require('gears.table') +local setmetatable = setmetatable +local dpi = require('beautiful').xresources.apply_dpi + +-- Commons requirements +local wibox = require('wibox') +local clickable_container = require('widget.material.clickable-container') +-- Local declarations + +local mat_list_item = { + mt = {} +} + +function mat_list_item:build_separator() + self._private.separator = wibox.widget { + orientation = 'horizontal', + forced_height = 1, + opacity = 0.08, + widget = wibox.widget.separator + } + self:emit_signal('widget::layout_changed') +end + +function mat_list_item:build_clickable_container() + self._private.clickable_container = wibox.widget { + wibox.widget { + widget = wibox.widget.textbox + }, + widget = clickable_container + } + self:emit_signal('widget::layout_changed') +end + +function mat_list_item:layout(_, width, height) + local content_width = width - dpi(32) + local content_x = dpi(dpi(16)) + local layout = {} + + -- Add divider if present + if self._private.divider then + table.insert(layout, base.place_widget_at(self._private.separator, 0, 0, width, 1)) + end + + -- Add clickable_container if clickable + if self._private.clickable then + table.insert(layout, base.place_widget_at(self._private.clickable_container, 0, 0, width, height)) + end + + if self._private.prefix then + content_x = content_x + dpi(54) + content_width = content_width - dpi(54) + table.insert(layout, base.place_widget_at(self._private.prefix, dpi(16), 0, dpi(48), height)) + end + + if self._private.suffix then + content_width = content_width - dpi(54) + table.insert(layout, base.place_widget_at(self._private.suffix, width - dpi(40), dpi(12), width, height)) + end + table.insert(layout, base.place_widget_at(self._private.content, content_x, 0, content_width, height)) + return layout +end + +function mat_list_item:fit(_, width) + return width, dpi(48) +end + +---- Properties ---- + +-- Property clickable +function mat_list_item:set_clickable(value) + if self._private.clickable ~= value then + self._private.clickable = value + self:emit_signal('property::clickable') + self:emit_signal('widget::layout_changed') + + if self._private.clickable and not self._private.clickable_container then + self:build_clickable_container() + end + end +end + +function mat_list_item:get_clickable() + return self._private.clickable +end + +-- Property divider + +function mat_list_item:set_divider(value) + if self._private.divider ~= value then + self._private.divider = value + self:emit_signal('property::divider') + self:emit_signal('widget::layout_changed') + + if self._private.divider and not self._private.separator then + self:build_separator() + end + end +end + +function mat_list_item:get_divider() + return self._private.divider +end + +function mat_list_item:set_prefix(widget) + if widget then + base.check_widget(widget) + end + self._private.prefix = widget + self:emit_signal('widget::layout_changed') +end + +function mat_list_item:get_prefix() + return self._private.prefix +end + +function mat_list_item:set_suffix(widget) + if widget then + base.check_widget(widget) + end + self._private.suffix = widget + self:emit_signal('widget::layout_changed') +end + +function mat_list_item:get_suffix() + return self._private.suffix +end + +--- The widget who will be the content. +-- @property content +-- @tparam widget widget The widget + +function mat_list_item:set_content(widget) + if widget then + base.check_widget(widget) + end + self._private.content = widget + self:emit_signal('widget::layout_changed') +end + +function mat_list_item:get_content() + return self._private.content +end + +-- Get the number of children element +-- @treturn table The children +function mat_list_item:get_children() + return {self._private.widget} +end + +-- Replace the layout children +-- This layout only accept one children, all others will be ignored +-- @tparam table children A table composed of valid widgets +function mat_list_item:set_children(children) + if not children[2] then + self:set_content(children[1]) + else + self:set_prefix(children[1]) + self:set_content(children[2]) + end + if children[3] then + self:set_suffix(children[3]) + end +end + +local function new(widget) + local ret = base.make_widget(nil, nil, { + enable_properties = true + }) + + gtable.crush(ret, mat_list_item, true) + + ret._private.content = widget + return ret +end + +function mat_list_item.mt:__call(...) + return new(...) +end + +-- @DOC_widget_COMMON@ + +-- @DOC_object_COMMON@ + +return setmetatable(mat_list_item, mat_list_item.mt) diff --git a/src/.config/awesome/widget/material/slider.lua b/src/.config/awesome/widget/material/slider.lua new file mode 100644 index 0000000..cc34efc --- /dev/null +++ b/src/.config/awesome/widget/material/slider.lua @@ -0,0 +1,117 @@ +-- Default widget requirements +local base = require('wibox.widget.base') +local gtable = require('gears.table') +local setmetatable = setmetatable +local dpi = require('beautiful').xresources.apply_dpi + +-- Commons requirements +local wibox = require('wibox') +local gears = require('gears') +local beautiful = require('beautiful') +local mat_colors = require('theme.mat-colors') +-- Local declarations + +local mat_slider = { + mt = {} +} + +local properties = { + read_only = false +} + +function mat_slider:set_value(value) + if self._private.value ~= value then + self._private.value = value + self._private.progress_bar:set_value(self._private.value) + self._private.slider:set_value(self._private.value) + self:emit_signal('property::value') + -- self:emit_signal('widget::layout_changed') + end +end + +function mat_slider:get_value(value) + return self._private.value +end + +function mat_slider:set_read_only(value) + if self._private.read_only ~= value then + self._private.read_only = value + self:emit_signal('property::read_only') + self:emit_signal('widget::layout_changed') + end +end + +function mat_slider:get_read_only(value) + return self._private.read_only +end + +function mat_slider:layout(_, width, height) + local layout = {} + table.insert(layout, base.place_widget_at(self._private.progress_bar, 0, dpi(21), width, height - dpi(42))) + if (not self._private.read_only) then + table.insert(layout, base.place_widget_at(self._private.slider, 0, dpi(6), width, height - dpi(12))) + end + return layout +end + +function mat_slider:draw(_, cr, width, height) + if (self._private.read_only) then + self._private.slider.forced_height = 0 + end +end + +function mat_slider:fit(_, width, height) + return width, height +end + +local function new(args) + local ret = base.make_widget(nil, nil, { + enable_properties = true + }) + + gtable.crush(ret._private, args or {}) + + gtable.crush(ret, mat_slider, true) + + ret._private.progress_bar = wibox.widget { + max_value = 100, + value = 25, + forced_height = dpi(6), + paddings = 0, + shape = gears.shape.rounded_rect, + background_color = beautiful.primary.hue_900, + color = beautiful.primary.hue_400, + widget = wibox.widget.progressbar + } + + ret._private.slider = wibox.widget { + forced_height = dpi(8), + bar_shape = gears.shape.rounded_rect, + bar_height = 0, + bar_color = beautiful.primary.hue_500, + handle_color = beautiful.primary.hue_300, + handle_shape = gears.shape.circle, + handle_border_color = '#00000012', + handle_border_width = dpi(3), + value = 25, + widget = wibox.widget.slider + } + + ret._private.slider:connect_signal('property::value', function() + ret:set_value(ret._private.slider.value) + end) + + ret._private.read_only = false + + return ret +end + +function mat_slider.mt:__call(...) + return new(...) +end + +-- @DOC_widget_COMMON@ + +-- @DOC_object_COMMON@ + +return setmetatable(mat_slider, mat_slider.mt) diff --git a/src/.config/awesome/widget/tag-list/init.lua b/src/.config/awesome/widget/tag-list/init.lua new file mode 100644 index 0000000..4e07d96 --- /dev/null +++ b/src/.config/awesome/widget/tag-list/init.lua @@ -0,0 +1,127 @@ +local awful = require('awful') +local wibox = require('wibox') +local dpi = require('beautiful').xresources.apply_dpi +local capi = { + button = _G.button +} +local clickable_container = require('widget.material.clickable-container') +local modkey = require('configuration.keys.mod').modKey +--- Common method to create buttons. +-- @tab buttons +-- @param object +-- @treturn table +local function create_buttons(buttons, object) + if buttons then + local btns = {} + for _, b in ipairs(buttons) do + -- Create a proxy button object: it will receive the real + -- press and release events, and will propagate them to the + -- button object the user provided, but with the object as + -- argument. + local btn = capi.button { + modifiers = b.modifiers, + button = b.button + } + btn:connect_signal('press', function() + b:emit_signal('press', object) + end) + btn:connect_signal('release', function() + b:emit_signal('release', object) + end) + btns[#btns + 1] = btn + end + + return btns + end +end + +local function list_update(w, buttons, label, data, objects) + -- update the widgets, creating them if needed + w:reset() + for i, o in ipairs(objects) do + local cache = data[o] + local ib, tb, bgb, tbm, ibm, l, bg_clickable + if cache then + ib = cache.ib + tb = cache.tb + bgb = cache.bgb + tbm = cache.tbm + ibm = cache.ibm + else + ib = wibox.widget.imagebox() + tb = wibox.widget.textbox() + bgb = wibox.container.background() + tbm = wibox.container.margin(tb, dpi(6), dpi(6), dpi(4), dpi(4)) + ibm = wibox.container.margin(ib, dpi(8), dpi(8), dpi(9), dpi(9)) + l = wibox.layout.fixed.horizontal() + bg_clickable = clickable_container() + + -- All of this is added in a fixed widget + l:fill_space(true) + -- l:add(ibm) + l:add(tbm) + bg_clickable:set_widget(l) + + -- And all of this gets a background + bgb:set_widget(bg_clickable) + + bgb:buttons(create_buttons(buttons, o)) + + data[o] = { + ib = ib, + tb = tb, + bgb = bgb, + tbm = tbm, + ibm = ibm + } + end + + local text, bg, bg_image, icon, args = label(o, tb) + args = args or {} + + if text == nil or text == '' then + tbm:set_margins(0) + else + if not tb:set_markup_silently(text) then + tb:set_markup('<Invalid text>') + end + end + bgb:set_bg(bg) + if type(bg_image) == 'function' then + bg_image = bg_image(tb, o, nil, objects, i) + end + bgb:set_bgimage(bg_image) + if icon then + ib.image = icon + else + ibm:set_margins(0) + end + + bgb.shape = args.shape + bgb.shape_border_width = args.shape_border_width + bgb.shape_border_color = args.shape_border_color + + w:add(bgb) + end +end + +local TagList = function(s) + return awful.widget.taglist(s, awful.widget.taglist.filter.all, + awful.util.table.join(awful.button({}, 1, function(t) + t:view_only() + end), awful.button({modkey}, 1, function(t) + if _G.client.focus then + _G.client.focus:move_to_tag(t) + t:view_only() + end + end), awful.button({}, 3, awful.tag.viewtoggle), awful.button({modkey}, 3, function(t) + if _G.client.focus then + _G.client.focus:toggle_tag(t) + end + end), awful.button({}, 4, function(t) + awful.tag.viewprev(t.screen) + end), awful.button({}, 5, function(t) + awful.tag.viewnext(t.screen) + end)), {}, list_update, wibox.layout.fixed.horizontal()) +end +return TagList diff --git a/src/.config/awesome/widget/task-list/init.lua b/src/.config/awesome/widget/task-list/init.lua new file mode 100644 index 0000000..4b2ab6a --- /dev/null +++ b/src/.config/awesome/widget/task-list/init.lua @@ -0,0 +1,144 @@ +local awful = require('awful') +local wibox = require('wibox') +local dpi = require('beautiful').xresources.apply_dpi +local capi = { + button = _G.button +} +local gears = require('gears') +local clickable_container = require('widget.material.clickable-container') +local tasklist_mode = 'text' +local beautiful = require('beautiful') +--- Common method to create buttons. +-- @tab buttons +-- @param object +-- @treturn table +local function create_buttons(buttons, object) + if buttons then + local btns = {} + for _, b in ipairs(buttons) do + -- Create a proxy button object: it will receive the real + -- press and release events, and will propagate them to the + -- button object the user provided, but with the object as + -- argument. + local btn = capi.button { + modifiers = b.modifiers, + button = b.button + } + btn:connect_signal('press', function() + b:emit_signal('press', object) + end) + btn:connect_signal('release', function() + b:emit_signal('release', object) + end) + btns[#btns + 1] = btn + end + + return btns + end +end + +local function list_update(w, buttons, label, data, objects) + -- update the widgets, creating them if needed + w:reset() + for i, o in ipairs(objects) do + local cache = data[o] + local ib, tb, bgb, tbm, ibm, l, ll, bg_clickable + if cache then + ib = cache.ib + tb = cache.tb + bgb = cache.bgb + tbm = cache.tbm + ibm = cache.ibm + else + ib = wibox.widget.imagebox() + tb = wibox.widget.textbox() + bg_clickable = clickable_container() + bgb = wibox.container.background() + tbm = wibox.container.margin(tb, dpi(4), dpi(4), dpi(1), dpi(1)) + ibm = wibox.container.margin(ib, dpi(2), dpi(2), dpi(2), dpi(2)) + l = wibox.layout.fixed.horizontal() + ll = wibox.layout.flex.horizontal() + + -- All of this is added in a fixed widget + l:fill_space(true) + l:add(ibm) + l:add(tbm) + ll:add(l) + + bg_clickable:set_widget(ll) + -- And all of this gets a background + bgb:set_widget(bg_clickable) + + l:buttons(create_buttons(buttons, o)) + + data[o] = { + ib = ib, + tb = tb, + bgb = bgb, + tbm = tbm, + ibm = ibm + } + end + + local text, bg, bg_image, icon, args = label(o, tb) + args = args or {} + + -- The text might be invalid, so use pcall. + if tasklist_mode == 'icon' then + text = nil + end + if text == nil or text == '' then + tbm:set_margins(0) + else + if not tb:set_markup_silently(text) then + tb:set_markup('<Invalid text>') + end + end + bgb:set_bg(bg) + if type(bg_image) == 'function' then + bg_image = bg_image(tb, o, nil, objects, i) + end + bgb:set_bgimage(bg_image) + if icon then + ib.image = icon + ib.resize = true + else + ibm:set_margins(0) + end + + bgb.shape = args.shape + bgb.shape_border_width = args.shape_border_width + bgb.shape_border_color = args.shape_border_color + + w:add(bgb) + end +end + +local tasklist_buttons = awful.util.table.join(awful.button({}, 1, function(c) + if c == _G.client.focus then + c.minimized = true + else + -- Without this, the following + -- :isvisible() makes no sense + c.minimized = false + if not c:isvisible() and c.first_tag then + c.first_tag:view_only() + end + -- This will also un-minimize + -- the client, if needed + _G.client.focus = c + c:raise() + end +end), awful.button({}, 4, function() + awful.client.focus.byidx(1) +end), awful.button({}, 5, function() + awful.client.focus.byidx(-1) +end), awful.button({}, 2, function(c) + c.kill(c) +end)) + +local TaskList = function(s) + return awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, tasklist_buttons, nil, list_update) +end + +return TaskList diff --git a/src/.config/kitty/diff.conf b/src/.config/kitty/diff.conf new file mode 100644 index 0000000..5fec447 --- /dev/null +++ b/src/.config/kitty/diff.conf @@ -0,0 +1,19 @@ +foreground #f8f8f2 +background #282a36 +title_fg #f8f8f2 +title_bg #282a36 +margin_bg #6272a4 +margin_fg #44475a +removed_bg #ff5555 +highlight_removed_bg #ff5555 +removed_margin_bg #ff5555 +added_bg #50fa7b +highlight_added_bg #50fa7b +added_margin_bg #50fa7b +filler_bg #44475a +hunk_margin_bg #44475a +hunk_bg #bd93f9 +search_bg #8be9fd +search_fg #282a36 +select_bg #f1fa8c +select_fg #282a36 diff --git a/src/.config/kitty/dracula.conf b/src/.config/kitty/dracula.conf new file mode 100644 index 0000000..8bee635 --- /dev/null +++ b/src/.config/kitty/dracula.conf @@ -0,0 +1,62 @@ +# https://draculatheme.com/kitty +# +# Installation instructions: +# +# cp dracula.conf ~/.config/kitty/ +# echo "include dracula.conf" >> ~/.config/kitty/kitty.conf +# +# Then reload kitty for the config to take affect. +# Alternatively copy paste below directly into kitty.conf + +foreground #f8f8f2 +background #282a36 +selection_foreground #ffffff +selection_background #44475a + +url_color #8be9fd + +# black +color0 #21222c +color8 #6272a4 + +# red +color1 #ff5555 +color9 #ff6e6e + +# green +color2 #50fa7b +color10 #69ff94 + +# yellow +color3 #f1fa8c +color11 #ffffa5 + +# blue +color4 #bd93f9 +color12 #d6acff + +# magenta +color5 #ff79c6 +color13 #ff92df + +# cyan +color6 #8be9fd +color14 #a4ffff + +# white +color7 #f8f8f2 +color15 #ffffff + +# Cursor colors +cursor #f8f8f2 +cursor_text_color background + +# Tab bar colors +active_tab_foreground #282a36 +active_tab_background #f8f8f2 +inactive_tab_foreground #282a36 +inactive_tab_background #6272a4 + +# Marks +mark1_foreground #282a36 +mark1_background #ff5555 diff --git a/src/.config/kitty/kitty.conf b/src/.config/kitty/kitty.conf new file mode 100644 index 0000000..99630f7 --- /dev/null +++ b/src/.config/kitty/kitty.conf @@ -0,0 +1,10 @@ +include dracula.conf + +background_opacity 0.95 +font_family FiraCode Nerd Font Mono +bold_font auto +italic_font auto +bold_italic_font auto +window_padding_width 4 +font_size 12 +disable_ligatures always diff --git a/src/.config/starship.toml b/src/.config/starship.toml new file mode 100644 index 0000000..b1efa66 --- /dev/null +++ b/src/.config/starship.toml @@ -0,0 +1,77 @@ +[aws] +symbol = " " + +[battery] +full_symbol = "" +charging_symbol = "" +discharging_symbol = "" + +[conda] +symbol = " " + +[dart] +symbol = " " + +[directory] +read_only = " " + +[docker] +symbol = " " + +[elixir] +symbol = " " + +[elm] +symbol = " " + +[git_branch] +symbol = " " + +[golang] +symbol = " " + +[haskell] +symbol = " " + +[hg_branch] +symbol = " " + +[java] +symbol = " " + +[julia] +symbol = " " + +[memory_usage] +symbol = " " + +[nim] +symbol = " " + +[nix_shell] +symbol = " " + +[nodejs] +symbol = " " + +[package] +symbol = " " + +[perl] +symbol = " " + +[php] +symbol = " " + +[python] +symbol = " " + +[ruby] +symbol = " " + +[rust] +symbol = " " + +[swift] +symbol = "ﯣ " + diff --git a/src/.config/sublime-text-3/Packages/User/C++.sublime-settings b/src/.config/sublime-text-3/Packages/User/C++.sublime-settings new file mode 100755 index 0000000..c435a7c --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/C++.sublime-settings @@ -0,0 +1,4 @@ +// These settings override both User and Default settings for the C++ syntax +{ + +} diff --git a/src/.config/sublime-text-3/Packages/User/CP-build-no-timeout.sublime-build b/src/.config/sublime-text-3/Packages/User/CP-build-no-timeout.sublime-build new file mode 100755 index 0000000..f95d9e6 --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/CP-build-no-timeout.sublime-build @@ -0,0 +1,24 @@ +{ + "target": "terminus_open", + "cancel": "terminus_cancel_build", + "title": "Terminal", + "auto_close": false, + "timeit": true, + + "post_window_hooks": [["carry_file_to_pane", { "direction": "right" }]], + + "focus": false, + "cmd": [ + "bash", + "-c", + "g++ -std=c++17 -Wall -Wextra -Wshadow -fsanitize=undefined '${file}' -o '${file_path}/compiled'.o && tput setaf 2 && TIMEFORMAT='\nExecution Time: %R' && time '${file_path}/compiled.o' && unset TIMEFORMAT" + ], + "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", + "working_dir": "${file_path}", + "selector": "source.c, source.c++", + "variants": [ + { + "name": "Run" + } + ] +} diff --git a/src/.config/sublime-text-3/Packages/User/CP-build-system-alt.sublime-build b/src/.config/sublime-text-3/Packages/User/CP-build-system-alt.sublime-build new file mode 100755 index 0000000..0dd82fc --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/CP-build-system-alt.sublime-build @@ -0,0 +1,24 @@ +{ + "target": "terminus_open", + "cancel": "terminus_cancel_build", + "title": "Terminal", + "auto_close": false, + "timeit": true, + + "post_window_hooks": [["carry_file_to_pane", { "direction": "down" }]], + + "focus": false, + "cmd": [ + "bash", + "-c", + "g++ -std=c++17 -Wall -Wextra -Wshadow -fsanitize=undefined '${file}' -o '${file_path}/compiled'.o && tput setaf 2 && TIMEFORMAT='\nExecution Time: %R' && time timeout 5s '${file_path}/compiled.o' < input.txt && unset TIMEFORMAT" + ], + "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", + "working_dir": "${file_path}", + "selector": "source.c, source.c++", + "variants": [ + { + "name": "Run" + } + ] +} diff --git a/src/.config/sublime-text-3/Packages/User/CP-build-system.sublime-build b/src/.config/sublime-text-3/Packages/User/CP-build-system.sublime-build new file mode 100755 index 0000000..0dd82fc --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/CP-build-system.sublime-build @@ -0,0 +1,24 @@ +{ + "target": "terminus_open", + "cancel": "terminus_cancel_build", + "title": "Terminal", + "auto_close": false, + "timeit": true, + + "post_window_hooks": [["carry_file_to_pane", { "direction": "down" }]], + + "focus": false, + "cmd": [ + "bash", + "-c", + "g++ -std=c++17 -Wall -Wextra -Wshadow -fsanitize=undefined '${file}' -o '${file_path}/compiled'.o && tput setaf 2 && TIMEFORMAT='\nExecution Time: %R' && time timeout 5s '${file_path}/compiled.o' < input.txt && unset TIMEFORMAT" + ], + "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", + "working_dir": "${file_path}", + "selector": "source.c, source.c++", + "variants": [ + { + "name": "Run" + } + ] +} diff --git a/src/.config/sublime-text-3/Packages/User/Default (Linux).sublime-keymap b/src/.config/sublime-text-3/Packages/User/Default (Linux).sublime-keymap new file mode 100755 index 0000000..ab397c0 --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/Default (Linux).sublime-keymap @@ -0,0 +1,21 @@ +[ + { "keys": ["ctrl+e"], "command": "toggle_side_bar" }, + { + "keys": ["ctrl+b"], + "command": "chain", + "args": { + "commands": [ + ["focus_group",{"group":0}], + ["terminus_close_all"], + ["build"], + ["focus_group",{"group":0}], + ] + } + }, + { "keys": ["ctrl+t"], + "command": "terminus_open", + "args" : { + "cwd": "${file_path:${folder}}" + } + }, +] diff --git a/src/.config/sublime-text-3/Packages/User/Origami.sublime-settings b/src/.config/sublime-text-3/Packages/User/Origami.sublime-settings new file mode 100755 index 0000000..9f70c22 --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/Origami.sublime-settings @@ -0,0 +1,4 @@ +{ + // Create a new pane when switching in a direction without one + "create_new_pane_if_necessary": false +} diff --git a/src/.config/sublime-text-3/Packages/User/Package Control.sublime-settings b/src/.config/sublime-text-3/Packages/User/Package Control.sublime-settings new file mode 100755 index 0000000..85bf748 --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/Package Control.sublime-settings @@ -0,0 +1,27 @@ +{ + "bootstrapped": true, + "in_process_packages": + [ + ], + "installed_packages": + [ + "1337 Color Scheme", + "BracketGuard", + "BracketHighlighter", + "Chain of Command", + "Color Scheme - Eazy Light", + "Dracula Color Scheme", + "molokai", + "Monokai - Spacegray", + "Monokai Gray", + "Monokai++", + "Notepad++ Color Scheme", + "Origami", + "Package Control", + "SublimeAStyleFormatter", + "SublimeLinter", + "SublimeLinter-clang", + "SublimeLinter-gcc", + "Terminus" + ] +} diff --git a/src/.config/sublime-text-3/Packages/User/Package Control.user-ca-bundle b/src/.config/sublime-text-3/Packages/User/Package Control.user-ca-bundle new file mode 100755 index 0000000..e69de29 diff --git a/src/.config/sublime-text-3/Packages/User/Preferences.sublime-settings b/src/.config/sublime-text-3/Packages/User/Preferences.sublime-settings new file mode 100755 index 0000000..55d923e --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/Preferences.sublime-settings @@ -0,0 +1,18 @@ +{ + "color_scheme": "Packages/Color Scheme - Eazy Light/Eazy Light.tmTheme", + "file_exclude_patterns": + [ + "*.o" + ], + "font_face": "Consolas Regular", + "font_size": 10, + "ignored_packages": + [ + "Vintage" + ], + "line_padding_bottom": 1, + "line_padding_top": 1, + "theme": "Adaptive.sublime-theme", + "translate_tabs_to_spaces": true, + "word_wrap": "true" +} diff --git a/src/.config/sublime-text-3/Packages/User/Terminus.sublime-settings b/src/.config/sublime-text-3/Packages/User/Terminus.sublime-settings new file mode 100755 index 0000000..229a467 --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/Terminus.sublime-settings @@ -0,0 +1,3 @@ +{ + "theme": "3024-day" +} diff --git a/src/.config/sublime-text-3/Packages/User/Terminus/Terminus.hidden-color-scheme b/src/.config/sublime-text-3/Packages/User/Terminus/Terminus.hidden-color-scheme new file mode 100644 index 0000000..38aaaf1 --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/Terminus/Terminus.hidden-color-scheme @@ -0,0 +1,27 @@ +{ + "name": "Terminus", + "variables": { + "blue": "#01a0e4", + "light_green": "#3a3432", + "light_brown": "#4a4543", + "green": "#01a252", + "light_blue": "#807d7c", + "cyan": "#b5e4f4", + "light_red": "#e8bbd0", + "black": "#090300", + "light_white": "#f7f7f8", + "magenta": "#a16a94", + "background": "#f7f7f8", + "light_cyan": "#cdab53", + "caret": "#4a4543", + "brown": "#fded02", + "white": "#a5a2a2", + "light_black": "#5c5855", + "light_magenta": "#d6d5d4", + "red": "#db2d20", + "foreground": "#4a4543" + }, + "globals": { + "background": "#f7f7f7" + } +} \ No newline at end of file diff --git a/src/.config/sublime-text-3/Packages/User/cpp.sublime-snippet b/src/.config/sublime-text-3/Packages/User/cpp.sublime-snippet new file mode 100755 index 0000000..f3050ce --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/cpp.sublime-snippet @@ -0,0 +1,14 @@ + + +using namespace std; + +int main() { + + + return 0; +} +]]> + + cpp + diff --git a/src/.config/sublime-text-3/Packages/User/template.sublime-snippet b/src/.config/sublime-text-3/Packages/User/template.sublime-snippet new file mode 100755 index 0000000..136995c --- /dev/null +++ b/src/.config/sublime-text-3/Packages/User/template.sublime-snippet @@ -0,0 +1,66 @@ + + + +/* NAMESPACES */ +using namespace std; // (┛ಠ_ಠ)┛ "Bad" Practice + +/* ALIASES */ +typedef long long lli; +typedef long double ld; +typedef unsigned uns; + +typedef pair pi; +typedef pair pl; +typedef pair pd; + +typedef vector vi; +typedef vector vd; +typedef vector vl; +typedef vector vpi; +typedef vector vpl; + +/* DEFINITIONS */ +#define mp make_pair +#define pb push_back +#define F first +#define S second +#define lb lower_bound +#define ub upper_bound + +#define fo(i, a, b) for(auto i=a; i<(b); i++) +#define forev(i, b, a) for(auto i = (b)-1; i >= a; i--) +#define all(x) x.begin(), x.end() +#define sortall(x) sort(all(x)) +#define sz(x) (int)x.size() +#define enl "\n" +#define deb(x) cout << #x << ": " << x << enl; + +/* CONSTANTS */ +// const ld PI = 4 * atan((ld)1); +// const int MOD = 1000000007; +// const lli INF = 1e18; +// const int MX = INT_MAX - 1; + +/* UTILITIES */ +template bool _odd(T a) {return a & 1;} +template bool _even(T a) {return !(a & 1);} + +/*======================= ROBERT'S GOT A QUICK HAND =======================*/ + +void solve() { + +} + +int main() { + ios_base::sync_with_stdio(0); cin.tie(0); + // int testcase; cin >> testcase; for (int i = 1; i <= testcase; ++i) + solve(); + return 0; +} +]]> + + template + + diff --git a/src/.config/zsh/Makefile b/src/.config/zsh/Makefile new file mode 100644 index 0000000..dd01458 --- /dev/null +++ b/src/.config/zsh/Makefile @@ -0,0 +1,11 @@ +.PHONY: all +all: autosuggestions syntax-highlighting tab-completions + +autosuggestions: + git clone https://github.com/zsh-users/zsh-autosuggestions ~/.config/zsh/plugins/zsh-autosuggestions + +syntax-highlighting: + git clone https://github.com/zdharma/fast-syntax-highlighting ~/.config/zsh/plugins/fast-syntax-highlighting + +tab-completions: + git clone https://github.com/zsh-users/zsh-completions ~/.config/zsh/plugins/zsh-completions \ No newline at end of file diff --git a/src/.config/zsh/keybindings.zsh b/src/.config/zsh/keybindings.zsh new file mode 100644 index 0000000..71eb801 --- /dev/null +++ b/src/.config/zsh/keybindings.zsh @@ -0,0 +1,108 @@ +# Keybindings adapted from :https://github.com/ohmyzsh/ohmyzsh/ +# All credit goes to the creators of oh-my-zsh + +# Make sure that the terminal is in application mode when zle is active, since +# only then values from $terminfo are valid +if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then + function zle-line-init() { + echoti smkx + } + function zle-line-finish() { + echoti rmkx + } + zle -N zle-line-init + zle -N zle-line-finish +fi + +# [PageUp] - Up a line of history +if [[ -n "${terminfo[kpp]}" ]]; then + bindkey -M emacs "${terminfo[kpp]}" up-line-or-history + bindkey -M viins "${terminfo[kpp]}" up-line-or-history + bindkey -M vicmd "${terminfo[kpp]}" up-line-or-history +fi +# [PageDown] - Down a line of history +if [[ -n "${terminfo[knp]}" ]]; then + bindkey -M emacs "${terminfo[knp]}" down-line-or-history + bindkey -M viins "${terminfo[knp]}" down-line-or-history + bindkey -M vicmd "${terminfo[knp]}" down-line-or-history +fi + +# Start typing + [Up-Arrow] - fuzzy find history forward +if [[ -n "${terminfo[kcuu1]}" ]]; then + autoload -U up-line-or-beginning-search + zle -N up-line-or-beginning-search + + bindkey -M emacs "${terminfo[kcuu1]}" up-line-or-beginning-search + bindkey -M viins "${terminfo[kcuu1]}" up-line-or-beginning-search + bindkey -M vicmd "${terminfo[kcuu1]}" up-line-or-beginning-search +fi +# Start typing + [Down-Arrow] - fuzzy find history backward +if [[ -n "${terminfo[kcud1]}" ]]; then + autoload -U down-line-or-beginning-search + zle -N down-line-or-beginning-search + + bindkey -M emacs "${terminfo[kcud1]}" down-line-or-beginning-search + bindkey -M viins "${terminfo[kcud1]}" down-line-or-beginning-search + bindkey -M vicmd "${terminfo[kcud1]}" down-line-or-beginning-search +fi + +# [Home] - Go to beginning of line +if [[ -n "${terminfo[khome]}" ]]; then + bindkey -M emacs "${terminfo[khome]}" beginning-of-line + bindkey -M viins "${terminfo[khome]}" beginning-of-line + bindkey -M vicmd "${terminfo[khome]}" beginning-of-line +fi +# [End] - Go to end of line +if [[ -n "${terminfo[kend]}" ]]; then + bindkey -M emacs "${terminfo[kend]}" end-of-line + bindkey -M viins "${terminfo[kend]}" end-of-line + bindkey -M vicmd "${terminfo[kend]}" end-of-line +fi + +# [Shift-Tab] - move through the completion menu backwards +if [[ -n "${terminfo[kcbt]}" ]]; then + bindkey -M emacs "${terminfo[kcbt]}" reverse-menu-complete + bindkey -M viins "${terminfo[kcbt]}" reverse-menu-complete + bindkey -M vicmd "${terminfo[kcbt]}" reverse-menu-complete +fi + +# [Backspace] - delete backward +bindkey -M emacs '^?' backward-delete-char +bindkey -M viins '^?' backward-delete-char +bindkey -M vicmd '^?' backward-delete-char +# [Delete] - delete forward +if [[ -n "${terminfo[kdch1]}" ]]; then + bindkey -M emacs "${terminfo[kdch1]}" delete-char + bindkey -M viins "${terminfo[kdch1]}" delete-char + bindkey -M vicmd "${terminfo[kdch1]}" delete-char +else + bindkey -M emacs "^[[3~" delete-char + bindkey -M viins "^[[3~" delete-char + bindkey -M vicmd "^[[3~" delete-char + + bindkey -M emacs "^[3;5~" delete-char + bindkey -M viins "^[3;5~" delete-char + bindkey -M vicmd "^[3;5~" delete-char +fi + +# [Ctrl-Delete] - delete whole forward-word +bindkey -M emacs '^[[3;5~' kill-word +bindkey -M viins '^[[3;5~' kill-word +bindkey -M vicmd '^[[3;5~' kill-word + +# [Ctrl-RightArrow] - move forward one word +bindkey -M emacs '^[[1;5C' forward-word +bindkey -M viins '^[[1;5C' forward-word +bindkey -M vicmd '^[[1;5C' forward-word +# [Ctrl-LeftArrow] - move backward one word +bindkey -M emacs '^[[1;5D' backward-word +bindkey -M viins '^[[1;5D' backward-word +bindkey -M vicmd '^[[1;5D' backward-word + +# Edit the current command line in $EDITOR +autoload -U edit-command-line +zle -N edit-command-line +bindkey '\C-x\C-e' edit-command-line + +# file rename magick +bindkey "^[m" copy-prev-shell-word \ No newline at end of file diff --git a/.vimrc b/src/.vimrc similarity index 74% rename from .vimrc rename to src/.vimrc index bde50e2..10697ca 100644 --- a/.vimrc +++ b/src/.vimrc @@ -10,17 +10,7 @@ set softtabstop=4 set expandtab set updatetime=250 set title -autocmd GUIEnter * set vb t_vb= set belloff=all -function! ToggleGUICruft() - if &guioptions=='' - exec('set guioptions=mT') - else - exec('set guioptions=') - endif -endfunction -noremap :call ToggleGUICruft() - "KEYBINDINGS nmap v @@ -39,6 +29,8 @@ vmap yi vmap di map pi map v$ +nmap 10j +nmap 10k imap pi map u map i @@ -50,7 +42,6 @@ map :bd map :q! map :tabnew# map :source ~/.vimrc -noremap i a " VUNDLE PLUGINS @@ -101,32 +92,19 @@ let g:NERDTreeWinPos = "right" let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#left_sep = ' ' let g:airline#extensions#tabline#left_alt_sep = '|' -let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py' -nnoremap :bprevious -nnoremap :bnext nmap :NERDTreeToggle let NERDTreeShowHidden=1 " THEMING -" set guioptions= -" let g:dracula_colorterm = 0 set termguicolors colorscheme dracula set background=dark hi Normal guibg=NONE ctermbg=NONE -" set guifont=Source\ Code\ Pro\ 10 - -" SYSTEM SPECIFIC SETTINGS -cd ~/Desktop/Coding\ Library/Ongoing -function! Templatecpp() - :1,$d - :read ~/Desktop/Coding\ Library/IDE/template.cpp - :1d -endfunction -command Template :call Templatecpp() -" COMPILE RUN -map :w:!g++ -o compiled.o % -std=c++17 && ./compiled.o -auto BufWritePost *.cpp execute 'silent :!astyle > /dev/null 2>&1'shellescape(expand('%'),1) +" CHANGE CURSOR SHAPE BASED ON MODE +" (Only works on VTE-based terminal) +let &t_SI = "\[6 q" +let &t_SR = "\[4 q" +let &t_EI = "\[2 q" diff --git a/src/.zshrc b/src/.zshrc new file mode 100644 index 0000000..19b5edc --- /dev/null +++ b/src/.zshrc @@ -0,0 +1,161 @@ +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +# Enable colors and change prompt: +autoload -U colors && colors # Load colors +setopt autocd # Automatically cd into typed directory. +stty stop undef # Disable ctrl-s to freeze terminal. +setopt interactive_comments + +# Basic auto/tab complete: +autoload -U compinit +zstyle ':completion:*' menu select '' 'm:{a-zA-Z}={A-Za-z}' +zmodload zsh/complist +compinit +_comp_options+=(globdots) # Include hidden files. + +# History in cache directory: +HISTSIZE=1000000 +SAVEHIST=1000000 +HISTFILE=~/.cache/.zsh_history + +### EXPORTS +export TERM="xterm-256color" # getting proper colors +export HISTORY_IGNORE="(ls|cd|pwd|exit|sudo reboot|history|cd -|cd ..)" + +### SET VI MODE ### +bindkey -v +bindkey -v "^?" backward-delete-char # Backspace interferes with vi mode +export KEYTIMEOUT=1 + +# Use Beam cursor in Insert mode +function zle-keymap-select { + if [[ ${KEYMAP} == vicmd ]] || + [[ $1 = 'block' ]]; then + echo -ne '\e[1 q' + elif [[ ${KEYMAP} == main ]] || + [[ ${KEYMAP} == viins ]] || + [[ ${KEYMAP} = '' ]] || + [[ $1 = 'beam' ]]; then + echo -ne '\e[5 q' + fi +} +zle -N zle-keymap-select +zle-line-init() { + zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere) + echo -ne "\e[5 q" +} +zle -N zle-line-init +echo -ne '\e[5 q' # Use beam shape cursor on startup. +preexec() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt. + + +### PATH +if [ -d "$HOME/.bin" ] ; + then PATH="$HOME/.bin:$PATH" +fi + +if [ -d "$HOME/.local/bin" ] ; + then PATH="$HOME/.local/bin:$PATH" +fi + +### ARCHIVE EXTRACTION +# usage: ex +ex () +{ + if [ -f $1 ] ; then + case $1 in + *.tar.bz2) tar xjf $1 ;; + *.tar.gz) tar xzf $1 ;; + *.bz2) bunzip2 $1 ;; + *.rar) unrar x $1 ;; + *.gz) gunzip $1 ;; + *.tar) tar xf $1 ;; + *.tbz2) tar xjf $1 ;; + *.tgz) tar xzf $1 ;; + *.zip) unzip $1 ;; + *.Z) uncompress $1;; + *.7z) 7z x $1 ;; + *.deb) ar x $1 ;; + *.tar.xz) tar xf $1 ;; + *.tar.zst) unzstd $1 ;; + *) echo "'$1' cannot be extracted via ex()" ;; + esac + else + echo "'$1' is not a valid file" + fi +} + + +### ALIASES ### +# =========== # +# switch between shells +alias tobash="sudo chsh $USER -s /bin/bash && echo 'Now log out.'" +alias tozsh="sudo chsh $USER -s /bin/zsh && echo 'Now log out.'" +alias tofish="sudo chsh $USER -s /bin/fish && echo 'Now log out.'" + +# navigation +alias ..='cd ..' +alias ...='cd ../..' +alias .3='cd ../../..' +alias .4='cd ../../../..' +alias .5='cd ../../../../..' + +# Colorize grep output (good for log files) +alias grep='grep --color=auto' +alias egrep='egrep --color=auto' +alias fgrep='fgrep --color=auto' + +# confirm before overwriting something +alias cp="cp -i" +alias mv='mv -i' +alias rm='rm -i' +alias np='nano -w PKGBUILD' +alias more=less +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' + +# adding flags +alias df='df -h' # human-readable sizes +alias free='free -m' # show sizes in MB +alias lynx='lynx -cfg=~/.lynx/lynx.cfg -lss=~/.lynx/lynx.lss -vikeys' +alias vifm='./.config/vifm/scripts/vifmrun' + +## get top process eating memory +alias psmem='ps auxf | sort -nr -k 4' +alias psmem10='ps auxf | sort -nr -k 4 | head -10' + +## get top process eating cpu ## +alias pscpu='ps auxf | sort -nr -k 3' +alias pscpu10='ps auxf | sort -nr -k 3 | head -10' + +### Fallback Prompt ### +PS1="%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magenta]%}%~%{$fg[red]%}]%{$reset_color%}$%b " + +### Starship Prompt ### +# =================== # +# Install using -> curl -fsSL https://starship.rs/install.sh | bash +eval "$(starship init zsh 2>/dev/null)" + +### PLUGIN CONFIGURATIONS ### +# ========================= # +# (Applicable for plugins installed in the section below) +### zsh-autosuggestions +ZSH_AUTOSUGGEST_USE_ASYNC=true +ZSH_AUTOSUGGEST_STRATEGY=(history completion match_prev_cmd) + +### PLUGINS/KEYBINDINGS ### +# ======================= # +# (MUST be at the end of file) +# Install using makefile at ~/.config/zsh... Ditch package managers +plugins () { + source ~/.config/zsh/keybindings.zsh + source ~/.config/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh + source ~/.config/zsh/plugins/fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh + source ~/.config/zsh/plugins/zsh-completions/zsh-completions.plugin.zsh # Better tab-completion +} +plugins || make -i -C ~/.config/zsh + +export NVM_DIR="/home/purhan/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm diff --git a/src/scripts/Makefile b/src/scripts/Makefile new file mode 100644 index 0000000..1bfd0a0 --- /dev/null +++ b/src/scripts/Makefile @@ -0,0 +1,67 @@ +.PHONY: all +all: debian + +.PHONY: debian +debian: essentials others apt snap snap-classic + +# Packages to be installed using apt +apt = firefox \ + chromium-browser \ + compton \ + rofi \ + vlc \ + peek \ + obs-studio \ + gnome-tweaks \ + htop \ + vim \ + awesome \ + python3-pip \ + python3-venv \ + fonts-powerline \ + npm \ + nodejs \ + kitty \ + zsh \ + fish \ + stow \ + arandr + +# Packages to be installed as snaps +snap = discord + +# Some snaps require confinement +snap-classic = sublime-text \ + code \ + postman + + +apt: + sudo apt-get install $(apt) + +snap: + sudo snap install $(snap) + +snap-classic: + for package in $(snap-classic) ; do \ + sudo snap install $$package --classic ; \ + done + +essentials: + ### INSTALLING ESSENTIAL PACKAGES ### + # ================================= # + sudo apt install \ + git \ + curl \ + +others: + ### SETTING UP SHELLS ### + # Install starship shell prompt + curl -fsSL https://starship.rs/install.sh | bash + + # Install zsh plugins + make -i -C ~/.config/zsh + + ### SETTING UP AWESOME ### + # ====================== # + make -i -C ~/.config/requirements/awesome diff --git a/src/scripts/monitor_setups/1.sh b/src/scripts/monitor_setups/1.sh new file mode 100755 index 0000000..d573c26 --- /dev/null +++ b/src/scripts/monitor_setups/1.sh @@ -0,0 +1,2 @@ +#!/bin/sh +xrandr --output eDP1 --mode 1280x720 --pos 0x0 --rotate normal --output HDMI1 --primary --mode 1920x1080 --pos 1280x0 --rotate normal --output VIRTUAL1 --off diff --git a/src/scripts/monitor_setups/2.sh b/src/scripts/monitor_setups/2.sh new file mode 100755 index 0000000..dcd19ff --- /dev/null +++ b/src/scripts/monitor_setups/2.sh @@ -0,0 +1,2 @@ +#!/bin/sh +xrandr --output eDP1 --same-as HDMI1 diff --git a/src/scripts/vampire.sh b/src/scripts/vampire.sh new file mode 100755 index 0000000..dbdd7aa --- /dev/null +++ b/src/scripts/vampire.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +shell=$(basename $SHELL) +kernel="$(uname -r | cut -d '-' -f1)" +wmname="$(xprop -id $(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}') -notype -f _NET_WM_NAME 8t | grep "WM_NAME" | cut -f2 -d \")" + + +# __.......__ +# .-:::::::::::::-. +# .:::''':::::::''':::. +# .:::' ':::' ':::. +# .'\ ::' ':' ':: /'. +# : \ :: :: / : +# : \': ___ ___ :'/ : +# : /\ ( •)\ /( •) /\ : +# : / .\ ‾‾ | | ‾‾ /. \ : +# : \ ( (_) ) / : +# : '_( )_' : +# '. \ < _____ > / .' +# '. \ \ / / .' +# '._ '-._ _.-' _.' +# .''-.__ .''-._.-''. __.-''. +# .' '. .' '. +# .' '-. .-' '. + +a=$'' # PURPLE +r=$'' # RED +w=$'' # WHITE +g=$'' # MAGENTA +t=$'' # GREEN +m=$'' # NORMAL +tput clear +cat << EOF + $a __.......__ + .-:::::::::::::-. + .:::''':::::::''':::. + .:::' ':::' ':::.$m + $g.'\ $a::'$m $a':'$m $a'::$g /'.$m + $g: \ $a::$m $a::$g / :$m + $g: \'$a:$m ___ ___ $a:$g'/ : + :$w /\ ( •)\ /$w( •)$w /\ $g: + :$w / .\ ‾‾ | | ‾‾ /. \ $g: + :$w \ ( (_) ) / $g: + :$w '_( )_' $g: + '.$w \ < _____ > / $g.' + '.$w \ $r\ /$g $w/ $g.' + '._$w '-._ _.-' $g _.' + $t .''-.__$w .''-._.-''.$t __.-''. + .' '. .' '. + .' '-. .-' '. $m +EOF \ No newline at end of file