aboutsummaryrefslogtreecommitdiffstats
path: root/basics
diff options
context:
space:
mode:
authorPeter Son Struschka <me@peter-struschka.com>2020-08-30 20:56:36 +0800
committerPeter Son Struschka <me@peter-struschka.com>2020-08-30 20:58:04 +0800
commit37dd411698bd6eae8365260dde39b8ae9c7cbd36 (patch)
tree978dd6ea3e72a86e4a3e0314b86d5137fc394785 /basics
parenta1d6fc2f3e6ab041cc51cb085ac59a646a126d25 (diff)
downloaddotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.tar.gz
dotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.tar.bz2
dotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.tar.lz
dotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.tar.xz
dotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.tar.zst
dotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.zip
all: overhaul, move dotfile specifics to .local/share/dotfiles and more
Diffstat (limited to 'basics')
-rw-r--r--basics/.config/alacritty/alacritty.yml70
-rw-r--r--basics/.config/bat/config27
-rw-r--r--basics/.config/dunst/dunstrc131
-rw-r--r--basics/.config/npm/npmrc3
-rw-r--r--basics/.config/user-dirs.dirs8
-rwxr-xr-xbasics/.local/bin/battery-monitor42
-rwxr-xr-xbasics/.local/bin/dmenu_pass5
-rwxr-xr-xbasics/.local/bin/locate-config4
-rwxr-xr-xbasics/.local/bin/statusbar/cpu54
-rwxr-xr-xbasics/.local/bin/statusbar/memory4
-rwxr-xr-xbasics/.local/bin/statusbar/swap8
-rwxr-xr-xbasics/.local/bin/sync-mirrors15
l---------basics/.local/share/dotfiles/dotfiles1
l---------basics/.local/share/dotfiles/edit-config.d/alacritty1
l---------basics/.local/share/dotfiles/edit-config.d/dunst1
l---------basics/.local/share/dotfiles/edit-config.d/kitty1
l---------basics/.local/share/dotfiles/edit-config.d/ranger1
l---------basics/.local/share/dotfiles/edit-config.d/rofi1
18 files changed, 309 insertions, 68 deletions
diff --git a/basics/.config/alacritty/alacritty.yml b/basics/.config/alacritty/alacritty.yml
index e84f5f4..ee87a85 100644
--- a/basics/.config/alacritty/alacritty.yml
+++ b/basics/.config/alacritty/alacritty.yml
@@ -50,8 +50,8 @@ window:
# - Fullscreen
startup_mode: Maximized
- # Window title
- #title: Alacritty
+ # Window terminal applications to change Alacritty's window title.
+ dynamic_title: true
# Window class (Linux/BSD only):
#class:
@@ -198,31 +198,46 @@ colors:
- { index: 20, color: '0xbdae93' }
- { index: 21, color: '0xebdbb2' }
-# Visual Bell
+# Bell
#
-# Any time the BEL code is received, Alacritty "rings" the visual bell. Once
-# rung, the terminal background will be set to white and transition back to the
-# default background color. You can control the rate of this transition by
-# setting the `duration` property (represented in milliseconds). You can also
-# configure the transition function by setting the `animation` property.
-#
-# Values for `animation`:
-# - Ease
-# - EaseOut
-# - EaseOutSine
-# - EaseOutQuad
-# - EaseOutCubic
-# - EaseOutQuart
-# - EaseOutQuint
-# - EaseOutExpo
-# - EaseOutCirc
-# - Linear
-#
-# Specifying a `duration` of `0` will disable the visual bell.
-visual_bell:
- animation: EaseOutExpo
- duration: 0
- color: '0xffffff'
+# The bell is rung every time the BEL control character is received.
+#bell:
+ # Visual Bell Animation
+ #
+ # Animation effect for flashing the screen when the visual bell is rung.
+ #
+ # Values for `animation`:
+ # - Ease
+ # - EaseOut
+ # - EaseOutSine
+ # - EaseOutQuad
+ # - EaseOutCubic
+ # - EaseOutQuart
+ # - EaseOutQuint
+ # - EaseOutExpo
+ # - EaseOutCirc
+ # - Linear
+ #animation: EaseOutExpo
+
+ # Duration of the visual bell flash. A `duration` of `0` will disable the
+ # visual bell animation.
+ #duration: 0
+
+ # Visual bell animation color.
+ #color: '#ffffff'
+
+ # Bell Command
+ #
+ # This program is executed whenever the bell is rung.
+ #
+ # When set to `command: None`, no command will be executed.
+ #
+ # Example:
+ # command:
+ # program: notify-send
+ # args: ["Hello, World!"]
+ #
+ #command: None
# Background opacity
#
@@ -286,9 +301,6 @@ selection:
# When set to `true`, selected text will be copied to the primary clipboard.
save_to_clipboard: false
-# Allow terminal applications to change Alacritty's window title.
-dynamic_title: true
-
cursor:
# Cursor style
#
diff --git a/basics/.config/bat/config b/basics/.config/bat/config
new file mode 100644
index 0000000..c4144ab
--- /dev/null
+++ b/basics/.config/bat/config
@@ -0,0 +1,27 @@
+# This is `bat`s configuration file. Each line either contains a comment or
+# a command-line option that you want to pass to `bat` by default. You can
+# run `bat --help` to get a list of all possible configuration options.
+
+# Specify desired highlighting theme (e.g. "TwoDark"). Run `bat --list-themes`
+# for a list of all available themes
+--theme="ansi-dark"
+
+# Enable this to use italic text on the terminal. This is not supported on all
+# terminal emulators (like tmux, by default):
+#--italic-text=always
+
+# Uncomment the following line to disable automatic paging:
+#--paging=never
+
+# Uncomment the following line if you are using less version >= 551 and want to
+# enable mouse scrolling support in `bat` when running inside tmux. This might
+# disable text selection, unless you press shift.
+#--pager="--RAW-CONTROL-CHARS --quit-if-one-screen --mouse"
+
+# Syntax mappings: map a certain filename pattern to a language.
+# Example 1: use the C++ syntax for .ino files
+# Example 2: Use ".gitignore"-style highlighting for ".ignore" files
+#--map-syntax "*.ino:C++"
+--map-syntax ".ignore:Git Ignore"
+
+--style="numbers,changes"
diff --git a/basics/.config/dunst/dunstrc b/basics/.config/dunst/dunstrc
index 74f0525..80c3445 100644
--- a/basics/.config/dunst/dunstrc
+++ b/basics/.config/dunst/dunstrc
@@ -29,7 +29,7 @@
# the top and down respectively.
# The width can be negative. In this case the actual width is the
# screen width minus the width defined in within the geometry option.
- geometry = "300x5-10+80"
+ geometry = "300x5-30+20"
# Show how many messages are currently hidden (because of geometry).
indicate_hidden = yes
@@ -80,7 +80,8 @@
# Don't remove messages, if the user is idle (no mouse or keyboard input)
# for longer than idle_threshold seconds.
# Set to 0 to disable.
- # Transient notifications ignore this setting.
+ # A client can set the 'transient' hint to bypass this. See the rules
+ # section for how to disable this if necessary
idle_threshold = 120
### Text ###
@@ -99,7 +100,7 @@
# <u>underline</u>
#
# For a complete reference see
- # <http://developer.gnome.org/pango/stable/PangoMarkupFormat.html>.
+ # <https://developer.gnome.org/pango/stable/pango-Markup.html>.
#
# strip: This setting is provided for compatibility with some broken
# clients that send markup even though it's not enabled on the
@@ -131,6 +132,10 @@
# Possible values are "left", "center" and "right".
alignment = left
+ # Vertical alignment of message text and icon.
+ # Possible values are "top", "center" and "bottom".
+ vertical_alignment = center
+
# Show age of message if message is older than show_age_threshold
# seconds.
# Set to -1 to disable.
@@ -140,17 +145,17 @@
# geometry.
word_wrap = yes
- # When word_wrap is set to no, specify where to ellipsize long lines.
+ # When word_wrap is set to no, specify where to make an ellipsis in long lines.
# Possible values are "start", "middle" and "end".
ellipsize = middle
# Ignore newlines '\n' in notifications.
ignore_newline = no
- # Merge multiple notifications with the same content
+ # Stack together notifications with the same content
stack_duplicates = true
- # Hide the count of merged notifications with the same content
+ # Hide the count of stacked notifications with the same content
hide_duplicate_count = false
# Display indicators for URLs (U) and actions (A).
@@ -159,13 +164,18 @@
### Icons ###
# Align icons left/right/off
- icon_position = off
+ icon_position = left
+
+ # Scale small icons up to this size, set to 0 to disable. Helpful
+ # for e.g. small files or high-dpi screens. In case of conflict,
+ # max_icon_size takes precedence over this.
+ min_icon_size = 0
# Scale larger icons down to this size, set to 0 to disable
max_icon_size = 32
# Paths to default icons.
- icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
+ icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/:/usr/share/icons/hicolor/scalable/apps/:/usr/share/icons/hicolor/32x32/apps:/usr/share/icons/hicolor/22x22/apps/
### History ###
@@ -182,7 +192,7 @@
dmenu = /usr/bin/dmenu -p dunst:
# Browser for opening urls in context menu.
- browser = /usr/bin/firefox -new-tab
+ browser = /usr/bin/firefox-developer-edition -new-tab
# Always run rule-defined scripts, even if the notification is suppressed
always_run_script = true
@@ -198,6 +208,28 @@
# automatically after a crash.
startup_notification = false
+ # Manage dunst's desire for talking
+ # Can be one of the following values:
+ # crit: Critical features. Dunst aborts
+ # warn: Only non-fatal warnings
+ # mesg: Important Messages
+ # info: all unimportant stuff
+ # debug: all less than unimportant stuff
+ verbosity = mesg
+
+ # Define the corner radius of the notification window
+ # in pixel size. If the radius is 0, you have no rounded
+ # corners.
+ # The radius will be automatically lowered if it exceeds half of the
+ # notification height to avoid clipping text and/or icons.
+ corner_radius = 0
+
+ # Ignore the dbus closeNotification message.
+ # Useful to enforce the timeout set by dunst configuration. Without this
+ # parameter, an application may close the notification sent before the
+ # user defined timeout.
+ ignore_dbusclose = false
+
### Legacy
# Use the Xinerama extension instead of RandR for multi-monitor support.
@@ -210,6 +242,21 @@
# layout changes.
force_xinerama = false
+ ### mouse
+
+ # Defines list of actions for each mouse event
+ # Possible values are:
+ # * none: Don't do anything.
+ # * do_action: If the notification has exactly one action, or one is marked as default,
+ # invoke it. If there are multiple and no default, open the context menu.
+ # * close_current: Close current notification.
+ # * close_all: Close all notifications.
+ # These values can be strung together for each mouse event, and
+ # will be executed in sequence.
+ mouse_left_click = close_current
+ mouse_middle_click = do_action, close_current
+ mouse_right_click = close_all
+
# Experimental features that may or may not work correctly. Do not expect them
# to have a consistent behaviour across releases.
[experimental]
@@ -218,7 +265,7 @@
# dunst will attempt to calculate an appropriate dpi value for each monitor
# using the resolution and physical size. This might be useful in setups
# where there are multiple screens with very different dpi values.
- per_monitor_dpi = false
+ per_monitor_dpi = true
[shortcuts]
@@ -268,11 +315,36 @@
# Every section that isn't one of the above is interpreted as a rules to
# override settings for certain messages.
-# Messages can be matched by "appname", "summary", "body", "icon", "category",
-# "msg_urgency" and you can override the "timeout", "urgency", "foreground",
-# "background", "new_icon" and "format".
+#
+# Messages can be matched by
+# appname (discouraged, see desktop_entry)
+# body
+# category
+# desktop_entry
+# icon
+# match_transient
+# msg_urgency
+# stack_tag
+# summary
+#
+# and you can override the
+# background
+# foreground
+# format
+# frame_color
+# fullscreen
+# new_icon
+# set_stack_tag
+# set_transient
+# timeout
+# urgency
+#
# Shell-like globbing will get expanded.
#
+# Instead of the appname filter, it's recommended to use the desktop_entry filter.
+# GLib based applications export their desktop-entry name. In comparison to the appname,
+# the desktop-entry won't get localized.
+#
# SCRIPTING
# You can specify a script that gets run when the rule matches by
# setting the "script" option.
@@ -285,6 +357,30 @@
# NOTE: It might be helpful to run dunst -print in a terminal in order
# to find fitting options for rules.
+# Disable the transient hint so that idle_threshold cannot be bypassed from the
+# client
+#[transient_disable]
+# match_transient = yes
+# set_transient = no
+#
+# Make the handling of transient notifications more strict by making them not
+# be placed in history.
+#[transient_history_ignore]
+# match_transient = yes
+# history_ignore = yes
+
+# fullscreen values
+# show: show the notifications, regardless if there is a fullscreen window opened
+# delay: displays the new notification, if there is no fullscreen window active
+# If the notification is already drawn, it won't get undrawn.
+# pushback: same as delay, but when switching into fullscreen, the notification will get
+# withdrawn from screen again and will get delayed like a new notification
+#[fullscreen_delay_everything]
+# fullscreen = delay
+#[fullscreen_show_critical]
+# msg_urgency = critical
+# fullscreen = show
+
#[espeak]
# summary = "*"
# script = dunst_espeak.sh
@@ -303,6 +399,11 @@
# summary = "foobar"
# history_ignore = yes
+#[skip-display]
+# # This notification will not be displayed, but will be included in the history
+# summary = "foobar"
+# skip_display = yes
+
#[signed_on]
# appname = Pidgin
# summary = "*signed on*"
@@ -323,4 +424,8 @@
# summary = *twitter.com*
# urgency = normal
#
+#[stack-volumes]
+# appname = "some_volume_notifiers"
+# set_stack_tag = "volume"
+#
# vim: ft=cfg
diff --git a/basics/.config/npm/npmrc b/basics/.config/npm/npmrc
index 3691078..d072ac3 100644
--- a/basics/.config/npm/npmrc
+++ b/basics/.config/npm/npmrc
@@ -3,3 +3,6 @@ cache=${XDG_CACHE_HOME}/npm
tmp=${XDG_RUNTIME_DIR}/npm
init-module=${XDG_CONFIG_HOME}/npm/config/npm-init.js
+
+sign-git-tag=false
+
diff --git a/basics/.config/user-dirs.dirs b/basics/.config/user-dirs.dirs
new file mode 100644
index 0000000..b564655
--- /dev/null
+++ b/basics/.config/user-dirs.dirs
@@ -0,0 +1,8 @@
+XDG_DESKTOP_DIR="$HOME/Desktop"
+XDG_DOCUMENTS_DIR="$HOME/Documents"
+XDG_DOWNLOAD_DIR="$HOME/Downloads"
+XDG_MUSIC_DIR="$HOME/Documents/Music"
+XDG_PICTURES_DIR="$HOME/Documents/Pictures"
+XDG_PUBLICSHARE_DIR="$HOME/Public"
+XDG_TEMPLATES_DIR="$HOME/Templates"
+XDG_VIDEOS_DIR="$HOME/Documents/Videos"
diff --git a/basics/.local/bin/battery-monitor b/basics/.local/bin/battery-monitor
index 1dfa7b6..cfcd41c 100755
--- a/basics/.local/bin/battery-monitor
+++ b/basics/.local/bin/battery-monitor
@@ -12,30 +12,28 @@ cap=$([ "$state" = "Charging" ] && printf "%d-%d\n" "${max}" "${now}" | bc || ec
remaining=$( printf "%d/%d\n" "${cap}" "${volt}" | bc -l )
current_rate=$( printf "%d/%d\n" "${rate}" "${volt}" | bc -l )
-echo $( [ "${current_rate}" != "0" ] && echo "not zero" || echo "is zero" )
+#echo $( [ "${current_rate}" != "0" ] && echo "not zero" || echo "is zero" )
seconds=$( [ "${current_rate}" != "0" ] && printf "3600*%f/%f\n" "${remaining}" "${current_rate}" | bc || echo "0")
time_remaining=$( date -ud "@${seconds}" "+%H:%M:%S" )
-echo "percentage ${percentage}%"
-echo "state ${state}"
-echo "rate ${rate}"
-echo "volt ${volt}"
-echo "now ${now}"
-echo "max ${max}"
-echo "cap ${cap}"
-echo "remaining ${remaining}"
-echo "current_rate ${current_rate}"
-echo "seconds ${seconds}"
-echo "time ${time_remaining}"
+#echo "percentage ${percentage}%"
+#echo "state ${state}"
+#echo "rate ${rate}"
+#echo "volt ${volt}"
+#echo "now ${now}"
+#echo "max ${max}"
+#echo "cap ${cap}"
+#echo "remaining ${remaining}"
+#echo "current_rate ${current_rate}"
+#echo "seconds ${seconds}"
+#echo "time ${time_remaining}"
-exit 0
battery_level=`acpi -b | cut -d ' ' -f 4 | grep -o '[0-9]*'`
battery_level=$(head -n1 /sys/class/power_supply/BAT0/capacity)
battery_state=$(acpi | grep 'Battery' | sed 's/Battery\s[0-9]*: //' | sed 's/, [0-9][0-9]*\%.*//')
battery_state=$(head -n1 /sys/class/power_supply/BAT0/status)
battery_remaining=$(acpi | grep -oh '[0-9:]* remaining' | sed 's/:\w\w remaining$/ Minutes/' | sed 's/00://' | sed 's/:/h /')
-kk
if [ ! -f "/tmp/.battery" ]; then
echo "$battery_level" > /tmp/.battery
@@ -43,31 +41,31 @@ if [ ! -f "/tmp/.battery" ]; then
exit
fi
-previous_battery_level=$(cat /tmp/.battery | head -n 1)
-previous_battery_state=$(cat /tmp/.battery | tail -n 1)
+previous_battery_level=$(head -n 1 < /tmp/.battery)
+previous_battery_state=$(tail -n 1 < /tmp/.battery)
echo "$battery_level" > /tmp/.battery
echo "$battery_state" >> /tmp/.battery
checkBatteryLevel() {
- if [ $battery_state != "Discharging" ] || [ "${battery_level}" == "${previous_battery_level}" ]; then
+ if [ "$battery_state" != "Discharging" ] || [ "${battery_level}" = "${previous_battery_level}" ]; then
exit
fi
- if [ $battery_level -le 4 ]; then
+ if [ "$battery_level" -le 4 ]; then
sudo systemctl suspend
- elif [ $battery_level -le 7 ]; then
+ elif [ "$battery_level" -le 7 ]; then
notify-send "Low Battery" "(${time_remaining}) Your computer will suspend soon unless plugged into a power outlet." -u critical
- elif [ $battery_level -le 10 ]; then
+ elif [ "$battery_level" -le 10 ]; then
notify-send "Low Battery" "${battery_level}% (${time_remaining}) of battery remaining." -u normal
fi
}
checkBatteryStateChange() {
- if [ "$battery_state" != "Discharging" ] && [ "$previous_battery_state" == "Discharging" ]; then
+ if [ "$battery_state" != "Discharging" ] && [ "$previous_battery_state" = "Discharging" ]; then
notify-send "Charging" "Battery is now plugged in." -u low
fi
- if [ "$battery_state" == "Discharging" ] && [ "$previous_battery_state" != "Discharging" ]; then
+ if [ "$battery_state" = "Discharging" ] && [ "$previous_battery_state" != "Discharging" ]; then
notify-send "Power Unplugged" "Your computer has been disconnected from power." -u low
fi
}
diff --git a/basics/.local/bin/dmenu_pass b/basics/.local/bin/dmenu_pass
new file mode 100755
index 0000000..02250be
--- /dev/null
+++ b/basics/.local/bin/dmenu_pass
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+prompt=${1:-Password}
+
+dmenu -P -p "$prompt" <&-
diff --git a/basics/.local/bin/locate-config b/basics/.local/bin/locate-config
index 26fd2cb..2f8dc3d 100755
--- a/basics/.local/bin/locate-config
+++ b/basics/.local/bin/locate-config
@@ -2,11 +2,11 @@
set -e
-config_dir="$HOME/.local/share/config-files"
+config_dir="$HOME/.local/share/dotfiles/edit-config.d"
p="Config:"
-sel=$(find "$config_dir" -writable -type l | cut -d "/" -f 7- | sort -d | dmenu -p "$p" -l 20)
+sel=$(find "$config_dir" -writable -type l | cut -d "/" -f 8- | sort -d | dmenu -p "$p" -l 20)
ec=$?
[ "$ec" -ne 0 ] && exit $ec
diff --git a/basics/.local/bin/statusbar/cpu b/basics/.local/bin/statusbar/cpu
new file mode 100755
index 0000000..6a89024
--- /dev/null
+++ b/basics/.local/bin/statusbar/cpu
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+# TODO: finish it
+
+# /proc/stat format:
+# cpu[n] user nice system idle iowait irq softirq steal guest guest_nice
+
+# format user nice system idle steal total
+# total = user + nice + system + idle + steal
+prevstat=$(awk '
+/^cpu[0-9]+/ {print $2, $3, $4, $5, $9, ($2 + $3 + $4 + $5 + $9)}' /proc/stat)
+
+sleep 0.5
+
+
+stat=$(awk '
+/^cpu[0-9]+/ {print $2, $3, $4, $5, $9, ($2 + $3 + $4 + $5 + $9)}' /proc/stat)
+
+
+num_cpu=$(echo "$stat" | wc -l)
+
+get_load() {
+ line=${1:-1}
+ last=$(echo "$stat" | sed "${line}q;d")
+ prev=$(echo "$prevstat" | sed "${line}q;d")
+ read -r u n s last_idle st last_total <<< "$last"
+ #echo "$u $n $s $last_idle $st $last_total"
+ read -r u n s prev_idle st prev_total <<< "$prev"
+ #echo "$u $n $s $prev_idle $st $prev_total"
+ diff=$(echo "$last_total $prev_total" | awk '{printf "%d", $1 - $2}')
+ [ "$diff" = "0" ] && return
+ percentage=$(echo "$diff $last_idle $prev_idle" | awk '{printf "%.2f", 100.0 * (($1 - ($2 - $3)) / $1)}')
+ echo -e "$percentage"
+}
+
+total_load=0
+
+for i in $(seq 1 "$num_cpu"); do
+ load=$(get_load "$i")
+ total_load=$(echo "$total_load $load" | awk '{printf "%.2f", $1 + $2}')
+done
+
+total_percentage=$(echo "$total_load $num_cpu" | awk '{printf "%.2f", ($1 / $2) + 0.5}')
+echo -e "$total_percentage"
+
+#read -r cpu a b c previdle rest < /proc/stat
+#prevtotal=$((a+b+c+previdle))
+#sleep 0.5
+#read -r cpu a b c idle rest < /proc/stat
+#total=$((a+b+c+idle))
+#cpu=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))
+#echo -e "$cpu"
+
+exit 0
diff --git a/basics/.local/bin/statusbar/memory b/basics/.local/bin/statusbar/memory
index 7a952d8..77f462b 100755
--- a/basics/.local/bin/statusbar/memory
+++ b/basics/.local/bin/statusbar/memory
@@ -13,8 +13,8 @@ print Total ":" Available ":" Free ":" Buffers ":" Cached ":" SReclaimable ":" S
echo "$meminfo" |
while IFS=: read -r t a f b c sr sh; do
- memfree=$(echo "$a $t" | awk '{printf "%.3f", ($1 / $2) * 100}')
- memused=$(echo "$memfree" | awk '{printf "%.3f", (100 - $1)}')
+ memfree=$(echo "$a $t" | awk '{printf "%.2f", ($1 / $2) * 100}')
+ memused=$(echo "$memfree" | awk '{printf "%.2f", (100 - $1)}')
# Percentage values
# TODO: other values, controllable by flags?
diff --git a/basics/.local/bin/statusbar/swap b/basics/.local/bin/statusbar/swap
new file mode 100755
index 0000000..787ed23
--- /dev/null
+++ b/basics/.local/bin/statusbar/swap
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+awk '
+/^SwapTotal:/ {Total=$2/(1024 * 1024)}
+/^SwapFree:/ {Free=$2/(1024 * 1024)}
+/^SwapCached:/ {Cached=$2/(1024 * 1024)}
+END {
+printf "%.2f %.2f %.2f %.2f\n", Total, Free, Cached, (Total - Free)}' /proc/meminfo
diff --git a/basics/.local/bin/sync-mirrors b/basics/.local/bin/sync-mirrors
new file mode 100755
index 0000000..dc5fb0c
--- /dev/null
+++ b/basics/.local/bin/sync-mirrors
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+sudo reflector \
+ -c "Australia" \
+ -c "New Zealand" \
+ -c "Hong Kong" \
+ -c "Singapore" \
+ -c "Philipines" \
+ -c "Malaysia" \
+ -c "Indonesia" \
+ -c "Thailand" \
+ -c "Vietnam" \
+ -c "China" \
+ --age 12 --fastest 30 --latest 30 --verbose --save /etc/pacman.d/mirrorlist
+
diff --git a/basics/.local/share/dotfiles/dotfiles b/basics/.local/share/dotfiles/dotfiles
new file mode 120000
index 0000000..11a54ed
--- /dev/null
+++ b/basics/.local/share/dotfiles/dotfiles
@@ -0,0 +1 @@
+../../../../ \ No newline at end of file
diff --git a/basics/.local/share/dotfiles/edit-config.d/alacritty b/basics/.local/share/dotfiles/edit-config.d/alacritty
new file mode 120000
index 0000000..959d41c
--- /dev/null
+++ b/basics/.local/share/dotfiles/edit-config.d/alacritty
@@ -0,0 +1 @@
+../../../../.config/alacritty/alacritty.yml \ No newline at end of file
diff --git a/basics/.local/share/dotfiles/edit-config.d/dunst b/basics/.local/share/dotfiles/edit-config.d/dunst
new file mode 120000
index 0000000..91aecb1
--- /dev/null
+++ b/basics/.local/share/dotfiles/edit-config.d/dunst
@@ -0,0 +1 @@
+../../../../.config/dunst/dunstrc \ No newline at end of file
diff --git a/basics/.local/share/dotfiles/edit-config.d/kitty b/basics/.local/share/dotfiles/edit-config.d/kitty
new file mode 120000
index 0000000..c860ad6
--- /dev/null
+++ b/basics/.local/share/dotfiles/edit-config.d/kitty
@@ -0,0 +1 @@
+../../../../.config/kitty/kitty.conf \ No newline at end of file
diff --git a/basics/.local/share/dotfiles/edit-config.d/ranger b/basics/.local/share/dotfiles/edit-config.d/ranger
new file mode 120000
index 0000000..61a6f81
--- /dev/null
+++ b/basics/.local/share/dotfiles/edit-config.d/ranger
@@ -0,0 +1 @@
+../../../../.config/ranger/rc.conf \ No newline at end of file
diff --git a/basics/.local/share/dotfiles/edit-config.d/rofi b/basics/.local/share/dotfiles/edit-config.d/rofi
new file mode 120000
index 0000000..3e3a50f
--- /dev/null
+++ b/basics/.local/share/dotfiles/edit-config.d/rofi
@@ -0,0 +1 @@
+../../../../.config/rofi/config \ No newline at end of file