diff --git a/.bashrc.d/aliases.sh b/.bashrc.d/aliases.sh index 13497e2..6abf2b4 100644 --- a/.bashrc.d/aliases.sh +++ b/.bashrc.d/aliases.sh @@ -22,9 +22,3 @@ alias ll='ls -alhF' alias la='ls -A' alias ls='ls --color=auto' alias grep='grep --color=auto' -alias fgrep='fgrep --color=auto' -alias egrep='egrep --color=auto' - -# Add an "alert" alias for long running commands. Use like so: -# $ sleep 10; alert -alias alert='notify-send --urgency=critical -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')" && printf "\7"' diff --git a/.bashrc.d/completions.sh b/.bashrc.d/completions.sh index f1e035f..15a2b6a 100644 --- a/.bashrc.d/completions.sh +++ b/.bashrc.d/completions.sh @@ -20,8 +20,6 @@ _have minikube && source <(minikube completion bash) # shellcheck disable=SC1090 _have kubectl && source <(kubectl completion bash) -_have pipenv && eval "$(pipenv --completion)" - if _have pip3; then _pip_completion() { # shellcheck disable=SC2207 diff --git a/config/alacritty/alacritty.yml b/.config/alacritty/alacritty.yml similarity index 100% rename from config/alacritty/alacritty.yml rename to .config/alacritty/alacritty.yml diff --git a/config/alacritty/xterm.yaml b/.config/alacritty/xterm.yaml similarity index 100% rename from config/alacritty/xterm.yaml rename to .config/alacritty/xterm.yaml diff --git a/config/htop/htoprc b/.config/htop/htoprc similarity index 100% rename from config/htop/htoprc rename to .config/htop/htoprc diff --git a/config/jetbrains/codestyles/hackerman.xml b/.config/jetbrains/codestyles/hackerman.xml similarity index 100% rename from config/jetbrains/codestyles/hackerman.xml rename to .config/jetbrains/codestyles/hackerman.xml diff --git a/config/jetbrains/colors/hackerman.icls b/.config/jetbrains/colors/hackerman.icls similarity index 100% rename from config/jetbrains/colors/hackerman.icls rename to .config/jetbrains/colors/hackerman.icls diff --git a/config/jetbrains/keymaps/hackerman.xml b/.config/jetbrains/keymaps/hackerman.xml similarity index 100% rename from config/jetbrains/keymaps/hackerman.xml rename to .config/jetbrains/keymaps/hackerman.xml diff --git a/config/jetbrains/options/DontShowAgainFeedbackService.xml b/.config/jetbrains/options/DontShowAgainFeedbackService.xml similarity index 100% rename from config/jetbrains/options/DontShowAgainFeedbackService.xml rename to .config/jetbrains/options/DontShowAgainFeedbackService.xml diff --git a/config/jetbrains/options/baseRefactoring.xml b/.config/jetbrains/options/baseRefactoring.xml similarity index 100% rename from config/jetbrains/options/baseRefactoring.xml rename to .config/jetbrains/options/baseRefactoring.xml diff --git a/config/jetbrains/options/code.style.schemes.xml b/.config/jetbrains/options/code.style.schemes.xml similarity index 100% rename from config/jetbrains/options/code.style.schemes.xml rename to .config/jetbrains/options/code.style.schemes.xml diff --git a/config/jetbrains/options/colors.scheme.xml b/.config/jetbrains/options/colors.scheme.xml similarity index 100% rename from config/jetbrains/options/colors.scheme.xml rename to .config/jetbrains/options/colors.scheme.xml diff --git a/config/jetbrains/options/completionMLRanking.xml b/.config/jetbrains/options/completionMLRanking.xml similarity index 100% rename from config/jetbrains/options/completionMLRanking.xml rename to .config/jetbrains/options/completionMLRanking.xml diff --git a/config/jetbrains/options/customization.xml b/.config/jetbrains/options/customization.xml similarity index 100% rename from config/jetbrains/options/customization.xml rename to .config/jetbrains/options/customization.xml diff --git a/config/jetbrains/options/debugger.xml b/.config/jetbrains/options/debugger.xml similarity index 100% rename from config/jetbrains/options/debugger.xml rename to .config/jetbrains/options/debugger.xml diff --git a/config/jetbrains/options/diff.xml b/.config/jetbrains/options/diff.xml similarity index 100% rename from config/jetbrains/options/diff.xml rename to .config/jetbrains/options/diff.xml diff --git a/config/jetbrains/options/editor-font.xml b/.config/jetbrains/options/editor-font.xml similarity index 100% rename from config/jetbrains/options/editor-font.xml rename to .config/jetbrains/options/editor-font.xml diff --git a/config/jetbrains/options/editor.codeinsight.xml b/.config/jetbrains/options/editor.codeinsight.xml similarity index 100% rename from config/jetbrains/options/editor.codeinsight.xml rename to .config/jetbrains/options/editor.codeinsight.xml diff --git a/config/jetbrains/options/editor.xml b/.config/jetbrains/options/editor.xml similarity index 100% rename from config/jetbrains/options/editor.xml rename to .config/jetbrains/options/editor.xml diff --git a/config/jetbrains/options/filetypes.xml b/.config/jetbrains/options/filetypes.xml similarity index 100% rename from config/jetbrains/options/filetypes.xml rename to .config/jetbrains/options/filetypes.xml diff --git a/config/jetbrains/options/find.xml b/.config/jetbrains/options/find.xml similarity index 100% rename from config/jetbrains/options/find.xml rename to .config/jetbrains/options/find.xml diff --git a/config/jetbrains/options/gutter.xml b/.config/jetbrains/options/gutter.xml similarity index 100% rename from config/jetbrains/options/gutter.xml rename to .config/jetbrains/options/gutter.xml diff --git a/config/jetbrains/options/ide.general.xml b/.config/jetbrains/options/ide.general.xml similarity index 100% rename from config/jetbrains/options/ide.general.xml rename to .config/jetbrains/options/ide.general.xml diff --git a/config/jetbrains/options/keymap.xml b/.config/jetbrains/options/keymap.xml similarity index 100% rename from config/jetbrains/options/keymap.xml rename to .config/jetbrains/options/keymap.xml diff --git a/config/jetbrains/options/lightEdit.xml b/.config/jetbrains/options/lightEdit.xml similarity index 100% rename from config/jetbrains/options/lightEdit.xml rename to .config/jetbrains/options/lightEdit.xml diff --git a/config/jetbrains/options/linux/keymap.xml b/.config/jetbrains/options/linux/keymap.xml similarity index 100% rename from config/jetbrains/options/linux/keymap.xml rename to .config/jetbrains/options/linux/keymap.xml diff --git a/config/jetbrains/options/markdown.xml b/.config/jetbrains/options/markdown.xml similarity index 100% rename from config/jetbrains/options/markdown.xml rename to .config/jetbrains/options/markdown.xml diff --git a/config/jetbrains/options/notifications.xml b/.config/jetbrains/options/notifications.xml similarity index 100% rename from config/jetbrains/options/notifications.xml rename to .config/jetbrains/options/notifications.xml diff --git a/config/jetbrains/options/plugin_ui.xml b/.config/jetbrains/options/plugin_ui.xml similarity index 100% rename from config/jetbrains/options/plugin_ui.xml rename to .config/jetbrains/options/plugin_ui.xml diff --git a/config/jetbrains/options/profiler.xml b/.config/jetbrains/options/profiler.xml similarity index 100% rename from config/jetbrains/options/profiler.xml rename to .config/jetbrains/options/profiler.xml diff --git a/config/jetbrains/options/project.default.xml b/.config/jetbrains/options/project.default.xml similarity index 100% rename from config/jetbrains/options/project.default.xml rename to .config/jetbrains/options/project.default.xml diff --git a/config/jetbrains/options/settingsSync.xml b/.config/jetbrains/options/settingsSync.xml similarity index 100% rename from config/jetbrains/options/settingsSync.xml rename to .config/jetbrains/options/settingsSync.xml diff --git a/config/jetbrains/options/ui.lnf.xml b/.config/jetbrains/options/ui.lnf.xml similarity index 100% rename from config/jetbrains/options/ui.lnf.xml rename to .config/jetbrains/options/ui.lnf.xml diff --git a/config/jetbrains/options/usageView.xml b/.config/jetbrains/options/usageView.xml similarity index 100% rename from config/jetbrains/options/usageView.xml rename to .config/jetbrains/options/usageView.xml diff --git a/config/jetbrains/options/vcs.xml b/.config/jetbrains/options/vcs.xml similarity index 100% rename from config/jetbrains/options/vcs.xml rename to .config/jetbrains/options/vcs.xml diff --git a/config/jetbrains/options/workspace.xml b/.config/jetbrains/options/workspace.xml similarity index 100% rename from config/jetbrains/options/workspace.xml rename to .config/jetbrains/options/workspace.xml diff --git a/config/lazygit/config.yml b/.config/lazygit/config.yml similarity index 100% rename from config/lazygit/config.yml rename to .config/lazygit/config.yml diff --git a/config/powerline/config.json b/.config/powerline/config.json similarity index 100% rename from config/powerline/config.json rename to .config/powerline/config.json diff --git a/config/powerline/themes/shell/continuation.json b/.config/powerline/themes/shell/continuation.json similarity index 100% rename from config/powerline/themes/shell/continuation.json rename to .config/powerline/themes/shell/continuation.json diff --git a/config/powerline/themes/shell/default.json b/.config/powerline/themes/shell/default.json similarity index 100% rename from config/powerline/themes/shell/default.json rename to .config/powerline/themes/shell/default.json diff --git a/config/powerline/themes/shell/select.json b/.config/powerline/themes/shell/select.json similarity index 100% rename from config/powerline/themes/shell/select.json rename to .config/powerline/themes/shell/select.json diff --git a/config/powerline/themes/tmux/default.json b/.config/powerline/themes/tmux/default.json similarity index 100% rename from config/powerline/themes/tmux/default.json rename to .config/powerline/themes/tmux/default.json diff --git a/config/vimium/options.json b/.config/vimium/options.json similarity index 100% rename from config/vimium/options.json rename to .config/vimium/options.json diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b8832a6..fccfaa2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,7 +22,7 @@ jobs: - uses: actions/checkout@v3 - name: "Test installation" - run: make install + run: make auto-install lint: name: "Lint" diff --git a/.gitignore b/.gitignore index 63d46cc..1e5b400 100644 --- a/.gitignore +++ b/.gitignore @@ -2,20 +2,20 @@ .vscode *.zip -/config/jetbrains/codestyles/Default.xml -/config/jetbrains/colors/_@user_Darcula.icls -/config/jetbrains/colors/_@user_Default.icls -/config/jetbrains/colors/_@user_High ontrast.icls -/config/jetbrains/options/applicationLibraries.xml -/config/jetbrains/options/docker.xml -/config/jetbrains/options/jdk.table.xml -/config/jetbrains/options/remote-servers.xml -/config/jetbrains/options/databaseDrivers.xml -/config/jetbrains/options/FeatureSuggester.xml -/config/jetbrains/options/ide-features-trainer.xml -/config/jetbrains/options/go.sdk.xml -/config/jetbrains/options/laf.xml -/config/jetbrains/options/nodejs.xml -/config/jetbrains/options/updates.xml -/config/jetbrains/installed.txt -/config/jetbrains/IntelliJ IDEA Global Settings +/.config/jetbrains/codestyles/Default.xml +/.config/jetbrains/colors/_@user_Darcula.icls +/.config/jetbrains/colors/_@user_Default.icls +/.config/jetbrains/colors/_@user_High ontrast.icls +/.config/jetbrains/options/applicationLibraries.xml +/.config/jetbrains/options/docker.xml +/.config/jetbrains/options/jdk.table.xml +/.config/jetbrains/options/remote-servers.xml +/.config/jetbrains/options/databaseDrivers.xml +/.config/jetbrains/options/FeatureSuggester.xml +/.config/jetbrains/options/ide-features-trainer.xml +/.config/jetbrains/options/go.sdk.xml +/.config/jetbrains/options/laf.xml +/.config/jetbrains/options/nodejs.xml +/.config/jetbrains/options/updates.xml +/.config/jetbrains/installed.txt +/.config/jetbrains/IntelliJ IDEA Global Settings diff --git a/.profile.d/exports.sh b/.profile.d/exports.sh index 0b48139..3b9ffe6 100644 --- a/.profile.d/exports.sh +++ b/.profile.d/exports.sh @@ -1,11 +1,5 @@ # shellcheck disable=SC2148 -export EDITOR="code --wait --new-window" -export VISUAL="code --wait --new-window" -export MANPAGER="sh -c 'col -bx | bat -l man -p'" -export MANROFFOPT="-c" -export BROWSER="google-chrome" - # Don't put duplicate lines or lines starting with space in the history. export HISTCONTROL=ignoreboth # Increase the maximum number of commands recorded. @@ -26,9 +20,20 @@ export POWERLINE_BASH_CONTINUATION=1 export POWERLINE_BASH_SELECT=1 export HOMEBREW_NO_ANALYTICS=1 -eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" -# Set PATH so it includes user's private bin. +if _have /home/linuxbrew/.linuxbrew/bin/brew; then + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" +fi + +if _have code; then + export EDITOR="code --wait --new-window" + export VISUAL="code --wait --new-window" +fi + +if _have bat; then + export MANPAGER="sh -c 'col -bx | bat -l man -p'" + export MANROFFOPT="-c" +fi if [ -d "$HOME/bin" ]; then PATH="$HOME/bin:$PATH" diff --git a/Makefile b/Makefile index ae8631c..231ab1b 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,246 @@ -.PHONY: install +##@ General -check: fmt lint +help: ## Display this help. + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-20s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) -fmt: ## format code - shfmt -w -s . +auto-install: ## Run automated installation. + @./install.sh -lint: ## run lint check - shfmt -d -s . - shellcheck $$(shfmt -f .) +##@ Operating systems -install: ## install the setup - @install/main.sh +fedora-workstation: configuration gnome dnf-packages tpm ## Install Fedora Workstation setup. -fingerprint: ## generate SHA-256 fingerprint of the dotfiles - @git ls-files | xargs -I {} sha256sum "{}" | cut -d " " -f 1 | sha256sum | cut -d " " -f 1 +ubuntu-desktop: configuration gnome apt-packages tpm ## Install Ubuntu Desktop setup. + sudo ubuntu-drivers install -help: - @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | sort + sudo sed -E -i '/(en_US.UTF-8|en_GB.UTF-8)/s/^# //g' /etc/locale.gen + sudo locale-gen + sudo update-locale \ + LANG='en_US.UTF-8' \ + LC_ADDRESS='en_US.UTF-8' \ + LC_NAME='en_US.UTF-8' \ + LC_MONETARY='en_US.UTF-8' \ + LC_PAPER='en_GB.UTF-8' \ + LC_IDENTIFICATION='en_US.UTF-8' \ + LC_TELEPHONE='en_US.UTF-8' \ + LC_MEASUREMENT='en_GB.UTF-8' \ + LC_TIME='en_GB.UTF-8' \ + LC_NUMERIC='en_GB.UTF-8' + +macos: configuration homebrew homebrew-packages tpm ## Install macOS setup. + +github-codespaces: configuration apt-packages tpm ## Install GitHub Codespaces setup. + sudo sed -E -i '/(en_US.UTF-8|en_GB.UTF-8)/s/^# //g' /etc/locale.gen + sudo locale-gen + sudo update-locale \ + LANG='en_US.UTF-8' \ + LC_ADDRESS='en_US.UTF-8' \ + LC_NAME='en_US.UTF-8' \ + LC_MONETARY='en_US.UTF-8' \ + LC_PAPER='en_GB.UTF-8' \ + LC_IDENTIFICATION='en_US.UTF-8' \ + LC_TELEPHONE='en_US.UTF-8' \ + LC_MEASUREMENT='en_GB.UTF-8' \ + LC_TIME='en_GB.UTF-8' \ + LC_NUMERIC='en_GB.UTF-8' + +##@ Desktop environments + +gnome: ## Apply GNOME settings. + # Keybindings. + gsettings set org.gnome.desktop.wm.keybindings switch-applications "[]" + gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward "[]" + gsettings set org.gnome.desktop.wm.keybindings switch-group "[]" + gsettings set org.gnome.desktop.wm.keybindings switch-group-backward "[]" + gsettings set org.gnome.desktop.wm.keybindings switch-windows "[]" + gsettings set org.gnome.desktop.wm.keybindings switch-windows-backward "[]" + gsettings set org.gnome.shell.keybindings toggle-application-view "[]" + gsettings set org.gnome.settings-daemon.plugins.media-keys logout "['End']" + gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-right "['Right']" + gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-left "['Left']" + gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right "['Above_Tab', 'Right']" + gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left "['Above_Tab', 'Left']" + gsettings set org.gnome.desktop.wm.keybindings show-desktop "['d']" + gsettings set org.gnome.desktop.wm.keybindings cycle-windows "['Tab']" + gsettings set org.gnome.desktop.wm.keybindings cycle-windows-backward "['Tab']" + gsettings set org.gnome.desktop.wm.keybindings toggle-fullscreen "['F11']" + gsettings set org.gnome.desktop.wm.keybindings close "['q']" + + # Keyboard. + gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us'), ('xkb', 'bg+phonetic')]" + gsettings set org.gnome.desktop.input-sources per-window true + gsettings set org.gnome.desktop.a11y.keyboard mousekeys-enable true + gsettings set org.gnome.desktop.a11y.keyboard mousekeys-max-speed 1100 + gsettings set org.gnome.desktop.a11y.keyboard mousekeys-init-delay 60 + gsettings set org.gnome.desktop.a11y.keyboard mousekeys-accel-time 600 + gsettings set org.gnome.desktop.a11y.keyboard mousekeys-accel-time 600 + + # Night light. + gsettings set org.gnome.settings-daemon.plugins.color night-light-enabled true + gsettings set org.gnome.settings-daemon.plugins.color night-light-schedule-automatic false + gsettings set org.gnome.settings-daemon.plugins.color night-light-schedule-from 5 + gsettings set org.gnome.settings-daemon.plugins.color night-light-schedule-to 5 + gsettings set org.gnome.settings-daemon.plugins.color night-light-temperature 2700 + + # Power. + gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'suspend' + gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 5400 + gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-type 'suspend' + gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-timeout 3600 + + # Appearance. + gsettings set org.gnome.desktop.interface clock-show-date true + gsettings set org.gnome.desktop.interface clock-show-weekday true + gsettings set org.gnome.desktop.interface clock-format '24h' + gsettings set org.gnome.desktop.interface show-battery-percentage true + + # Miscellaneous. + gsettings set org.gnome.system.locale region 'en_GB.UTF-8' + gsettings set org.gnome.desktop.media-handling autorun-never true + gsettings set org.gnome.desktop.privacy send-software-usage-stats false + gsettings set org.gnome.desktop.privacy report-technical-problems false + gsettings set org.gnome.mutter center-new-windows true + gsettings set org.gtk.Settings.FileChooser show-hidden true + gsettings set org.gtk.Settings.FileChooser sort-directories-first true + gsettings set org.gnome.nautilus.preferences show-delete-permanently true + gsettings set org.gnome.nautilus.preferences show-hidden-files true + +##@ Software + +dnf-packages: ## Install DNF packages. + sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc && \ + sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo' && \ + dnf check-update && \ + sudo dnf install -y code + + sudo dnf install -y \ + lshw \ + nmap \ + powerline \ + powerline-fonts \ + tmux \ + tmux-powerline \ + htop \ + iftop \ + bat \ + alacritty + +apt-packages: ## Install APT packages. + sudo apt-get update && sudo apt-get upgrade -y + + sudo apt-get install -y \ + curl \ + whois \ + net-tools \ + apt-transport-https \ + ca-certificates \ + gnupg \ + software-properties-common \ + nmap \ + htop \ + iftop \ + tmux \ + tree \ + xclip \ + powerline \ + fonts-powerline \ + bat \ + git \ + cmake \ + ruby-dev \ + shc \ + python3-pip \ + pipenv \ + python3-tk \ + libseccomp-dev \ + protobuf-compiler \ + imagemagick \ + gimp + +homebrew-packages: ## Install Homebrew packages. + brew install go + brew install node + brew install helm + brew install kubectl + brew install minikube + brew install k9s + brew install lazygit + brew install shellcheck + brew install shfmt + brew install hugo + +homebrew: ## Install Homebrew. + bash -c "$$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + brew analytics off + +TPM_REPOSITORY = https://github.com/tmux-plugins/tpm +TPM_RELEASE = v3.1.0 +TPM_DIR = ~/.tmux/plugins/tpm + +tpm: ## Install Tmux Plugin Manager. + git -C $(TPM_DIR) fetch || git clone -c advice.detachedHead=false --branch $(TPM_RELEASE) --depth 1 $(TPM_REPOSITORY) $(TPM_DIR) + git -C $(TPM_DIR) checkout $(TPM_RELEASE) + +##@ Common + +OS_ID = $(shell grep -oP '^ID="?\K[a-zA-Z0-9_ ]+' /etc/os-release || uname | tr "[:upper:]" "[:lower:]") + +EXPORTS_DF_SH_PATH = ~/.profile.d/exports.df.sh + +define EXPORTS_DF_SH_TEMPLATE +#!/usr/bin/env bash + +# Code generated by dotfiles. + +export POWERLINE_BASH_CONFIG='%s' +export POWERLINE_TMUX_CONFIG='%s' +endef + +export EXPORTS_DF_SH_TEMPLATE +configuration: ## Apply configurations of packages and dotfiles. + cp -r .profile.d ~/.profile.d + cp -r .bashrc.d ~/.bashrc.d + cp -r .config/alacritty ~/.config/alacritty + cp -r .config/powerline ~/.config/powerline + cp -r .config/lazygit ~/.config/lazygit + cp -r .config/htop ~/.config/htop + cp .bash_profile ~/ + cp .bashrc ~/ + cp .gitconfig ~/ + cp .inputrc ~/ + cp .npmrc ~/ + cp .tmux.conf ~/ +ifeq ($(OS_ID),fedora) + printf "$$EXPORTS_DF_SH_TEMPLATE" \ + '/usr/share/powerline/bash/powerline.sh' \ + '/usr/share/tmux/powerline.conf' \ + > $(EXPORTS_DF_SH_PATH) +else ifeq ($(OS_ID),ubuntu) + printf "$$EXPORTS_DF_SH_TEMPLATE" \ + '/usr/share/powerline/bindings/bash/powerline.sh' \ + '/usr/share/powerline/bindings/tmux/powerline.conf' \ + > $(EXPORTS_DF_SH_PATH) +else + $(warning Unsupported OS/kernel ($(OS_ID)). Powerline may not work.) +endif + +gpg-key: ## Generate GPG key. + @gpg --full-generate-key + +SSH_COMMENT = $(shell echo "$(USER) - $(OS_ID)") + +ssh-keys: ## Generate SSH keys. + ssh-keygen -q -t rsa -b 4096 -C "$(SSH_COMMENT)" -f ~/.ssh/id_rsa + ssh-keygen -q -t ed25519 -C "$(SSH_COMMENT)" -f ~/.ssh/id_ed25519 + +default-apps: ## Set default applications. + xdg-mime default code.desktop text/plain + +##@ Development + +fmt: ## Format code. + @shfmt -w -s . + +lint: ## Lint code. + @shfmt -d -s . + @shellcheck $$(shfmt -f .) diff --git a/README.md b/README.md index 0764fe0..ac46af9 100644 --- a/README.md +++ b/README.md @@ -7,29 +7,22 @@ The Software Engineer's setup (dotfiles, packages, desktop environment settings, ## Installation ```shell -bash -c "$(wget -qO - https://raw.githubusercontent.com/kplachkov/dotfiles/master/install/main.sh)" +make auto-install ``` -High level representation of the installation process: +Supported operating systems: +- Fedora Workstation +- Ubuntu Desktop +- macOS +- GitHub Codespaces -- Downloading the repository (by default it is done at `~/projects/dotfiles`, use `DOTFILES_PATH` to change the - location). -- Installing packages. -- Configuring the settings of the desktop environment. -- Generating PGP keys, SSH keys and firewall rules (requires input). -- Linking the configurations of packages and the dotfiles (if the files already exist -- they will be replaced). +High level representation of the automated installation: +1. The automation determines the OS. +2. The configurations of packages and the dotfiles are applied (if the files already exist -- they will be replaced). +3. The settings of the desktop environment are applied. +4. Software is installed. -Installation types based on operating systems: - -- Full installation: - - Fedora - - Ubuntu - -- Partial installation (some packages may not be installed, and some configurations may be missing): - - RHEL-based distributions (excluding Fedora) - - Debian-based distributions (excluding Ubuntu) - -- Minimal installation (only the dotfiles and few packages and configurations will be installed): - - Arch-based distributions - - openSUSE-based distributions - - macOS +More information: +```shell +make help +``` diff --git a/bin/gtmux.sh b/bin/gtmux.sh deleted file mode 100755 index eb91b4b..0000000 --- a/bin/gtmux.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -# Start tmux in full screen if its not running already. -# -# Source: https://github.com/kplachkov/dotfiles - -if ! pgrep --exact --full "tmux"; then - alacritty --command tmux -elif [[ $(pgrep --count --exact --full "tmux") == 2 ]]; then - true # NOP # TODO: focus the window -elif ! pgrep --exact --full "tmux a"; then - alacritty --command tmux a -fi diff --git a/bin/memwatch b/bin/memwatch deleted file mode 100755 index 47a845e..0000000 --- a/bin/memwatch +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash - -# System memory monitoring and alerts. -# -# The program monitors the system memory and displays statistics -# in the terminal. If the available memory is below a certain -# threshold -- critical notifications are sent. -# -# Source: https://github.com/kplachkov/dotfiles - -function alert { - notify-send -u critical "$1" "$2" - - for _ in {1..3}; do - paplay -p /usr/share/sounds/freedesktop/stereo/dialog-warning.oga - done -} - -function print_memory_status { - echo "---" - echo "Memory status - $(date)" - echo "Used memory: $(echo "scale=2; $1 / 1000" | bc)G" - echo "Available memory: $(echo "scale=2; $2 / 1000" | bc)G" - echo "Total memory: $(echo "scale=2; $3 / 1000" | bc)G" -} - -function main { - echo "Monitoring system memory..." - - local mem_used_threshold=0.85 # [0, 1] - local normal_mem_interval=3 - local low_mem_interval=10 - - echo "Threshold for low memory alerts: $(echo "(1 - $mem_used_threshold) * 100" | bc)%" - - while true; do - mem_total=$(free -t --mega | awk '/^Total:/{print $2}') - mem_used=$(free -t --mega | awk '/^Total:/{print $3}') - - mem_available=$(echo "$mem_total - $mem_used" | bc) - - print_memory_status "$mem_used" "$mem_available" "$mem_total" - - if [[ $(printf "%.0f" "$(echo "$mem_total * $mem_used_threshold" | bc)") -gt $mem_used ]]; then - sleep $normal_mem_interval - continue - fi - - 'alert' "Low memory" \ - "Available memory: $(echo "scale=2; $mem_available / 1000" | bc)G" - - sleep $low_mem_interval - done -} - -main "$@" diff --git a/bin/shutdown.sh b/bin/shutdown.sh deleted file mode 100755 index 7d30920..0000000 --- a/bin/shutdown.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -# Display GTK+ dialog to shutdown the computer. -# -# Source: https://github.com/kplachkov/dotfiles - -if zenity \ - --question \ - --title "Shutdown" \ - --text "Are you sure you want to shutdown your computer now?" \ - --default-cancel \ - --width 250; then - shutdown now -fi diff --git a/bin/workspace.sh b/bin/workspace.sh deleted file mode 100755 index 162f3a0..0000000 --- a/bin/workspace.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -# Start multiple programs if they are not running already. -# -# Source: https://github.com/kplachkov/dotfiles - -if ! pgrep chrome; then - google-chrome & -fi - -if ! pgrep --exact --full "tmux"; then - alacritty --command tmux -elif [[ $(pgrep --count --exact --full "tmux") == 2 ]]; then - true # NOP -elif ! pgrep --exact --full "tmux a"; then - alacritty --command tmux a -fi diff --git a/config/autostart/imwheel.desktop b/config/autostart/imwheel.desktop deleted file mode 100644 index d8dacfd..0000000 --- a/config/autostart/imwheel.desktop +++ /dev/null @@ -1,10 +0,0 @@ -[Desktop Entry] -Type=Application -Exec=imwheel --kill -Hidden=false -NoDisplay=false -X-GNOME-Autostart-enabled=true -Name[en_US]=mouse-config -Name=mouse-config -Comment[en_US]= -Comment= diff --git a/config/autostart/memwatch.desktop b/config/autostart/memwatch.desktop deleted file mode 100644 index a9fea66..0000000 --- a/config/autostart/memwatch.desktop +++ /dev/null @@ -1,10 +0,0 @@ -[Desktop Entry] -Type=Application -Exec=memwatch -Hidden=false -NoDisplay=false -X-GNOME-Autostart-enabled=true -Name[en_US]=memwatch -Name=memwatch -Comment[en_US]= -Comment= diff --git a/config/sublime-text-3/Default (Linux).sublime-keymap b/config/sublime-text-3/Default (Linux).sublime-keymap deleted file mode 100644 index b8c9dff..0000000 --- a/config/sublime-text-3/Default (Linux).sublime-keymap +++ /dev/null @@ -1,4 +0,0 @@ -[ - { "keys": ["ctrl+\\"], "command": "find_under_expand" }, - { "keys": ["ctrl+d"], "command": "duplicate_line" } -] diff --git a/config/sublime-text-3/Package Control.sublime-settings b/config/sublime-text-3/Package Control.sublime-settings deleted file mode 100644 index 7f1bb77..0000000 --- a/config/sublime-text-3/Package Control.sublime-settings +++ /dev/null @@ -1,11 +0,0 @@ -{ - "bootstrapped": true, - "in_process_packages": - [ - ], - "installed_packages": - [ - "MarkdownPreview", - "Package Control" - ] -} diff --git a/config/sublime-text-3/Preferences.sublime-settings b/config/sublime-text-3/Preferences.sublime-settings deleted file mode 100644 index 9ff6228..0000000 --- a/config/sublime-text-3/Preferences.sublime-settings +++ /dev/null @@ -1,16 +0,0 @@ -{ - "color_scheme": "Packages/Color Scheme - Default/Monokai.sublime-color-scheme", - "font_size": 15, - "ignored_packages": - [ - "Vintage" - ], - "spell_check": true, - "theme": "Adaptive.sublime-theme", - "remember_full_screen": true, - "show_encoding": true, - "show_line_endings": true, - "save_on_focus_lost": true, - "remember_workspace": false, - "hot_exit": "disabled" -} diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..131d37e --- /dev/null +++ b/install.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +function log_fatal { + echo "$1" >&2 + exit 1 +} + +function log_error { + echo "$1" >&2 +} + +function to_lower() { + if [ -t 0 ]; then + return 2 + fi + + cat | tr "[:upper:]" "[:lower:]" +} + +function trim() { + if [ -t 0 ]; then + return 2 + fi + + input=$(cat) || return $? + + # Remove leading whitespace characters. + input="${input#"${input%%[![:space:]]*}"}" + + # Remove trailing whitespace characters. + input="${input%"${input##*[![:space:]]}"}" + + printf '%s' "$input" +} + +function osfetch() { + grep -oP '^ID="?\K[a-zA-Z0-9_ ]+' /etc/os-release || uname | to_lower +} + +function main() { + echo "Starting automated installation..." + + os_id=$(osfetch) + + case $os_id in + ubuntu) + if [[ $TERM_PROGRAM == "vscode" || -z $DISPLAY ]]; then + echo "Installing GitHub Codespaces setup..." + make github-codespaces --no-print-directory || return $? + else + echo "Installing Ubuntu Desktop setup..." + make ubuntu-desktop --no-print-directory || return $? + fi + ;; + fedora) + echo "Installing Fedora Workstation setup..." + make fedora-workstation --no-print-directory || return $? + ;; + darwin) + echo "Installing macOS setup..." + make macos --no-print-directory || return $? + ;; + *) + log_fatal "Unsupported OS/kernel ($os_id)." + ;; + esac + + echo "Done." +} + +main "$@" diff --git a/install/configs.sh b/install/configs.sh deleted file mode 100755 index 8f86144..0000000 --- a/install/configs.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env bash - -if [[ -z $DOTFILES_PATH ]]; then - echo "Environment variable (DOTFILES_PATH) is not set" >&2 - exit 1 -fi - -. "$DOTFILES_PATH/lib/log.sh" || exit $? -. "$DOTFILES_PATH/lib/utils.sh" || exit $? - -function link_dotfiles() { - echo "Setting up dotfiles" - - local dotfiles=(.bash_profile .bashrc .gitconfig .imwheelrc .inputrc .npmrc .tmux.conf) - - for file in "${dotfiles[@]}"; do - ln -fs "$DOTFILES_PATH/$file" "$HOME" - done - - mkdir -p "$HOME"/.bashrc.d - ln -fs "$DOTFILES_PATH"/.bashrc.d/* "$HOME"/.bashrc.d - - mkdir -p "$HOME"/.profile.d - ln -fs "$DOTFILES_PATH"/.profile.d/* "$HOME"/.profile.d -} - -function generate_env_vars() { - echo "Generating environment variables" - - if is_fedora; then - POWERLINE_BASH_CONFIG="/usr/share/powerline/bash/powerline.sh" - POWERLINE_TMUX_CONFIG="/usr/share/tmux/powerline.conf" - elif is_ubuntu; then - POWERLINE_BASH_CONFIG="/usr/share/powerline/bindings/bash/powerline.sh" - POWERLINE_TMUX_CONFIG="/usr/share/powerline/bindings/tmux/powerline.conf" - fi - - mkdir -p ~/.profile.d - - printf '%s\n\n%s\n%s\n%s\n' \ - '# Code generated by dotfiles.' \ - "export DOTFILES_PATH='$DOTFILES_PATH'" \ - "export POWERLINE_BASH_CONFIG='$POWERLINE_BASH_CONFIG'" \ - "export POWERLINE_TMUX_CONFIG='$POWERLINE_TMUX_CONFIG'" >~/.profile.d/exports.df.sh -} - -function link_autostart_config() { - is_linux || return 1 - - echo "Setting up autostart applications" - - local autostart_config_dir="$HOME/.config/autostart/" - - mkdir -p "$autostart_config_dir" - ln -fs "$DOTFILES_PATH"/config/autostart/* "$autostart_config_dir" -} - -function link_htop_config() { - echo "Setting up htop configuration" - - local htop_config_dir="$HOME/.config/htop/" - - mkdir -p "$htop_config_dir" - ln -fs "$DOTFILES_PATH"/config/htop/* "$htop_config_dir" -} - -function link_powerline_config() { - echo "Setting up powerline configuration" - - local powerline_config_dir="$HOME/.config/powerline/" - - mkdir -p "$powerline_config_dir" - ln -fs "$DOTFILES_PATH"/config/powerline/* "$powerline_config_dir" -} - -function link_alacritty_config() { - echo "Setting up alacritty configuration" - - local alacritty_config_dir="$HOME/.config/alacritty/" - - mkdir -p "$alacritty_config_dir" - ln -fs "$DOTFILES_PATH"/config/alacritty/* "$alacritty_config_dir" -} - -function link_lazygit_config() { - echo "Setting up lazygit configuration" - - local lazygit_config_dir="$HOME/.config/lazygit/" - - mkdir -p "$lazygit_config_dir" - ln -fs "$DOTFILES_PATH"/config/lazygit/* "$lazygit_config_dir" -} - -function main() { - link_dotfiles - generate_env_vars - link_autostart_config - link_htop_config - link_powerline_config - link_alacritty_config - link_lazygit_config -} - -main "$@" diff --git a/install/default_apps.sh b/install/default_apps.sh deleted file mode 100755 index e9264fb..0000000 --- a/install/default_apps.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -echo "Setting up default applications" - -xdg-mime default code.desktop text/plain diff --git a/install/fedora/main.sh b/install/fedora/main.sh deleted file mode 100755 index 280beab..0000000 --- a/install/fedora/main.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -if [[ -z $DOTFILES_PATH ]]; then - echo "Environment variable (DOTFILES_PATH) is not set" >&2 - exit 1 -fi - -function main() { - echo "Installing Fedora setup" - - "$DOTFILES_PATH/install/fedora/software.sh" -} - -main "$@" diff --git a/install/fedora/software.sh b/install/fedora/software.sh deleted file mode 100755 index 67dd53d..0000000 --- a/install/fedora/software.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env bash - -. "$DOTFILES_PATH/lib/utils.sh" || exit $? - -function install_virtualization() { - sudo dnf install -y @virtualization && - sudo usermod -a -G libvirt "$(whoami)" || - return $? - - sudo systemctl start libvirtd - sudo systemctl enable libvirtd -} - -function install_gcloud() { - sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo < /etc/yum.repos.d/vscode.repo' && - dnf check-update && - sudo dnf install -y code -} - -function install_gnome_software() { - sudo dnf install -y \ - gnome-tweaks \ - gnome-extensions-app \ - gnome-shell-extension-auto-move-windows -} - -function main() { - echo "Installing system software" - - sudo dnf install -y \ - lshw \ - nmap \ - powerline \ - powerline-fonts \ - tmux \ - tmux-powerline \ - htop \ - iftop \ - bat \ - alacritty \ - google-chrome-stable \ - keepassxc \ - rawtherapee \ - imwheel \ - papirus-icon-theme - - install_virtualization - install_gcloud - install_vscode - - is_gnome && install_gnome_software -} - -main "$@" diff --git a/install/firewall_rules.sh b/install/firewall_rules.sh deleted file mode 100755 index 0f59186..0000000 --- a/install/firewall_rules.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -echo "Setting up firewall rules" - -read -r -p "Allow a device to connect to GSConnect [y/N]: " reply -if [[ $reply =~ ^[Yy]$ ]]; then - read -r -p "Enter the device private IP: " device_ip - - read -r -p "Are you sure you want to allow ($device_ip) to connect to the computer [y/N]: " reply - if [[ $reply =~ ^[Yy]$ ]]; then - sudo ufw allow from "$device_ip" to any port 1714:1764 proto udp || exit $? - sudo ufw allow from "$device_ip" to any port 1714:1764 proto tcp || exit $? - else - echo "Abort" - fi - - unset device_ip -fi - -sudo ufw enable || exit $? -sudo ufw status verbose diff --git a/install/gnome/extensions.sh b/install/gnome/extensions.sh deleted file mode 100755 index 64fb589..0000000 --- a/install/gnome/extensions.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -echo "Opening GNOME extensions to be installed" - -xdg-open https://extensions.gnome.org/extension/16/auto-move-windows/ -xdg-open https://extensions.gnome.org/extension/10/windownavigator/ -xdg-open https://extensions.gnome.org/extension/1319/gsconnect/ diff --git a/install/gnome/extensions_settings.sh b/install/gnome/extensions_settings.sh deleted file mode 100755 index 41b7ea4..0000000 --- a/install/gnome/extensions_settings.sh +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env bash - -. "$DOTFILES_PATH/lib/utils.sh" || exit $? - -echo "Applying GNOME extensions settings" - -if has_gnome_ext "auto-move-windows"; then - echo " - auto move windows" - - gsettings set org.gnome.shell.extensions.auto-move-windows application-list "['google-chrome.desktop:1', 'Alacritty.desktop:1', 'code.desktop:2']" -fi - -if has_gnome_ext "desktop-icons"; then - echo " - desktop icons" - - gsettings set org.gnome.shell.extensions.desktop-icons show-trash false - gsettings set org.gnome.shell.extensions.desktop-icons show-home false - gsettings set org.gnome.shell.extensions.desktop-icons icon-size 'small' -fi - -if has_gnome_ext "user-theme"; then - echo " - user theme" - - gsettings set org.gnome.shell.extensions.user-theme name "Yaru-dark" -fi - -if has_gnome_ext "dash-to-dock"; then - echo " - dash to dock" - - gsettings set org.gnome.shell.extensions.dash-to-dock transparency-mode 'DYNAMIC' - gsettings set org.gnome.shell.extensions.dash-to-dock shortcut-text 'q' - gsettings set org.gnome.shell.extensions.dash-to-dock apply-custom-theme false - gsettings set org.gnome.shell.extensions.dash-to-dock apply-glossy-effect true - gsettings set org.gnome.shell.extensions.dash-to-dock click-action 'cycle-windows' - gsettings set org.gnome.shell.extensions.dash-to-dock app-hotkey-9 "['9']" - gsettings set org.gnome.shell.extensions.dash-to-dock custom-background-color false - gsettings set org.gnome.shell.extensions.dash-to-dock app-shift-hotkey-1 "['1']" - gsettings set org.gnome.shell.extensions.dash-to-dock multi-monitor false - gsettings set org.gnome.shell.extensions.dash-to-dock height-fraction 0.9 - gsettings set org.gnome.shell.extensions.dash-to-dock app-ctrl-hotkey-1 "['1']" - gsettings set org.gnome.shell.extensions.dash-to-dock isolate-workspaces false - gsettings set org.gnome.shell.extensions.dash-to-dock shift-click-action 'minimize' - gsettings set org.gnome.shell.extensions.dash-to-dock shortcut-timeout 1.0 - gsettings set org.gnome.shell.extensions.dash-to-dock show-delay 0.25 - gsettings set org.gnome.shell.extensions.dash-to-dock custom-theme-shrink true - gsettings set org.gnome.shell.extensions.dash-to-dock app-shift-hotkey-2 "['2']" - gsettings set org.gnome.shell.extensions.dash-to-dock show-windows-preview true - gsettings set org.gnome.shell.extensions.dash-to-dock show-trash false - gsettings set org.gnome.shell.extensions.dash-to-dock app-ctrl-hotkey-2 "['2']" - gsettings set org.gnome.shell.extensions.dash-to-dock autohide-in-fullscreen false - gsettings set org.gnome.shell.extensions.dash-to-dock icon-size-fixed true - gsettings set org.gnome.shell.extensions.dash-to-dock scroll-action 'switch-workspace' - gsettings set org.gnome.shell.extensions.dash-to-dock shift-middle-click-action 'launch' - gsettings set org.gnome.shell.extensions.dash-to-dock custom-theme-running-dots-border-color '#e95420' - gsettings set org.gnome.shell.extensions.dash-to-dock app-shift-hotkey-3 "['3']" - gsettings set org.gnome.shell.extensions.dash-to-dock pressure-threshold 200.0 - gsettings set org.gnome.shell.extensions.dash-to-dock hide-delay 0.1 - gsettings set org.gnome.shell.extensions.dash-to-dock show-apps-at-top false - gsettings set org.gnome.shell.extensions.dash-to-dock app-ctrl-hotkey-3 "['3']" - gsettings set org.gnome.shell.extensions.dash-to-dock show-favorites true - gsettings set org.gnome.shell.extensions.dash-to-dock app-shift-hotkey-4 "['4']" - gsettings set org.gnome.shell.extensions.dash-to-dock show-running true - gsettings set org.gnome.shell.extensions.dash-to-dock force-straight-corner false - gsettings set org.gnome.shell.extensions.dash-to-dock app-hotkey-1 "['1']" - gsettings set org.gnome.shell.extensions.dash-to-dock app-ctrl-hotkey-4 "['4']" - gsettings set org.gnome.shell.extensions.dash-to-dock running-indicator-style 'DOTS' - gsettings set org.gnome.shell.extensions.dash-to-dock hotkeys-overlay true - gsettings set org.gnome.shell.extensions.dash-to-dock app-shift-hotkey-5 "['5']" - gsettings set org.gnome.shell.extensions.dash-to-dock animation-time 0.1 - gsettings set org.gnome.shell.extensions.dash-to-dock custom-theme-running-dots-color '#e95420' - gsettings set org.gnome.shell.extensions.dash-to-dock running-indicator-dominant-color false - gsettings set org.gnome.shell.extensions.dash-to-dock hotkeys-show-dock false - gsettings set org.gnome.shell.extensions.dash-to-dock app-ctrl-hotkey-5 "['5']" - gsettings set org.gnome.shell.extensions.dash-to-dock show-show-apps-button true - gsettings set org.gnome.shell.extensions.dash-to-dock animate-show-apps true - gsettings set org.gnome.shell.extensions.dash-to-dock unity-backlit-items false - gsettings set org.gnome.shell.extensions.dash-to-dock app-hotkey-2 "['2']" - gsettings set org.gnome.shell.extensions.dash-to-dock custom-theme-running-dots-border-width 0 - gsettings set org.gnome.shell.extensions.dash-to-dock app-shift-hotkey-6 "['6']" - gsettings set org.gnome.shell.extensions.dash-to-dock shortcut "['q']" - gsettings set org.gnome.shell.extensions.dash-to-dock customize-alphas true - gsettings set org.gnome.shell.extensions.dash-to-dock app-hotkey-3 "['3']" - gsettings set org.gnome.shell.extensions.dash-to-dock app-ctrl-hotkey-6 "['6']" - gsettings set org.gnome.shell.extensions.dash-to-dock autohide true - gsettings set org.gnome.shell.extensions.dash-to-dock show-mounts true - gsettings set org.gnome.shell.extensions.dash-to-dock minimize-shift true - gsettings set org.gnome.shell.extensions.dash-to-dock dock-position 'BOTTOM' - gsettings set org.gnome.shell.extensions.dash-to-dock app-shift-hotkey-7 "['7']" - gsettings set org.gnome.shell.extensions.dash-to-dock app-hotkey-10 "['0']" - gsettings set org.gnome.shell.extensions.dash-to-dock custom-theme-customize-running-dots true - gsettings set org.gnome.shell.extensions.dash-to-dock app-hotkey-4 "['4']" - gsettings set org.gnome.shell.extensions.dash-to-dock app-ctrl-hotkey-7 "['7']" - gsettings set org.gnome.shell.extensions.dash-to-dock background-opacity 1.0 - gsettings set org.gnome.shell.extensions.dash-to-dock middle-click-action 'launch' - gsettings set org.gnome.shell.extensions.dash-to-dock extend-height false - gsettings set org.gnome.shell.extensions.dash-to-dock dock-fixed false - gsettings set org.gnome.shell.extensions.dash-to-dock app-shift-hotkey-8 "['8']" - gsettings set org.gnome.shell.extensions.dash-to-dock max-alpha 1.0 - gsettings set org.gnome.shell.extensions.dash-to-dock app-hotkey-5 "['5']" - gsettings set org.gnome.shell.extensions.dash-to-dock app-ctrl-hotkey-8 "['8']" - gsettings set org.gnome.shell.extensions.dash-to-dock dash-max-icon-size 32 - gsettings set org.gnome.shell.extensions.dash-to-dock app-shift-hotkey-9 "['9']" - gsettings set org.gnome.shell.extensions.dash-to-dock intellihide true - gsettings set org.gnome.shell.extensions.dash-to-dock require-pressure-to-show true - gsettings set org.gnome.shell.extensions.dash-to-dock app-hotkey-6 "['6']" - gsettings set org.gnome.shell.extensions.dash-to-dock app-ctrl-hotkey-9 "['9']" - gsettings set org.gnome.shell.extensions.dash-to-dock bolt-support true - gsettings set org.gnome.shell.extensions.dash-to-dock scroll-switch-workspace true - gsettings set org.gnome.shell.extensions.dash-to-dock preferred-monitor 0 - gsettings set org.gnome.shell.extensions.dash-to-dock min-alpha 0.0 - gsettings set org.gnome.shell.extensions.dash-to-dock app-hotkey-7 "['7']" - gsettings set org.gnome.shell.extensions.dash-to-dock app-ctrl-hotkey-10 "['0']" - gsettings set org.gnome.shell.extensions.dash-to-dock activate-single-window true - gsettings set org.gnome.shell.extensions.dash-to-dock intellihide-mode 'FOCUS_APPLICATION_WINDOWS' - gsettings set org.gnome.shell.extensions.dash-to-dock isolate-monitors false - gsettings set org.gnome.shell.extensions.dash-to-dock background-color '#ffffff' - gsettings set org.gnome.shell.extensions.dash-to-dock app-hotkey-8 "['8']" - gsettings set org.gnome.shell.extensions.dash-to-dock app-shift-hotkey-10 "['0']" - gsettings set org.gnome.shell.extensions.dash-to-dock hot-keys true -fi diff --git a/install/gnome/main.sh b/install/gnome/main.sh deleted file mode 100755 index e57a95e..0000000 --- a/install/gnome/main.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -if [[ -z $DOTFILES_PATH ]]; then - echo "Environment variable (DOTFILES_PATH) is not set" >&2 - exit 1 -fi - -function main() { - echo "Installing GNOME setup" - - "$DOTFILES_PATH/install/gnome/settings.sh" - "$DOTFILES_PATH/install/gnome/extensions.sh" -} - -main "$@" diff --git a/install/gnome/settings.sh b/install/gnome/settings.sh deleted file mode 100755 index 0987a95..0000000 --- a/install/gnome/settings.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env bash - -echo "Applying GNOME settings" - -# Keybindings. - -gsettings set org.gnome.desktop.wm.keybindings switch-applications "[]" -gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward "[]" -gsettings set org.gnome.desktop.wm.keybindings switch-group "[]" -gsettings set org.gnome.desktop.wm.keybindings switch-group-backward "[]" -gsettings set org.gnome.desktop.wm.keybindings switch-windows "[]" -gsettings set org.gnome.desktop.wm.keybindings switch-windows-backward "[]" -gsettings set org.gnome.shell.keybindings toggle-application-view "[]" -# Shutdown computer. -gsettings set org.gnome.settings-daemon.plugins.media-keys logout "['End']" -gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-right "['Right']" -gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-left "['Left']" -gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right "['Above_Tab', 'Right']" -gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left "['Above_Tab', 'Left']" -gsettings set org.gnome.desktop.wm.keybindings show-desktop "['d']" -gsettings set org.gnome.desktop.wm.keybindings cycle-windows "['Tab']" -gsettings set org.gnome.desktop.wm.keybindings cycle-windows-backward "['Tab']" -gsettings set org.gnome.desktop.wm.keybindings toggle-fullscreen "['F11']" -gsettings set org.gnome.desktop.wm.keybindings close "['q']" - -# Custom keybindings. - -gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/gtmux/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/workspace/']" -# Start tmux in full screen. -gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/gtmux/ name "gtmux" -gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/gtmux/ command "$DOTFILES_PATH/bin/gtmux.sh" -gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/gtmux/ binding "t" -# Start workspace. -gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/workspace/ name "workspace" -gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/workspace/ command "$DOTFILES_PATH/bin/workspace.sh" -gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/workspace/ binding "w" - -# Keyboard. - -gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us'), ('xkb', 'bg+phonetic')]" -gsettings set org.gnome.desktop.input-sources per-window true -gsettings set org.gnome.desktop.peripherals.keyboard repeat true -gsettings set org.gnome.desktop.peripherals.keyboard delay 345 -gsettings set org.gnome.desktop.peripherals.keyboard repeat-interval 20 -gsettings set org.gnome.desktop.a11y.keyboard mousekeys-enable true -gsettings set org.gnome.desktop.a11y.keyboard mousekeys-max-speed 1100 -gsettings set org.gnome.desktop.a11y.keyboard mousekeys-init-delay 60 -gsettings set org.gnome.desktop.a11y.keyboard mousekeys-accel-time 600 -gsettings set org.gnome.desktop.a11y.keyboard mousekeys-accel-time 600 - -# Night light. - -gsettings set org.gnome.settings-daemon.plugins.color night-light-enabled true -gsettings set org.gnome.settings-daemon.plugins.color night-light-schedule-automatic false -gsettings set org.gnome.settings-daemon.plugins.color night-light-schedule-from 5 -gsettings set org.gnome.settings-daemon.plugins.color night-light-schedule-to 5 -gsettings set org.gnome.settings-daemon.plugins.color night-light-temperature 2700 - -# Power. - -gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'suspend' -gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 5400 -gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-type 'suspend' -gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-timeout 3600 - -# Appearance. - -gsettings set org.gnome.desktop.interface icon-theme 'Papirus' -gsettings set org.gnome.desktop.interface cursor-theme 'Adwaita' -gsettings set org.gnome.desktop.interface gtk-theme 'Adwaita-dark' -gsettings set org.gnome.desktop.interface gtk-key-theme 'Adwaita' -gsettings set org.gnome.desktop.wm.preferences theme 'Adwaita' -gsettings set org.gnome.desktop.interface cursor-size 32 -gsettings set org.gnome.desktop.interface clock-show-date true -gsettings set org.gnome.desktop.interface clock-show-weekday true -gsettings set org.gnome.desktop.interface clock-format '24h' -gsettings set org.gnome.desktop.interface show-battery-percentage true -gsettings set org.gnome.desktop.interface document-font-name 'Cantarell 12' -gsettings set org.gnome.desktop.interface font-name 'Cantarell 12' - -# Miscellaneous - -gsettings set org.gnome.shell favorite-apps "['google-chrome.desktop', 'Alacritty.desktop']" - -gsettings set org.gnome.system.locale region 'en_GB.UTF-8' - -gsettings set org.gnome.desktop.media-handling autorun-never true -gsettings set org.gnome.desktop.peripherals.mouse speed 1.0 -gsettings set org.gnome.desktop.privacy send-software-usage-stats false -gsettings set org.gnome.desktop.privacy report-technical-problems false - -gsettings set org.gtk.Settings.FileChooser show-hidden true -gsettings set org.gtk.Settings.FileChooser sort-directories-first true - -gsettings set org.gnome.mutter center-new-windows true diff --git a/install/main.sh b/install/main.sh deleted file mode 100755 index ecb8347..0000000 --- a/install/main.sh +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env bash - -export DOTFILES_PATH="${DOTFILES_PATH:-$HOME/projects/dotfiles}" - -declare -r dotfiles_https_url="https://github.com/kplachkov/dotfiles.git" -declare -r dotfiles_ssh_url="git@github.com:kplachkov/dotfiles.git" - -function to_lower() { - if [ -t 0 ]; then - return 2 - fi - - cat | tr "[:upper:]" "[:lower:]" -} - -function have() { - out=$(command -v "$@") || return $? - if [ $# -ne "$(printf "%s" "$out" | grep -c "^")" ]; then - # Partial match. - return 3 - fi -} - -function install_utilities() { - echo "Installing required utilities" - - core=$(uname | to_lower) - - case $core in - linux) - install_linux_utilities || return $? - ;; - darwin) - install_darwin_utilities || return $? - ;; - *) - echo "Unsupported core ($core)" >&2 - return 1 - ;; - esac -} - -function install_linux_utilities() { - if have apt-get; then - sudo apt-get update - sudo apt-get install -y git neofetch || return $? - elif have dnf; then - sudo dnf install -y git neofetch || return $? - elif have pacman; then - sudo pacman -S git neofetch || return $? - elif have zypper; then - sudo zypper in -y git-core neofetch || return $? - else - echo "No supported package manager found" >&2 - return 1 - fi -} - -function install_darwin_utilities() { - distro=$(sw_vers -productName | to_lower) - - case $distro in - macos) - bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - brew install git neofetch || return $? - ;; - *) - echo "Unsupported Darwin distribution ($distro)" >&2 - return 1 - ;; - esac -} - -function download_dotfiles() { - if [[ -d $DOTFILES_PATH && -n "$(ls -A "$DOTFILES_PATH")" ]]; then - echo "The directory of the dotfiles ($DOTFILES_PATH) is not empty" - else - echo "Downloading dotfiles" - - git clone "$dotfiles_https_url" "$DOTFILES_PATH" || return $? - - (cd "$DOTFILES_PATH" && git remote set-url origin "$dotfiles_ssh_url") - fi - - validate_dotfiles || return $? -} - -function validate_dotfiles() { - echo "Validating dotfiles ($DOTFILES_PATH)" - - if [ -z "$DOTFILES_FINGERPRINT" ]; then - echo "Environment variable (DOTFILES_FINGERPRINT) is not set, the validation of the dotfiles will not be performed" - return 0 - fi - - if [[ $(gen_dotfiles_fingerprint) != "$DOTFILES_FINGERPRINT" ]]; then - echo "Dotfiles are invalid" >&2 - return 1 - fi - - echo "Dotfiles are valid" -} - -function gen_dotfiles_fingerprint() { - git ls-files "$DOTFILES_PATH" | - xargs -I {} sha256sum "{}" | - cut -d " " -f 1 | - sha256sum | - cut -d " " -f 1 -} - -function source_functions() { - # shellcheck source=lib/utils.sh - source "$DOTFILES_PATH/lib/utils.sh" || return $? - # shellcheck source=lib/log.sh - source "$DOTFILES_PATH/lib/log.sh" || return $? -} - -function configure_distro() { - echo "Configuring distribution" - - if is_ubuntu; then - "$DOTFILES_PATH/install/ubuntu/main.sh" || return $? - elif is_fedora; then - "$DOTFILES_PATH/install/fedora/main.sh" || return $? - else - log_error "Unsupported distribution ($(get_distro))" - - try_partial_installation || return $? - fi -} - -function try_partial_installation() { - is_linux || return 1 - - echo "Searching for partial installation" - - if have apt-get; then - echo "Found partial installation (Ubuntu)" - "$DOTFILES_PATH/install/ubuntu/main.sh" || return $? - elif have dnf; then - echo "Found partial installation (Fedora)" - "$DOTFILES_PATH/install/fedora/main.sh" || return $? - else - log_error "No partial installation found" - return 1 - fi -} - -function configure_desktop_env() { - echo "Configuring desktop environment" - - if is_gnome; then - "$DOTFILES_PATH/install/gnome/main.sh" || return $? - else - log_error "Unsupported desktop environment ($(get_desktop_env))" - return 1 - fi -} - -function install_common() { - "$DOTFILES_PATH/install/software.sh" - - "$DOTFILES_PATH/install/default_apps.sh" - - "$DOTFILES_PATH/install/firewall_rules.sh" - - "$DOTFILES_PATH/install/ssh_keys.sh" - - "$DOTFILES_PATH/install/pgp_keys.sh" - - "$DOTFILES_PATH/install/configs.sh" -} - -function main() { - echo "Installing setup" - - install_utilities || exit $? - - download_dotfiles || exit $? - - source_functions || exit $? - - configure_distro - - configure_desktop_env - - install_common - - echo "Done." -} - -main "$@" diff --git a/install/pgp_keys.sh b/install/pgp_keys.sh deleted file mode 100755 index 6f796e2..0000000 --- a/install/pgp_keys.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -echo "Generating PGP keys" - -gpg --full-generate-key diff --git a/install/software.sh b/install/software.sh deleted file mode 100755 index a2283bf..0000000 --- a/install/software.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env bash - -if [[ -z $DOTFILES_PATH ]]; then - echo "Environment variable (DOTFILES_PATH) is not set" >&2 - exit 1 -fi - -function install_homebrew() { - echo "Installing Homebrew" - - bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" && - eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" && - brew analytics off -} - -function install_homebrew_software() { - echo "Installing Homebrew software" - - brew install go - brew install node - brew install helm - brew install kubectl - brew install minikube - brew install k9s - brew install lazygit - brew install shellcheck - brew install shfmt - brew install hugo -} - -function install_bash_software() { - echo "Installing BASH software" - - sudo install "$DOTFILES_PATH/bin/memwatch" /usr/local/bin/ -} - -function install_npm_software() { - echo "Installing NPM software" - - npm install --global yarn -} - -function install_tpm() { - echo "Installing Tmux Plugin Manager" - - git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm -} - -function install_nerd_fonts() { - echo "Installing Nerd Fonts" - - local nerd_fonts_path="$HOME/projects/nerd-fonts" - - git clone --filter=blob:none --sparse https://github.com/ryanoasis/nerd-fonts.git "$nerd_fonts_path" && - cd "$nerd_fonts_path" && - git sparse-checkout add patched-fonts/JetBrainsMono && - "$nerd_fonts_path"/install.sh JetBrainsMono -} - -function main() { - echo "Installing OS agnostic software" - - install_homebrew - install_homebrew_software - install_bash_software - install_npm_software - install_tpm -} - -main "$@" diff --git a/install/ssh_keys.sh b/install/ssh_keys.sh deleted file mode 100755 index f9ab7aa..0000000 --- a/install/ssh_keys.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -. "$DOTFILES_PATH/lib/utils.sh" || exit $? - -function gen_identity() { - hardware_model=$(neofetch_val model) || return $? - distro=$(get_distro) || return $? - desktop_env=$(get_desktop_env) || return $? - - echo "$hardware_model - $distro - $desktop_env" -} - -function main { - echo "Generating SSH keys" - - local passphrase - local passphrase_confirmation - - while true; do - read -r -s -p "Enter passphrase: " passphrase - read -r -s -p $'\nConfirm passphrase: ' passphrase_confirmation - echo "" - - if [[ $passphrase == "$passphrase_confirmation" ]]; then - break - fi - - echo $'\nPassphrases do not match. Try again...\n' - done - - comment=$(gen_identity) || return $? - - echo "Comment: $comment" - - ssh-keygen -q -t rsa -b 4096 -C "$comment" -P "$passphrase" -f ~/.ssh/id_rsa - ssh-keygen -q -t ed25519 -C "$comment" -P "$passphrase" -f ~/.ssh/id_ed25519 -} - -main "$@" diff --git a/install/ubuntu/locale.sh b/install/ubuntu/locale.sh deleted file mode 100755 index ea487d5..0000000 --- a/install/ubuntu/locale.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -echo "Setting up locales" - -sudo sed -E -i '/(en_US.UTF-8|en_GB.UTF-8)/s/^# //g' /etc/locale.gen || return $? - -sudo locale-gen || return $? - -echo "Updating locales" - -sudo update-locale \ - LANG='en_US.UTF-8' \ - LC_ADDRESS='en_US.UTF-8' \ - LC_NAME='en_US.UTF-8' \ - LC_MONETARY='en_US.UTF-8' \ - LC_PAPER='en_GB.UTF-8' \ - LC_IDENTIFICATION='en_US.UTF-8' \ - LC_TELEPHONE='en_US.UTF-8' \ - LC_MEASUREMENT='en_GB.UTF-8' \ - LC_TIME='en_GB.UTF-8' \ - LC_NUMERIC='en_GB.UTF-8' diff --git a/install/ubuntu/main.sh b/install/ubuntu/main.sh deleted file mode 100755 index 2f83646..0000000 --- a/install/ubuntu/main.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -if [[ -z $DOTFILES_PATH ]]; then - echo "Environment variable (DOTFILES_PATH) is not set" >&2 - exit 1 -fi - -function main() { - echo "Installing Ubuntu setup" - - "$DOTFILES_PATH/install/ubuntu/software.sh" - "$DOTFILES_PATH/install/ubuntu/locale.sh" -} - -main "$@" diff --git a/install/ubuntu/software.sh b/install/ubuntu/software.sh deleted file mode 100755 index 8de0a35..0000000 --- a/install/ubuntu/software.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env bash - -. "$DOTFILES_PATH/lib/utils.sh" || exit $? - -function install_gnome_software { - sudo add-apt-repository universe - - sudo apt-get install -y \ - gnome-tweak-tool \ - gnome-shell-extensions \ - chrome-gnome-shell -} - -function install_google_chrome { - wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && - sudo dpkg -i google-chrome-stable_current_amd64.deb && - rm google-chrome-stable_current_amd64.deb -} - -function install_gcloud { - sudo curl -fsSLo /usr/share/keyrings/cloud.google.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg && - echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | - sudo tee /etc/apt/sources.list.d/google-cloud-sdk.list && - sudo apt-get update && sudo apt-get install -y google-cloud-sdk -} - -function install_beekeeper_studio { - curl -fsSL https://deb.beekeeperstudio.io/beekeeper.key | - gpg --dearmor | sudo tee /usr/share/keyrings/beekeeper-studio.gpg >/dev/null && - echo "deb [signed-by=/usr/share/keyrings/beekeeper-studio.gpg] https://deb.beekeeperstudio.io stable main" | - sudo tee /etc/apt/sources.list.d/beekeeper-studio.list && - sudo apt-get update && sudo apt-get install -y beekeeper-studio -} - -function main { - echo "Installing system software" - - sudo apt-get update && sudo apt-get upgrade -y - - sudo ubuntu-drivers autoinstall - - sudo apt-get install -y \ - curl \ - whois \ - net-tools \ - apt-transport-https \ - ca-certificates \ - gnupg \ - software-properties-common \ - nmap \ - htop \ - iftop \ - tmux \ - tree \ - xclip \ - powerline \ - fonts-powerline \ - qemu-kvm \ - virt-manager \ - ufw \ - bat \ - git \ - cmake \ - ruby-dev \ - shc \ - python3-pip \ - pipenv \ - python3-tk \ - libseccomp-dev \ - protobuf-compiler \ - imagemagick \ - rawtherapee \ - gimp \ - keepassxc \ - imwheel \ - papirus-icon-theme - - install_gcloud - install_beekeeper_studio - install_google_chrome - - is_gnome && install_gnome_software -} - -main "$@" diff --git a/lib/log.sh b/lib/log.sh deleted file mode 100755 index edc691c..0000000 --- a/lib/log.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -function log_fatal { - echo "$1" >&2 - exit 1 -} - -function log_error { - echo "$1" >&2 -} diff --git a/lib/utils.sh b/lib/utils.sh deleted file mode 100644 index 2c184bb..0000000 --- a/lib/utils.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env bash - -function neofetch_val() { - out=$(neofetch "$@") || return $? - val=${out#*: } - echo "$val" | trim -} - -function have() { - out=$(command -v "$@") || return $? - if [ $# -ne "$(printf "%s" "$out" | grep -c "^")" ]; then - # Partial match. - return 3 - fi -} - -function to_lower() { - if [ -t 0 ]; then - return 2 - fi - - cat | tr "[:upper:]" "[:lower:]" -} - -function trim() { - if [ -t 0 ]; then - return 2 - fi - - input=$(cat) || return $? - - # Remove leading whitespace characters. - input="${input#"${input%%[![:space:]]*}"}" - - # Remove trailing whitespace characters. - input="${input%"${input##*[![:space:]]}"}" - - printf '%s' "$input" -} - -function get_desktop_env() { - neofetch_val de -} - -function get_distro() { - neofetch_val distro --distro_shorthand tiny --os_arch off -} - -function is_linux() { - [[ $(uname | to_lower) == linux ]] -} - -function is_darwin() { - [[ $(uname | to_lower) == darwin ]] -} - -function is_distro() { - [[ $(get_distro | to_lower) == *"$1"* ]] -} - -function is_desktop_env() { - [[ $(get_desktop_env | to_lower) == *"$1"* ]] -} - -function is_fedora() { - is_distro fedora -} - -function is_ubuntu() { - is_distro ubuntu -} - -function is_gnome() { - is_desktop_env gnome -} - -function has_gnome_ext() { - is_gnome || return $? - - [[ $(gnome-extensions list | to_lower) == *"$1"* ]] -}