Compare commits

...

42 Commits

Author SHA1 Message Date
41024b1eb5 chore(deps): update nvm/node version to 22.6.0 2024-08-09 19:36:24 +03:00
74afeb61c8 chore(nvim): update nvim-kickstart submodule 2024-08-09 19:33:18 +03:00
104bc369bc chore(brew): update and cleanup brewfile 2024-08-09 19:32:56 +03:00
57e63847ce feat(config): gnupg configuration 2024-08-09 19:32:07 +03:00
2dc08e5e51 chore(shell): cleanup zshenv and zshrc 2024-08-09 19:31:25 +03:00
989b5b5111 feat: add ruby 3.3.4 2024-08-09 19:30:17 +03:00
24a5dd1ff6 feat: direnv, move tool-versions to base 2024-08-09 18:59:34 +03:00
5826e35853 chore(deps): update asdf tool-versions 2024-07-30 00:34:14 +03:00
e329868568 fix(bin): alacritty automatic theme changing 2024-07-30 00:22:07 +03:00
dc76fa8914 chore(meta): add .luarc.json 2024-07-28 15:36:04 +03:00
3413365d41 chore(bin): tweak x-path-* scripts 2024-07-28 15:35:50 +03:00
37299f4893 chore(config): tweak exports 2024-07-28 15:35:34 +03:00
71a78c6e0c chore(config): remove herd config 2024-07-26 14:18:24 +03:00
3f8a4deb05 chore(deps): update asdf tool-versions 2024-07-26 14:17:47 +03:00
ffe288aba3 chore(deps): update nvim-kickstart config 2024-07-26 14:17:35 +03:00
28a1fc2831 chore(deps): update asdf tool-versions 2024-07-23 05:09:54 +03:00
28aae89f70 chore: cleanup and fixes 2024-07-23 05:09:30 +03:00
e8fe5c570b chore(meta): update renovate.json 2024-07-23 03:46:08 +03:00
26f6024292 feat(bin): update scripts to function format 2024-07-23 03:45:22 +03:00
4e4692321b chore(deps): update asdf tool-versions 2024-07-23 03:44:06 +03:00
3ea221ccf9 chore(config): tweak cheat config 2024-07-23 03:43:48 +03:00
e7774c4ab1 chore(docs): update nvim keybindings 2024-07-23 03:43:32 +03:00
1f2ca90ca5 feat!: refactor base, config, dfm and scripts 2024-07-23 03:43:12 +03:00
adecceda7a chore(scripts): eval scripts/shared.sh 2024-07-17 10:04:16 +03:00
8a3b2e703c feat(hosts): air wallpaper 2024-07-17 09:43:41 +03:00
1ee726e30c chore(shell): remove nvm plugin from zshrc 2024-07-17 09:43:18 +03:00
9857c8eb00 feat(asdf): move rust to asdf 2024-07-17 09:41:41 +03:00
a919d9544e chore: tweaks and reworked README 2024-07-17 09:40:53 +03:00
7bc7921a17 chore: rename scripts/shared 2024-07-17 09:39:57 +03:00
735807f245 chore: cleanup 2024-07-16 23:02:13 +03:00
6d531e2d40 chore(deps): update asdf packages 2024-07-16 23:01:52 +03:00
77f89c0f48 feat(asdf): manage go packages with asdf 2024-07-16 23:01:38 +03:00
7f3c7b7e1c feat: prettier-plugin-sh + tweaks and codefixes 2024-07-16 23:00:36 +03:00
fc16b8231e feat!: asdf is now a git submodule 2024-07-16 22:58:29 +03:00
64a626d5c4 chore(asdf): update deps 2024-07-13 20:56:39 +00:00
54816c2ce9 chore(shell): new aliases 2024-07-13 16:21:43 +03:00
3acaea5611 chore(asdf): update packages 2024-07-10 09:48:31 +00:00
e4a313abe7 chore(asdf): update packages 2024-07-10 11:05:30 +03:00
0b1c75cbdd chore(dotbot): create gnupg folder 2024-07-09 03:33:28 +03:00
cab0f4da49 chore(asdf): update asdfrc 2024-07-09 03:33:02 +03:00
cef15eddce chore(asdf): update tools, fix installer 2024-07-09 03:20:50 +03:00
f8987818b8 chore(asdf): cleanup 2024-07-08 10:15:48 +03:00
94 changed files with 2884 additions and 1622 deletions

View File

@@ -1 +1 @@
extends @ivuorinen/browserslist-config extends @ivuorinen/browserslist-config

View File

@@ -27,3 +27,9 @@ space_redirects = true
keep_padding = false keep_padding = false
function_next_line = true # --func-next-line function_next_line = true # --func-next-line
# Ignore the entire "third_party" directory when calling shfmt on directories,
# such as "shfmt -l -w .". When formatting files directly,
# like "shfmt -w third_party/foo.sh" or "shfmt --filename=third_party/foo.sh",
# the ignore logic is applied only when the --apply-ignore flag is given.
[{tools/**,local/bin/asdf/**,config/cheat/cheatsheets/**}]
ignore = true

1
.envrc Normal file
View File

@@ -0,0 +1 @@
use asdf

58
.github/README.md vendored
View File

@@ -8,6 +8,9 @@ this repository will live accordingly.
Please for the love of everything good do not use these 1:1 as your own dotfiles, Please for the love of everything good do not use these 1:1 as your own dotfiles,
fork or download the repo as a zip and go from there with your own configs. fork or download the repo as a zip and go from there with your own configs.
It would be nice if you'd add an issue linking to your fork or repo so I can
see what interesing stuff you've done with it. Sharing is caring.
## Setup ## Setup
### First time setup ### First time setup
@@ -35,7 +38,7 @@ fork or download the repo as a zip and go from there with your own configs.
| Path | Description | | Path | Description |
| ------------------- | -------------------------------------------- | | ------------------- | -------------------------------------------- |
| `.github` | GitHub Repository configuration files. | | `.github` | GitHub Repository configuration files, meta. |
| `hosts/{hostname}/` | Configs that should apply to that host only. | | `hosts/{hostname}/` | Configs that should apply to that host only. |
| `local/bin` | Helper scripts that I've collected or wrote. | | `local/bin` | Helper scripts that I've collected or wrote. |
| `scripts` | Setup scripts. | | `scripts` | Setup scripts. |
@@ -51,7 +54,9 @@ fork or download the repo as a zip and go from there with your own configs.
### dfm - the dotfiles manager ### dfm - the dotfiles manager
`.local/bin/dfm` is a shell script that has some tools that help with dotfiles management. [`.local/bin/dfm`][dfm] is a shell script that has some tools that help with dotfiles management.
Running `dfm` gives you a list of available commands.
## Configuration ## Configuration
@@ -66,51 +71,8 @@ The folder structure follows [XDG Base Directory Specification][xdg] where possi
| `$XDG_DATA_HOME` | `$HOME/.local/share` | User-specific data files | | `$XDG_DATA_HOME` | `$HOME/.local/share` | User-specific data files |
| `$XDG_STATE_HOME` | `$HOME/.local/state` | App state that should persist between restarts | | `$XDG_STATE_HOME` | `$HOME/.local/state` | App state that should persist between restarts |
#### XDG_BIN_HOME (`$HOME/.local/bin`) Please see [docs/folders.md][docs-folders] for more information.
`$XDG_BIN_HOME` defines directory that contains local binaries.
User-specific executable files may be stored in `$HOME/.local/bin`.
Distributions should ensure this directory shows up in the UNIX `$PATH`
environment variable, at an appropriate place.
#### XDG_DATA_HOME (`$HOME/.local/share`)
`$XDG_DATA_HOME` defines the base directory relative to which
user-specific _data files_ should be stored.
If `$XDG_DATA_HOME` is either not set or empty,
a default equal to `$HOME/.local/share` should be used.
#### XDG_CONFIG_HOME (`$HOME/.config`)
`$XDG_CONFIG_HOME` defines the base directory relative to which
user-specific _configuration files_ should be stored.
If `$XDG_CONFIG_HOME` is either not set or empty,
a default equal to `$HOME/.config` should be used.
#### XDG_STATE_HOME (`$HOME/.local/state`)
`$XDG_STATE_HOME` defines the base directory relative to which
user-specific _state files_ should be stored.
If `$XDG_STATE_HOME` is either not set or empty,
a default equal to `$HOME/.local/state` should be used.
The `$XDG_STATE_HOME` contains _state data_ that should
_persist between (application) restarts_, but that is not important or
portable enough to the user that it should be stored in `$XDG_DATA_HOME`.
- It may contain:
- actions history (logs, history, recently used files, …)
- current state of the application that can be reused
on a restart (view, layout, open files, undo history, …)
#### XDG_DATA_DIRS
`$XDG_DATA_DIRS` defines the preference-ordered set of base directories
to search for data files in addition to the `$XDG_DATA_HOME` base directory.
The directories in `$XDG_DATA_DIRS` should be separated with a colon ':'.
[dfm]: https://github.com/ivuorinen/dotfiles/blob/main/local/bin/dfm
[docs-folders]: https://github.com/ivuorinen/dotfiles/blob/main/docs/folders.md
[xdg]: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html [xdg]: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html

View File

@@ -1,4 +1,4 @@
{ {
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["local>ivuorinen/.github:renovate-config"] "extends": ["local>ivuorinen/renovate-config"]
} }

3
.gitignore vendored
View File

@@ -22,4 +22,7 @@ node_modules
iTermServer-* iTermServer-*
lock lock
config/iterm2/AppSupport config/iterm2/AppSupport
config/gnupg/S.*
config/gnupg/s
config/gnupg/private-keys-v1.d

3
.gitmodules vendored
View File

@@ -64,3 +64,6 @@
[submodule "tmux/tmux-dark-notify"] [submodule "tmux/tmux-dark-notify"]
path = config/tmux/plugins/tmux-dark-notify path = config/tmux/plugins/tmux-dark-notify
url = https://github.com/erikw/tmux-dark-notify.git url = https://github.com/erikw/tmux-dark-notify.git
[submodule "asdf"]
path = local/bin/asdf
url = https://github.com/asdf-vm/asdf.git

5
.luarc.json Normal file
View File

@@ -0,0 +1,5 @@
{
"diagnostics.globals": [
"vim"
]
}

2
.nvmrc
View File

@@ -1 +1 @@
lts/* 22.6.0

View File

@@ -1,8 +1,12 @@
.mypy_cache/* .mypy_cache/*
tools/dotbot*
local/bin/antigen.zsh
config/cheat/cheatsheets/community
config/tmux/plugins/*
lazy-lock.json
Brewfile.lock.json Brewfile.lock.json
config/cheat/cheatsheets/community
config/cheat/cheatsheets/tldr
config/fzf/*
config/nvim-kickstart/*
config/tmux/plugins/*
config/zsh/*
lazy-lock.json
local/bin/antigen.zsh
local/bin/asdf
tools/dotbot*

View File

@@ -1,4 +1,5 @@
module.exports = { module.exports = {
plugins: ['prettier-plugin-sh'],
...require('@ivuorinen/prettier-config'), ...require('@ivuorinen/prettier-config'),
trailingComma: 'all', trailingComma: 'all',
// Add custom options below: // Add custom options below:

View File

@@ -18,6 +18,8 @@ git submodule add --name cheat-community \
-f https://github.com/cheat/cheatsheets.git config/cheat/cheatsheets/community -f https://github.com/cheat/cheatsheets.git config/cheat/cheatsheets/community
git submodule add --name cheat-tldr \ git submodule add --name cheat-tldr \
-f https://github.com/ivuorinen/cheatsheet-tldr.git config/cheat/cheatsheets/tldr -f https://github.com/ivuorinen/cheatsheet-tldr.git config/cheat/cheatsheets/tldr
git submodule add --name asdf \
-f https://github.com/asdf-vm/asdf.git local/bin/asdf
# tmux plugin manager and plugins # tmux plugin manager and plugins
git submodule add --name tmux/tmux-continuum \ git submodule add --name tmux/tmux-continuum \

View File

@@ -1,9 +1,11 @@
# this is my bashrc config. there are many like it, but this one is mine. # this is my bashrc config. there are many like it, but this one is mine.
# shellcheck shell=bash # shellcheck shell=bash
source "$HOME/.dotfiles/config/shared" export DOTFILES="$HOME/.dotfiles"
export PATH="$HOME/.local/bin:$DOTFILES/local/bin:$PATH"
export SHARED_SCRIPTS_SOURCED=0
x-load-configs source "$DOTFILES/config/shared.sh"
# shellcheck source=../config/fzf/fzf.bash # shellcheck source=../config/fzf/fzf.bash
[ -f "${DOTFILES}/config/fzf/fzf.bash" ] && [ -f "${DOTFILES}/config/fzf/fzf.bash" ] &&
@@ -16,8 +18,8 @@ x-have oh-my-posh && {
eval "$(oh-my-posh init bash --config "$DOTFILES/config/omp/own.toml")" eval "$(oh-my-posh init bash --config "$DOTFILES/config/omp/own.toml")"
} }
. "$HOME/.local/share/asdf/asdf.sh" . "$XDG_BIN_HOME/asdf/asdf.sh"
. "$HOME/.local/share/asdf/completions/asdf.bash" . "$XDG_BIN_HOME/asdf/completions/asdf.bash"
x-have antidot && { x-have antidot && {
eval "$(antidot init)" eval "$(antidot init)"

1
base/envrc Normal file
View File

@@ -0,0 +1 @@
use asdf

View File

@@ -1,6 +1,4 @@
#!/bin/env bash #!/bin/env bash
[ -z "$NVM_DIR" ] && export NVM_DIR="$HOME/.config/nvm" [ -z "$NVM_DIR" ] && export NVM_DIR="$HOME/.config/nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion

29
base/tool-versions Normal file
View File

@@ -0,0 +1,29 @@
1password-cli 2.30.0
age 1.2.0
asdf-plugin-manager 1.3.1
bottom 0.10.2
direnv 2.34.0
dotenv-linter 3.3.0
editorconfig-checker 2.8.0
eza 0.19.0
fd 10.1.0
github-cli 2.54.0
golang 1.22.6
hadolint 2.12.0
kubectl 1.30.3
lazygit 0.43.1
nodejs 22.6.0
pipx 1.6.0
pre-commit 3.8.0
ripgrep 14.1.0
ruby 3.3.4
rust 1.80.1
semgrep system
shellcheck 0.10.0
shfmt 3.8.0
terraform-lsp 0.0.12
terragrunt 0.66.3
tf-summarize 0.3.10
vault 1.17.3
yamllint 1.35.1
yq 4.44.3

View File

@@ -1,21 +0,0 @@
# shellcheck shell=bash
# vim: filetype=zsh
export PATH="$HOME/.local/bin:$HOME/.dotfiles/local/bin:$HOME/.local/go/bin:$PATH"
export DOTFILES="$HOME/.dotfiles"
# Explicitly set XDG folders
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_STATE_HOME="$HOME/.local/state"
# custom variables
export XDG_BIN_HOME="$HOME/.local/bin"
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_RUNTIME_DIR="$HOME/.local/run"
source "$DOTFILES/config/exports"
source "$DOTFILES/config/alias"

View File

@@ -1,102 +1,127 @@
# this is my zsh config. there are many like it, but this one is mine. # this is my zsh config. there are many like it, but this one is mine.
# shellcheck shell=bash # shellcheck shell=bash
source "$HOME/.dotfiles/config/shared" # export VERBOSE=1
# export DEBUG=1
export PATH="$XDG_BIN_HOME:$DOTFILES/local/bin:$HOME/.local/go/bin:$XDG_DATA_HOME/bob/nvim-bin:$XDG_DATA_HOME/cargo/bin:/opt/homebrew/bin:/usr/local/bin:$PATH" export DOTFILES="$HOME/.dotfiles"
export PATH="$HOME/.local/bin:$DOTFILES/local/bin:$HOME/.local/share/bob/nvim-bin:$HOME/.local/share/cargo/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
export SHARED_SCRIPTS_SOURCED=0
x-load-configs source "$DOTFILES/config/shared.sh"
x-have oh-my-posh && { eval "$(oh-my-posh init zsh --config "$DOTFILES/config/omp/own.toml")"
eval "$(oh-my-posh init zsh --config "$DOTFILES/config/omp/own.toml")"
}
export COMPLETION_WAITING_DOTS=true # Load asdf
export ASDF_DIR="$XDG_BIN_HOME/asdf"
if type brew &> /dev/null; then if [[ -d $ASDF_DIR ]]; then
eval "$(brew shellenv)" [[ -d $ASDF_DIR/bin ]] && x-path-prepend "$ASDF_DIR/bin"
FPATH="$HOMEBREW_PREFIX/share/zsh/site-functions:${FPATH}" [[ -d $ASDF_DIR/shims ]] && x-path-prepend "$ASDF_DIR/shims"
[[ -d $ASDF_DIR/completions ]] && fpath=("$ASDF_DIR/completions" $fpath)
[[ -d $ASDF_DIR/plugins ]] && fpath=("$ASDF_DIR/plugins" $fpath)
source "$ASDF_DIR/asdf.sh"
fi fi
export ZSH_CUSTOM_COMPLETION_PATH="$XDG_CONFIG_HOME/zsh/completion" # Function to load antigen if available
x-dc "$ZSH_CUSTOM_COMPLETION_PATH" load_antigen()
{
local antigen_zsh_path="$XDG_BIN_HOME/antigen.zsh"
# shellcheck source=../../.local/bin/antigen.zsh
if [[ -f "$antigen_zsh_path" ]]; then
source "$antigen_zsh_path"
# Add completion scripts to zsh path antigen use oh-my-zsh
FPATH="$ZSH_CUSTOM_COMPLETION_PATH:$FPATH"
# Try to load antigen, if present export ZSH_TMUX_AUTOSTART=true
ANTIGEN_ZSH_PATH="$XDG_BIN_HOME/antigen.zsh" export ZSH_TMUX_CONFIG="$DOTFILES/config/tmux/tmux.conf"
# shellcheck source=../../.local/bin/antigen.zsh export ZSH_TMUX_UNICODE=true
[[ -f "$ANTIGEN_ZSH_PATH" ]] && source "$ANTIGEN_ZSH_PATH" export ZSH_TMUX_AUTOQUIT=false
export ZSH_TMUX_DEFAULT_SESSION_NAME=main
# antigen is present zstyle :omz:plugins:ssh-agent quiet yes
antigen use oh-my-zsh zstyle :omz:plugins:ssh-agent lazy yes
export ZSH_TMUX_AUTOSTART=true # z, the zsh version
export ZSH_TMUX_CONFIG="$DOTFILES/config/tmux/tmux.conf" export ZSHZ_DATA="$XDG_STATE_HOME/z"
export ZSH_TMUX_UNICODE=true antigen bundle z
export ZSH_TMUX_AUTOQUIT=false
export ZSH_TMUX_DEFAULT_SESSION_NAME=main
export NVM_DIR="$XDG_CONFIG_HOME/nvm" x-have python && antigen bundle MichaelAquilina/zsh-autoswitch-virtualenv
export NPM_CONFIG_USERCONFIG="$XDG_CONFIG_HOME"/npm/npmrc
# z, the zsh version # these should be always available
export ZSHZ_DATA="$XDG_STATE_HOME/z" antigen bundle gpg-agent
antigen bundle z antigen bundle brew
antigen bundle tmux
antigen bundle colored-man-pages
# antigen bundle ssh-agent
antigen bundle jreese/zsh-titles
antigen bundle zsh-users/zsh-completions
# these should be always available
antigen bundle asdf
antigen bundle tmux
antigen bundle colored-man-pages
antigen bundle ssh-agent
antigen bundle jreese/zsh-titles
antigen bundle zsh-users/zsh-completions
x-have python && antigen bundle MichaelAquilina/zsh-autoswitch-virtualenv # this needs to be the last item
antigen bundle zsh-users/zsh-syntax-highlighting
# nvm is a strange beast antigen apply
zstyle ':omz:plugins:nvm' autoload yes fi
antigen bundle nvm
# this needs to be the last item
antigen bundle zsh-users/zsh-syntax-highlighting
antigen apply
# shellcheck source=../config/fzf/fzf.zsh
[ -f "${DOTFILES}/config/fzf/fzf.zsh" ] \
&& source "${DOTFILES}/config/fzf/fzf.zsh"
x-have pyenv && {
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
} }
# Run only if tmux is active # Function to source FZF configuration
[[ -n "$TMUX" ]] && { source_fzf_config()
# Autoupdate tmux window name {
TMUX_WINDOW_NAME_PLUGIN="$DOTFILES/config/tmux/plugins/tmux-window-name/scripts/rename_session_windows.py" local fzf_config="${DOTFILES}/config/fzf/fzf.zsh"
[ -f "$TMUX_WINDOW_NAME_PLUGIN" ] && { if [[ -f "$fzf_config" ]]; then
tmux-window-name() # shellcheck source=config/fzf/fzf.zsh
{ source "$fzf_config"
($TMUX_WINDOW_NAME_PLUGIN &) fi
}
add-zsh-hook chpwd tmux-window-name
tmux-window-name
}
} }
x-have antidot && { # Function to initialize pyenv if available
eval "$(antidot init)" initialize_pyenv()
{
if x-have pyenv; then
[[ -d $PYENV_ROOT/bin ]] && x-path-append "$PYENV_ROOT/bin"
[[ -d $PYENV_ROOT/shims ]] && x-path-append "$PYENV_ROOT/shims"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
fi
} }
source "$DOTFILES/config/alias" # Function to set up tmux window name plugin if tmux is active
setup_tmux_window_name_plugin()
{
if [[ -n "$TMUX" ]]; then
local tmux_window_name_plugin="$DOTFILES/config/tmux/plugins/tmux-window-name/scripts/rename_session_windows.py"
if [[ -f "$tmux_window_name_plugin" ]]; then
tmux_window_name()
{
($tmux_window_name_plugin &)
}
add-zsh-hook chpwd tmux_window_name
tmux_window_name
fi
fi
}
# Function to initialize antidot if available
initialize_antidot()
{
if x-have antidot; then
eval "$(antidot init)"
fi
}
initialize_direnv()
{
source "${XDG_CONFIG_HOME:-$HOME/.config}/asdf-direnv/zshrc"
}
main()
{
load_antigen
source_fzf_config
initialize_pyenv
setup_tmux_window_name_plugin
initialize_antidot
initialize_direnv
}
main "$@"
# Herd checks for a few environment variables to inject PHP binaries and configurations.
# Herd injected PHP binary.
# export PATH="/Users/ivuorinen/Library/Application Support/Herd/bin/":$PATH
# Herd injected PHP 8.3 configuration.
# export HERD_PHP_83_INI_SCAN_DIR="/Users/ivuorinen/Library/Application Support/Herd/config/php/83/"
# Herd injected PHP 7.4 configuration.
# export HERD_PHP_74_INI_SCAN_DIR="/Users/ivuorinen/Library/Application Support/Herd/config/php/74/"

View File

@@ -1,6 +1,4 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# shellcheck source="../scripts/shared.sh"
# shellcheck disable=1091,2139
# Color the grep output # Color the grep output
alias grep="grep --color" alias grep="grep --color"
@@ -17,6 +15,14 @@ alias ....="cd ../../.."
# cd to git root directory # cd to git root directory
alias cdgr='cd "$(git root)"' alias cdgr='cd "$(git root)"'
# interesting folders, and shortcuts
alias .="cd $HOME"
alias .b="cd $XDG_BIN_HOME"
alias .c="cd $HOME/Code"
alias .d="cd $DOTFILES"
alias .dx="cd $DOTFILES;ks"
alias .l="cd $HOME/.local"
# Shortcuts for listing # Shortcuts for listing
alias ll="ls -la" alias ll="ls -la"
alias l="ls -a" alias l="ls -a"
@@ -106,63 +112,3 @@ if [[ $(uname) == 'Darwin' ]]; then
# Using herd for php now, so this is not needed anymore # Using herd for php now, so this is not needed anymore
# x-set-php-aliases # x-set-php-aliases
fi fi
# Alacritty preexec hook to update dynamic title
preexec()
{
print -Pn "\e]0;$1%~\a"
}
# Update dotfiles
dfu()
{
(
cd "$DOTFILES" && git pull --ff-only && ./install -q
)
}
# Weather in Tampere, or other city
weather()
{
# https://github.com/chubin/wttr.in#usage
local city="${1:-Tampere}"
curl "http://wttr.in/${city// /+}?2nFQM&lang=fi"
}
# Docker
ssh-docker()
{
docker exec -it "$@" bash
}
# Rector project to php version 8.2 by default.
rector()
{
local php="${1:-82}"
docker run -v "$(pwd)":/project rector/rector:latest process \
"/project/$1" \
--set "php${php}" \
--autoload-file /project/vendor/autoload.php
}
# Commit everything
commit()
{
commitMessage="$*"
if [ "$commitMessage" = "" ]; then
commitMessage="Automated commit"
fi
git add .
eval "git commit -a -m '${commitMessage}'"
}
scheduler()
{
while :; do
php artisan schedule:run
echo "Sleeping 60 seconds..."
sleep 60
done
}

View File

@@ -1,8 +1,5 @@
# See the docs for explanations: https://asdf-vm.com/manage/configuration.html # See the docs for explanations: https://asdf-vm.com/manage/configuration.html
legacy_version_file = yes legacy_version_file=yes
use_release_candidates = no use_release_candidates=no
always_keep_download = no concurrency=auto
plugin_repository_last_check_duration = 60
disable_plugin_short_name_repository = no
concurrency = auto

View File

@@ -0,0 +1,21 @@
// A cargo subcommand for checking and applying
// updates to installed executables
cargo-update
// Cargo cache management utility
cargo-cache
// An incremental parsing system for programming tools
tree-sitter-cli
// a subprocess caching utility
bkt
// a structural diff that understands syntax
difftastic
// A simple, fast and user-friendly alternative to 'find'
fd-find
// recursively searches directories for a
// regex pattern while respecting your gitignore
ripgrep
// A version manager for neovim
bob-nvim
// bottom, btm - A cross-platform graphical process/system monitor with
// a customizable interface and a multitude of features.
bottom

1
config/asdf/gem-packages Normal file
View File

@@ -0,0 +1 @@
bundler

View File

@@ -0,0 +1,21 @@
// These are golang packages I use,
// so they should be available with all versions
// sysadmin/scripting utilities, distributed as a single binary
github.com/skx/sysbox@release-0.18.0
// Git Profile allows you to switch between user profiles in git repos
github.com/dotzero/git-profile@v1.4.0
// An extensible command line tool or library to format yaml files.
github.com/google/yamlfmt/cmd/yamlfmt@v0.13.0
// Parsing HTML at the command line
github.com/ericchiang/pup@v0.4.0
// HTML to Markdown converter
github.com/suntong/html2md@v1.5.0
// cheat allows you to create and view interactive cheatsheets on the cli.
github.com/cheat/cheat/cmd/cheat@4.4.2
// Render markdown on the CLI, with pizzazz! 💅
github.com/charmbracelet/glow@v1.5.1
// Static checker for GitHub Actions workflow files
github.com/rhysd/actionlint/cmd/actionlint@v1.7.1
// Cleans up your $HOME from those pesky dotfiles
github.com/doron-cohen/antidot@v0.6.3

View File

@@ -15,6 +15,7 @@ nodejs https://github.com/asdf-vm/asdf-nodejs.git
pipx https://github.com/yozachar/asdf-pipx.git 31db618 pipx https://github.com/yozachar/asdf-pipx.git 31db618
pre-commit https://github.com/jonathanmorley/asdf-pre-commit.git 26bfc42 pre-commit https://github.com/jonathanmorley/asdf-pre-commit.git 26bfc42
ripgrep https://gitlab.com/wt0f/asdf-ripgrep.git e836665 ripgrep https://gitlab.com/wt0f/asdf-ripgrep.git e836665
rust https://github.com/code-lever/asdf-rust.git 95acf4f
semgrep https://github.com/brentjanderson/asdf-semgrep.git 13ff78b semgrep https://github.com/brentjanderson/asdf-semgrep.git 13ff78b
shellcheck https://github.com/luizm/asdf-shellcheck.git 780d78d shellcheck https://github.com/luizm/asdf-shellcheck.git 780d78d
shfmt https://github.com/luizm/asdf-shfmt.git a42c5ff shfmt https://github.com/luizm/asdf-shfmt.git a42c5ff

View File

@@ -1,16 +0,0 @@
1password-cli 2.29.0
age 1.2.0
bottom 0.9.6
eza 0.18.19
fd 10.1.0
hadolint 2.12.0
kubectl 1.30.2
lazygit 0.42.0
nodejs 22.3.0
pipx 1.6.0
tf-summarize 0.3.10
vault 1.17.0+ent
yamllint 1.35.1
yq 4.44.2
neovim system
asdf-plugin-manager 1.3.1

View File

@@ -3,11 +3,11 @@
# editor: $EDITOR # editor: $EDITOR
# Should 'cheat' always colorize output? # Should 'cheat' always colorize output?
colorize: true colorize: false
# Which 'chroma' colorscheme should be applied to the output? # Which 'chroma' colorscheme should be applied to the output?
# Options are available here: # Options are available here:
# https://github.com/alecthomas/chroma/tree/master/styles # https://github.com/alecthomas/chroma/tree/master/styles
style: 'catppuccin' style: 'tokyonight'
# Which 'chroma' "formatter" should be applied? # Which 'chroma' "formatter" should be applied?
# One of: "terminal", "terminal256", "terminal16m" # One of: "terminal", "terminal256", "terminal16m"
formatter: terminal256 formatter: terminal256

View File

@@ -2,14 +2,37 @@
# shellcheck shell=bash # shellcheck shell=bash
# vim: filetype=zsh # vim: filetype=zsh
# Set XDG directories if not already set
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
[ -z "$XDG_CONFIG_HOME" ] && export XDG_CONFIG_HOME="$HOME/.config"
[ -z "$XDG_DATA_HOME" ] && export XDG_DATA_HOME="$HOME/.local/share"
[ -z "$XDG_CACHE_HOME" ] && export XDG_CACHE_HOME="$HOME/.cache"
[ -z "$XDG_STATE_HOME" ] && export XDG_STATE_HOME="$HOME/.local/state"
[ -z "$XDG_BIN_HOME" ] && export XDG_BIN_HOME="$HOME/.local/bin"
# if DOTFILES is not set, set it to the default location
[ -z "$DOTFILES" ] && export DOTFILES="$HOME/.dotfiles"
export PATH="$XDG_BIN_HOME:$DOTFILES/local/bin:$XDG_DATA_HOME/bob/nvim-bin:$XDG_DATA_HOME/cargo/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
if ! command -v msg &> /dev/null; then
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[[ "$VERBOSE" -eq 1 ]] && echo "-> $1"
return 0
}
fi
# Cache commands using bkt if installed # Cache commands using bkt if installed
if command -v bkt >&/dev/null; then if command -v bkt &> /dev/null; then
bkt() bkt()
{ {
command bkt --cache-dir="$XDG_CACHE_HOME/bkt" "$@" command bkt --cache-dir="$XDG_CACHE_HOME/bkt" "$@"
} }
else else
# If bkt isn't installed skip its arguments and just execute directly. # If bkt isn't installed, skip its arguments and just execute directly.
# Optionally write a msg to stderr suggesting users install bkt. # Optionally write a msg to stderr suggesting users install bkt.
bkt() bkt()
{ {
@@ -18,44 +41,55 @@ else
} }
fi fi
# shorthand for checking if the system has the bin in path, # Shorthand for checking if the system has the bin in path,
# this version does not use caching # this version does not use caching.
# usage: have_command php && php -v # Usage: have_command php && php -v
have_command() have_command()
{ {
command -v "$1" >&/dev/null [ -z "$1" ] && {
echo "Usage: have_command <command>"
return 1
}
command -v "$1" &> /dev/null
} }
# shorthand for checking if the system has the bin in path, # Shorthand for checking if the system has the bin in path,
# this version uses caching # this version uses caching.
# usage: have php && php -v # Usage: have php && php -v
have() have()
{ {
bkt -- which "$1" >&/dev/null bkt -- which "$1" &> /dev/null
} }
# function to run dark-notify and change alacritty theme # Function to run dark-notify and change alacritty theme
# it uses flock to prevent running multiple instances # It uses flock to prevent running multiple instances.
# install flock with `brew install flock` on macOS # Install flock with `brew install flock` on macOS.
function darknotify-alacritty { darknotify_alacritty()
have flock && [[ -f /tmp/dark-notify-alacritty.lock ]] && return {
have dark-notify && { x-have flock && [[ -f /tmp/dark-notify-alacritty.lock ]] && return
# true is used to prevent the command show it was backgrounded x-have dark-notify && {
true & flock /tmp/dark-notify-alacritty.lock dark-notify -c "$HOME/.dotfiles/local/bin/x-change-alacritty-theme" & # subprocess is used to prevent the command from showing it was backgrounded
(
flock /tmp/dark-notify-alacritty.lock dark-notify \
-c "$HOME/.dotfiles/local/bin/x-change-alacritty-theme" &
) &> /dev/null
} }
return 0
} }
darknotify-alacritty darknotify_alacritty
# Function to list installed Homebrew packages using bkt caching
brew_installed() brew_installed()
{ {
bkt -- brew list bkt -- brew list
} }
# shorthand for checking if brew package is installed # Shorthand for checking if a Homebrew package is installed
# usage: have_brew php && php -v # Usage: have_brew php && php -v
have_brew() have_brew()
{ {
! x-have brew && return 125 ! have brew && return 125
if bkt -- brew list "$1" &> /dev/null; then if bkt -- brew list "$1" &> /dev/null; then
return 0 return 0
@@ -64,9 +98,364 @@ have_brew()
fi fi
} }
if [[ -f "$DOTFILES/config/exports-secret" ]]; then # Alacritty preexec hook to update dynamic title
source "$DOTFILES/config/exports-secret" preexec()
fi {
print -n -P "\e]0;$1%~\a"
}
# Update dotfiles
dfu()
{
(
cd "$DOTFILES" && git pull --ff-only && ./install
)
}
# Weather in Tampere, or other city
weather()
{
# https://github.com/chubin/wttr.in#usage
local city="${1:-Tampere}"
curl "http://wttr.in/${city// /+}?2nFQM&lang=fi"
}
# Docker
ssh_docker()
{
docker exec -it "$@" bash
}
# Rector project to php version 8.2 by default.
rector()
{
local php="${1:-82}"
docker run -v "$(pwd)":/project rector/rector:latest process \
"/project/$1" \
--set "php${php}" \
--autoload-file /project/vendor/autoload.php
}
# Commit everything
commit()
{
local commitMessage="$*"
if [ -z "$commitMessage" ]; then
commitMessage="Automated commit"
fi
git add .
git commit -a -m "$commitMessage"
}
scheduler()
{
while :; do
php artisan schedule:run
echo "Sleeping 60 seconds..."
sleep 60
done
}
# Run command silently
# Usage: silent uptime
silent()
{
"$@" >&/dev/null
}
# Check if a file contains non-ascii characters
nonascii()
{
LC_ALL=C grep -n '[^[:print:][:space:]]' "${@}"
}
# Remove non-ascii characters from string
# Usage: strip_nonascii "string"
strip_nonascii()
{
echo "$1" | LC_ALL=C sed 's/[^[:print:][:space:]]//g'
}
# Slugify a string
# Usage: slugify "string"
slugify()
{
echo "$1" | iconv -t ascii//TRANSLIT | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr A-Z a-z
}
# https://stackoverflow.com/a/85932
fn_exists()
{
declare -f -F "$1" > /dev/null
return $?
}
# Creates a random string
rnd()
{
echo $RANDOM | md5sum | head -c 20
}
# return sha256sum for file
# $1 - filename (string)
get_sha256sum()
{
sha256sum "$1" | head -c 64
}
# Replaceable file
#
# $1 - filename (string)
# $2 - filename (string)
#
# Returns 1 when replaceable, 0 when not replaceable.
replacable()
{
FILE1="$1"
FILE2="$2"
[[ ! -r "$FILE1" ]] && {
[[ $VERBOSE -eq 1 ]] && msg_err "File 1 ($FILE1) does not exist"
return 0
}
[[ ! -r "$FILE2" ]] && {
[[ $VERBOSE -eq 1 ]] && msg_err "File 2 ($FILE2) does not exist, replaceable"
return 1
}
FILE1_HASH=$(get_sha256sum "$FILE1")
FILE2_HASH=$(get_sha256sum "$FILE2")
[[ $FILE1_HASH = "" ]] && {
[[ $VERBOSE -eq 1 ]] && msg_err "Could not get hash for file 1 ($FILE1)"
return 0
}
[[ $FILE2_HASH = "" ]] && {
[[ $VERBOSE -eq 1 ]] && msg_err "Could not get hash for file 2 ($FILE2), replaceable"
return 1
}
[[ "$FILE1_HASH" == "$FILE2_HASH" ]] && {
[[ $VERBOSE -eq 1 ]] && msg_ok "Files match, not replaceable: $FILE1"
return 0
}
[[ $VERBOSE -eq 1 ]] && msg_warn "Files do not match ($FILE1_HASH != $FILE2_HASH), replaceable"
return 1
}
export COMPLETION_WAITING_DOTS=true
# Bash completion file location
export BASH_COMPLETION_USER_FILE="${XDG_CONFIG_HOME}/bash-completion/bash_completion"
# History env variables
export HIST_STAMPS="yyyy-mm-dd"
# Larger bash history (allow 32³ entries; default is 500)
export HISTSIZE=32768
export HISTFILESIZE=$HISTSIZE
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
export HISTCONTROL=ignoreboth
# Make some commands not show up in history
export HISTIGNORE="ls:cd:cd -:pwd:exit:date:* --help"
# And include the parameter for ZSH
export HISTORY_IGNORE="(ls|cd|cd -|pwd|exit|date|* --help)"
# Less history location
export LESSHISTFILE="$XDG_STATE_HOME"/less/history
# Highlight section titles in manual pages
# export LESS_TERMCAP_md="$ORANGE"
# zsh autoloaded terminfo
export TERMINFO="${XDG_DATA_HOME}/terminfo"
export TERMINFO_DIRS="${XDG_DATA_HOME}/terminfo":/usr/share/terminfo
# Don't clear the screen after quitting a manual page
export MANPAGER="less -X"
# Always enable colored `grep` output
export GREP_OPTIONS="--color=auto"
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
hash shopt 2> /dev/null && shopt -s checkwinsize
# Antigen configuration
# https://github.com/zsh-users/antigen/wiki/Configuration
msg "Setting up Antigen configuration"
export ADOTDIR="$XDG_DATA_HOME/antigen"
export ANTIGEN_CACHE="$XDG_CACHE_HOME/antigen"
export ANTIGEN_SYSTEM_RECEIPT_F=".local/share/antigen/antigen_system_lastupdate"
export ANTIGEN_PLUGIN_RECEIPT_F=".local/share/antigen/antigen_plugin_lastupdate"
# Ansible configuration
# https://docs.ansible.com/ansible/latest/reference_appendices/config.html
msg "Setting up Ansible configuration"
export ANSIBLE_HOME="$XDG_CONFIG_HOME/ansible"
export ANSIBLE_CONFIG="$XDG_CONFIG_HOME/ansible.cfg"
export ANSIBLE_GALAXY_CACHE_DIR="$XDG_CACHE_HOME/ansible/galaxy_cache"
x-dc "$ANSIBLE_HOME"
x-dc "$ANSIBLE_GALAXY_CACHE_DIR"
# asdf
# https://github.com/asdf-vm/asdf
msg "Setting up asdf configuration"
export ASDF_DIR="${XDG_BIN_HOME}/asdf"
export ASDF_CONFIG_FILE="${XDG_CONFIG_HOME}/asdf/asdfrc"
export ASDF_DATA_DIR="${ASDF_DIR}"
export ASDF_PLUGIN_MANAGER_PLUGIN_VERSIONS_FILENAME="${XDG_CONFIG_HOME}/asdf/plugin-versions"
export ASDF_LOG_FILE="${XDG_CACHE_HOME}/asdf/asdf.log"
export ASDF_NODEJS_LEGACY_FILE_DYNAMIC_STRATEGY="latest_available"
export ASDF_NPM_DEFAULT_PACKAGES_FILE="${XDG_CONFIG_HOME}/asdf/npm-packages"
export ASDF_GOLANG_MOD_VERSION_ENABLED=true
export ASDF_GOLANG_DEFAULT_PACKAGES_FILE="${XDG_CONFIG_HOME}/asdf/golang-packages"
export ASDF_CRATE_DEFAULT_PACKAGES_FILE="${XDG_CONFIG_HOME}/asdf/cargo-packages"
export ASDF_GEM_DEFAULT_PACKAGES_FILE="${XDG_CONFIG_HOME}/asdf/gem-packages"
export ASDF_DIRENV_IGNORE_MISSING_PLUGINS=1
export PATH="${ASDF_DIR}/bin:${PATH}"
# bob manages nvim versions
msg "Setting up bob configuration"
x-path-prepend "$XDG_DATA_HOME/bob/nvim-bin"
# bkt (shell command caching tool) configuration
msg "Setting up bkt configuration"
export BKT_TTL=1m
# brew, https://docs.brew.sh/Manpage
msg "Setting up Homebrew configuration"
export HOMEBREW_NO_ANALYTICS=true
export HOMEBREW_NO_ENV_HINTS=true
export HOMEBREW_BUNDLE_MAS_SKIP=true
export HOMEBREW_BUNDLE_FILE="$XDG_CONFIG_HOME/homebrew/Brewfile"
x-have brew && {
eval "$(brew shellenv)"
}
# composer, https://getcomposer.org/
msg "Setting up Composer configuration"
export COMPOSER_HOME="$XDG_STATE_HOME/composer"
export COMPOSER_BIN="$COMPOSER_HOME/vendor/bin"
export PATH="$COMPOSER_BIN:$PATH"
# direnv, https://direnv.net/
# https://direnv.net/docs/hook.html
# Set the hook to show the direnv message in a different color
export DIRENV_LOG_FORMAT=$'\033[2mdirenv: %s\033[0m'
# docker, https://docs.docker.com/engine/reference/commandline/cli/
msg "Setting up Docker configuration"
export DOCKER_CONFIG="$XDG_CONFIG_HOME/docker"
x-dc "$DOCKER_CONFIG"
# Docker: Disable snyk ad
export DOCKER_SCAN_SUGGEST=false
# ffmpeg
# https://ffmpeg.org/ffmpeg.html
msg "Setting up FFmpeg configuration"
export FFMPEG_DATADIR="$XDG_CONFIG_HOME/ffmpeg"
x-have ffmpeg && x-dc "$FFMPEG_DATADIR"
# GnuPG
# https://gnupg.org/documentation/manuals/gnupg/Invoking-GPG.html
msg "Setting up GnuPG configuration"
export GNUPGHOME="$XDG_DATA_HOME/gnupg"
# Go
# https://golang.org/doc/code.html
msg "Setting up Go configuration"
export GOPATH="$XDG_DATA_HOME/go"
export GOBIN="$XDG_BIN_HOME"
# nb, https://xwmx.github.io/nb/
msg "Setting up nb configuration"
export NBRC_PATH="$XDG_CONFIG_HOME/nbrc"
export NB_DIR="$XDG_STATE_HOME/nb"
# NPM: Add npm packages to path
msg "Setting up NPM configuration"
x-have node && {
NVM_NODE_BIN_DIR="$(dirname "$(which node)")"
export PATH="$NVM_NODE_BIN_DIR:$PATH"
}
# oh-my-posh (omp) configuration
msg "Setting up oh-my-posh configuration"
export OHMYPOSH_CFG="$DOTFILES/config/omp/own.toml"
# op (1Password cli) is present
msg "Setting up 1Password CLI configuration"
export OP_CACHE="$XDG_STATE_HOME/1password"
# Python
#
# pyenv, python environments
msg "Setting up Python configuration"
export WORKON_HOME="$XDG_DATA_HOME/virtualenvs"
export PYENV_ROOT="$XDG_STATE_HOME/pyenv"
export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
x-have pyenv && {
eval "$(pyenv init -)"
}
# Ruby
#
# including: bundler, rbenv
msg "Setting up Ruby configuration"
export GEM_HOME="${XDG_DATA_HOME}"/gem
export GEM_SPEC_CACHE="${XDG_CACHE_HOME}"/gem
export BUNDLE_USER_CONFIG="$XDG_CONFIG_HOME"/bundle
export BUNDLE_USER_CACHE="$XDG_CACHE_HOME"/bundle
export BUNDLE_USER_PLUGIN="$XDG_DATA_HOME"/bundle
export RBENV_ROOT="$XDG_STATE_HOME/rbenv"
x-dc "$RBENV_ROOT"
x-have gem && export PATH="${GEM_HOME}/bin:$PATH"
# Rust / cargo
msg "Setting up Rust/Cargo configuration"
export RUSTUP_HOME="$XDG_DATA_HOME/rustup"
export CARGO_HOME="$XDG_DATA_HOME/cargo"
export PATH="$CARGO_HOME/bin:$PATH"
# screen
# https://www.gnu.org/software/screen/manual/screen.html
msg "Setting up screen configuration"
export SCREENRC="$XDG_CONFIG_HOME/misc/screenrc"
# sonarlint
# https://www.sonarlint.org/
msg "Setting up Sonarlint configuration"
export SONARLINT_USER_HOME="$XDG_DATA_HOME/sonarlint"
# terraform
# https://www.terraform.io/docs/cli/config/config-file.html
# https://www.terraform.io/docs/cli/config/environment-variables.html
msg "Setting up Terraform configuration"
export TF_DATA_DIR="$XDG_STATE_HOME/terraform"
export TF_CLI_CONFIG_FILE="$XDG_CONFIG_HOME/terraform/terraformrc"
export TF_PLUGIN_CACHE_DIR="$XDG_CACHE_HOME/terraform/plugin-cache"
# tldr / tealdeer
msg "Setting up tldr configuration"
export TEALDEER_CONFIG_DIR="$XDG_CONFIG_HOME/tealdeer/"
# tmux
# https://tmux.github.io/
msg "Setting up tmux configuration"
export TMUX_CONF="$XDG_CONFIG_HOME/tmux/tmux.conf"
# wakatime, https://github.com/wakatime/wakatime-cli
msg "Setting up Wakatime configuration"
export WAKATIME_HOME="$XDG_STATE_HOME/wakatime"
x-dc "$WAKATIME_HOME"
# Misc
msg "Setting up miscellaneous configuration"
export CHEAT_USE_FZF=true
export SQLITE_HISTORY="${XDG_CACHE_HOME}/sqlite_history"
source "$DOTFILES/config/exports-shell"
source "$DOTFILES/config/exports-apps"

View File

@@ -1,147 +0,0 @@
#!/usr/bin/env bash
# shellcheck shell=bash
# shellcheck enable=external-sources
# shellcheck disable=1091,2139
# vim: filetype=bash
# Antigen configuration
# https://github.com/zsh-users/antigen/wiki/Configuration
export ADOTDIR="$XDG_DATA_HOME/antigen"
export ANTIGEN_CACHE="$XDG_CACHE_HOME/antigen"
export ANTIGEN_SYSTEM_RECEIPT_F=".local/share/antigen/antigen_system_lastupdate"
export ANTIGEN_PLUGIN_RECEIPT_F=".local/share/antigen/antigen_plugin_lastupdate"
# Ansible configuration
# https://docs.ansible.com/ansible/latest/reference_appendices/config.html
export ANSIBLE_HOME="$XDG_CONFIG_HOME/ansible"
export ANSIBLE_CONFIG="$XDG_CONFIG_HOME/ansible.cfg"
export ANSIBLE_GALAXY_CACHE_DIR="$XDG_CACHE_HOME/ansible/galaxy_cache"
x-dc "$ANSIBLE_HOME"
x-dc "$ANSIBLE_GALAXY_CACHE_DIR"
export ANDROID_HOME="$XDG_DATA_HOME/android"
# asdf
# https://github.com/asdf-vm/asdf
export ASDF_DIR="${XDG_DATA_HOME}/asdf"
export ASDF_CONFIG_FILE="${XDG_CONFIG_HOME}/asdf/asdfrc"
export ASDF_DATA_DIR="${ASDF_DIR}"
# This seems wrong, but `asdf info` and `versions.bash` differ on path resolution.
export ASDF_DEFAULT_TOOL_VERSIONS_FILENAME=".config/asdf/tool-versions"
export ASDF_PLUGIN_MANAGER_PLUGIN_VERSIONS_FILENAME="${XDG_CONFIG_HOME}/asdf/plugin-versions"
export ASDF_LOG_FILE="${XDG_CACHE_HOME}/asdf/asdf.log"
export ASDF_NODEJS_LEGACY_FILE_DYNAMIC_STRATEGY="latest_available"
export ASDF_NPM_DEFAULT_PACKAGES_FILE="${XDG_CONFIG_HOME}/asdf/npm-packages"
export PATH="${ASDF_DIR}/bin:${PATH}"
# bob manages nvim versions
export PATH="$XDG_DATA_HOME/bob/nvim-bin:$PATH"
# bkt (shell command caching tool) configuration
export BKT_TTL=1m
# brew, https://docs.brew.sh/Manpage
export HOMEBREW_NO_ENV_HINTS=true
export HOMEBREW_BUNDLE_MAS_SKIP=true
export HOMEBREW_BUNDLE_FILE="$XDG_CONFIG_HOME/homebrew/Brewfile"
# composer, https://getcomposer.org/
export COMPOSER_HOME="$XDG_STATE_HOME/composer"
export COMPOSER_BIN="$COMPOSER_HOME/vendor/bin"
export PATH="$COMPOSER_BIN:$PATH"
# docker, https://docs.docker.com/engine/reference/commandline/cli/
export DOCKER_CONFIG="$XDG_CONFIG_HOME/docker"
x-dc "$DOCKER_CONFIG"
# Docker: Disable snyk ad
export DOCKER_SCAN_SUGGEST=false
# ffmpeg
export FFMPEG_DATADIR="$XDG_CONFIG_HOME/ffmpeg"
x-have ffmpeg && x-dc "$FFMPEG_DATADIR"
# GnuPG
export GNUPGHOME="$XDG_DATA_HOME/gnupg"
# Go
export GOPATH="$XDG_DATA_HOME/go"
export GOBIN="$XDG_BIN_HOME"
# Herd, herd.laravel.com
# Herd injected PHP binary.
export PATH="$HOME/Library/Application Support/Herd/bin/":$PATH
x-have herd && {
# Herd injected PHP 8.3 configuration.
export HERD_PHP_83_INI_SCAN_DIR="$HOME/Library/Application Support/Herd/config/php/83/"
# Herd injected PHP 7.4 configuration.
export HERD_PHP_74_INI_SCAN_DIR="$HOME/Library/Application Support/Herd/config/php/74/"
}
# nb, https://xwmx.github.io/nb/
export NBRC_PATH="$XDG_CONFIG_HOME/nbrc"
export NB_DIR="$XDG_STATE_HOME/nb"
# NPM: Add npm packages to path
x-have node && {
NVM_NODE_BIN_DIR="$(dirname "$(which node)")"
export PATH="$NVM_NODE_BIN_DIR:$PATH"
}
# op (1Password cli) is present
export OP_CACHE="$XDG_STATE_HOME/1password"
# Python
#
# pyenv, python environments
export WORKON_HOME="$XDG_DATA_HOME/virtualenvs"
export PYENV_ROOT="$XDG_STATE_HOME/pyenv"
export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
x-have pyenv && {
eval "$(pyenv init -)"
}
# Ruby
#
# including: bundler, rbenv
export GEM_HOME="${XDG_DATA_HOME}"/gem
export GEM_SPEC_CACHE="${XDG_CACHE_HOME}"/gem
export BUNDLE_USER_CONFIG="$XDG_CONFIG_HOME"/bundle
export BUNDLE_USER_CACHE="$XDG_CACHE_HOME"/bundle
export BUNDLE_USER_PLUGIN="$XDG_DATA_HOME"/bundle
export RBENV_ROOT="$XDG_STATE_HOME/rbenv"
x-dc "$RBENV_ROOT"
x-have gem && export PATH="${GEM_HOME}/bin:$PATH"
# Rust / cargo
export RUSTUP_HOME="$XDG_DATA_HOME/rustup"
export CARGO_HOME="$XDG_DATA_HOME/cargo"
export PATH="$CARGO_HOME/bin:$PATH"
# screen
export SCREENRC="$XDG_CONFIG_HOME/misc/screenrc"
# sonarlint
export SONARLINT_USER_HOME="$XDG_DATA_HOME/sonarlint"
# terraform
# https://www.terraform.io/docs/cli/config/config-file.html
# https://www.terraform.io/docs/cli/config/environment-variables.html
export TF_DATA_DIR="$XDG_STATE_HOME/terraform"
export TF_CLI_CONFIG_FILE="$XDG_CONFIG_HOME/terraform/terraformrc"
export TF_PLUGIN_CACHE_DIR="$XDG_CACHE_HOME/terraform/plugin-cache"
# tldr / tealdeer
export TEALDEER_CONFIG_DIR="$XDG_CONFIG_HOME/tealdeer/"
# tmux
export TMUX_CONF="$XDG_CONFIG_HOME/tmux/tmux.conf"
# wakatime, https://github.com/wakatime/wakatime-cli
export WAKATIME_HOME="$XDG_STATE_HOME/wakatime"
x-dc "$WAKATIME_HOME"
# Misc
export BAT_THEME="ansi"
export CHEAT_USE_FZF=true
export SQLITE_HISTORY="$XDG_CACHE_HOME"/sqlite_history

View File

@@ -1,19 +1,25 @@
# lakka exports # lakka exports
## LUA ## LUA
x-have luarocks && $(luarocks path --bin) if command -v luarocks &> /dev/null; then
eval "$(luarocks path --bin)"
fi
export PATH="$HOME/.local/go/bin:$PATH" export PATH="$HOME/.local/go/bin:$PATH"
alias logrotate='/usr/sbin/logrotate -s $HOME/logs/state' alias logrotate='/usr/sbin/logrotate -s "$HOME/logs/state"'
alias nano='nano -wS -$' alias nano='nano -wS -$'
alias gpg=gpg2 alias gpg=gpg2
ACME_PATH="$HOME/.acme.sh" ACME_PATH="$HOME/.acme.sh"
# shellcheck source=$HOME/.acme.sh/acme.sh.env # shellcheck source=$HOME/.acme.sh/acme.sh.env
[[ -s "$ACME_PATH/acme.sh.env" ]] && . "$ACME_PATH/acme.sh.env" if [[ -s "$ACME_PATH/acme.sh.env" ]]; then
source "$ACME_PATH/acme.sh.env"
fi
export RVM_PATH="$HOME/.rvm" export RVM_PATH="$HOME/.rvm"
export PATH="$RVM_PATH/bin:$PATH" export PATH="$RVM_PATH/bin:$PATH"
# shellcheck source=$HOME/.rvm/scripts/rvm # shellcheck source=$HOME/.rvm/scripts/rvm
[[ -s "$RVM_PATH/scripts/rvm" ]] && source "$RVM_PATH/scripts/rvm" # Load RVM into a shell session *as a function* if [[ -s "$RVM_PATH/scripts/rvm" ]]; then
source "$RVM_PATH/scripts/rvm" # Load RVM into a shell session *as a function*
fi

View File

@@ -1,40 +0,0 @@
#!/usr/bin/env bash
# shellcheck shell=bash
# shellcheck disable=1091,2046
# vim: filetype=bash
# Bash completion file location
export BASH_COMPLETION_USER_FILE="${XDG_CONFIG_HOME}/bash-completion/bash_completion"
# History env variables
export HIST_STAMPS="yyyy-mm-dd"
# Larger bash history (allow 32³ entries; default is 500)
export HISTSIZE=32768
export HISTFILESIZE=$HISTSIZE
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
export HISTCONTROL=ignoreboth
# Make some commands not show up in history
export HISTIGNORE="ls:cd:cd -:pwd:exit:date:* --help"
# And include the parameter for ZSH
export HISTORY_IGNORE="(ls|cd|cd -|pwd|exit|date|* --help)"
# Less history location
export LESSHISTFILE="$XDG_STATE_HOME"/less/history
# Highlight section titles in manual pages
# export LESS_TERMCAP_md="$ORANGE"
# zsh autoloaded terminfo
export TERMINFO="${XDG_DATA_HOME}/terminfo"
export TERMINFO_DIRS="${XDG_DATA_HOME}/terminfo":/usr/share/terminfo
# Don't clear the screen after quitting a manual page
export MANPAGER="less -X"
# Always enable colored `grep` output
export GREP_OPTIONS="--color=auto"
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
hash shopt 2> /dev/null && shopt -s checkwinsize

View File

@@ -1,3 +0,0 @@
#!/usr/bin/env bash
#
# shell functions

View File

@@ -0,0 +1,2 @@
disable-ipv6
enable-ssh-support

View File

@@ -0,0 +1,2 @@
disable-ipv6
enable-ssh-support

View File

@@ -8,7 +8,6 @@ tap "gesquive/tap"
tap "github/gh" tap "github/gh"
tap "homebrew/autoupdate" tap "homebrew/autoupdate"
tap "homebrew/bundle" tap "homebrew/bundle"
tap "homebrew/cask-fonts"
tap "homebrew/services" tap "homebrew/services"
tap "jesseduffield/lazygit" tap "jesseduffield/lazygit"
tap "k8sgpt-ai/k8sgpt" tap "k8sgpt-ai/k8sgpt"
@@ -57,26 +56,28 @@ brew "apr"
brew "apr-util" brew "apr-util"
# Password hashing library and CLI utility # Password hashing library and CLI utility
brew "argon2" brew "argon2"
# Spell checker with better logic than ispell
brew "aspell"
# Automatic configure script builder # Automatic configure script builder
brew "autoconf" brew "autoconf"
# Collection of over 500 reusable autoconf macros # Tool for generating GNU Standards-compliant Makefiles
brew "autoconf-archive" brew "automake"
# GNU multiple precision arithmetic library # GNU multiple precision arithmetic library
brew "gmp" brew "gmp"
# GNU File, Shell, and Text utilities
brew "coreutils"
# Extendable version manager with support for Ruby, Node.js, Erlang & more
brew "asdf"
# Spell checker with better logic than ispell
brew "aspell"
# Collection of over 500 reusable autoconf macros
brew "autoconf-archive"
# Manage compile and link flags for libraries # Manage compile and link flags for libraries
brew "pkg-config" brew "pkg-config"
# Automated text file generator # Automated text file generator
brew "autogen" brew "autogen"
# Tool for generating GNU Standards-compliant Makefiles
brew "automake"
# Bourne-Again SHell, a UNIX command interpreter # Bourne-Again SHell, a UNIX command interpreter
brew "bash" brew "bash"
# Clone of cat(1) with syntax highlighting and Git integration # Clone of cat(1) with syntax highlighting and Git integration
brew "bat" brew "bat"
# Yet another cross-platform graphical process/system monitor
brew "bottom"
# Software library to render fonts # Software library to render fonts
brew "freetype" brew "freetype"
# XML-based font configuration API for X Windows # XML-based font configuration API for X Windows
@@ -89,24 +90,18 @@ brew "glib"
brew "choose-rust" brew "choose-rust"
# Cross-platform make # Cross-platform make
brew "cmake" brew "cmake"
# GNU File, Shell, and Text utilities
brew "coreutils"
# Open source suite of directory software
brew "openldap"
# Get a file from an HTTP, HTTPS or FTP server # Get a file from an HTTP, HTTPS or FTP server
brew "curl" brew "curl"
# Lightweight DNS forwarder and DHCP server # Lightweight DNS forwarder and DHCP server
brew "dnsmasq" brew "dnsmasq"
# Lightning-fast linter for .env files written in Rust
brew "dotenv-linter"
# Spellchecker wrapping library # Spellchecker wrapping library
brew "enchant" brew "enchant"
# Perl lib for reading and writing EXIF metadata # Perl lib for reading and writing EXIF metadata
brew "exiftool" brew "exiftool"
# Simple, fast and user-friendly alternative to find
brew "fd"
# Banner-like program prints strings as ASCII art # Banner-like program prints strings as ASCII art
brew "figlet" brew "figlet"
# Lock file during command
brew "flock"
# Libraries to talk to Microsoft SQL Server and Sybase databases # Libraries to talk to Microsoft SQL Server and Sybase databases
brew "freetds" brew "freetds"
# Monitor a directory for changes and run a shell command # Monitor a directory for changes and run a shell command
@@ -117,8 +112,6 @@ brew "fzf"
brew "gd" brew "gd"
# Disk usage analyzer with console interface written in Go # Disk usage analyzer with console interface written in Go
brew "gdu" brew "gdu"
# GitHub command-line tool
brew "gh"
# Distributed revision control system # Distributed revision control system
brew "git" brew "git"
# Enable transparent encryption/decryption of files in a git repo # Enable transparent encryption/decryption of files in a git repo
@@ -137,10 +130,10 @@ brew "unbound"
brew "gnutls" brew "gnutls"
# GNU Pretty Good Privacy (PGP) package # GNU Pretty Good Privacy (PGP) package
brew "gnupg" brew "gnupg"
# Open source programming language to build simple/reliable/efficient software
brew "go"
# Library access to GnuPG # Library access to GnuPG
brew "gpgme" brew "gpgme"
# Open source suite of directory software
brew "openldap"
# Manage your GnuPG keys with ease! # Manage your GnuPG keys with ease!
brew "gpg-tui" brew "gpg-tui"
# Image manipulation # Image manipulation
@@ -159,8 +152,6 @@ brew "graphviz"
brew "grep" brew "grep"
# Popular GNU data compression program # Popular GNU data compression program
brew "gzip" brew "gzip"
# Smarter Dockerfile linter to validate best practices
brew "hadolint"
# Improved top (interactive process viewer) # Improved top (interactive process viewer)
brew "htop" brew "htop"
# Portable abstraction of the hierarchical topology of modern architectures # Portable abstraction of the hierarchical topology of modern architectures
@@ -177,8 +168,6 @@ brew "jq"
brew "json-c" brew "json-c"
# Scanning your k8s clusters, diagnosing, and triaging issues in simple English # Scanning your k8s clusters, diagnosing, and triaging issues in simple English
brew "k8sgpt" brew "k8sgpt"
# Network authentication protocol
brew "krb5"
# Tool to detect/remediate misconfig and security risks of GitHub/GitLab assets # Tool to detect/remediate misconfig and security risks of GitHub/GitLab assets
brew "legitify" brew "legitify"
# Secure hashing function # Secure hashing function
@@ -205,8 +194,6 @@ brew "nginx"
brew "nmap" brew "nmap"
# ISO-C API and CLI for generating UUIDs # ISO-C API and CLI for generating UUIDs
brew "ossp-uuid" brew "ossp-uuid"
# General-purpose scripting language
brew "php"
# Coreutils progress viewer # Coreutils progress viewer
brew "progress" brew "progress"
# Python version management # Python version management
@@ -221,22 +208,12 @@ brew "python@3.11"
brew "ruby-build" brew "ruby-build"
# Ruby version manager # Ruby version manager
brew "rbenv" brew "rbenv"
# Search tool like grep and The Silver Searcher
brew "ripgrep"
# Safe, concurrent, practical language
brew "rust"
# Static analysis and lint tool, for (ba)sh scripts # Static analysis and lint tool, for (ba)sh scripts
brew "shellcheck" brew "shellcheck"
# Autoformat shell script source code
brew "shfmt"
# Feature-rich console based todo list manager # Feature-rich console based todo list manager
brew "task" brew "task"
# Terminal user interface for taskwarrior
brew "taskwarrior-tui"
# Send macOS User Notifications from the command-line # Send macOS User Notifications from the command-line
brew "terminal-notifier" brew "terminal-notifier"
# Thin wrapper for Terraform e.g. for locking state
brew "terragrunt"
# Tool which checks for the support of TLS/SSL ciphers and flaws # Tool which checks for the support of TLS/SSL ciphers and flaws
brew "testssl" brew "testssl"
# Terraform version manager inspired by rbenv # Terraform version manager inspired by rbenv
@@ -259,17 +236,32 @@ brew "watch"
brew "wget" brew "wget"
# Check your $HOME for unwanted files and directories # Check your $HOME for unwanted files and directories
brew "xdg-ninja", args: ["HEAD"] brew "xdg-ninja", args: ["HEAD"]
# JavaScript package manager
brew "yarn"
# Watcher for macOS 10.14+ light/dark mode changes # Watcher for macOS 10.14+ light/dark mode changes
brew "cormacrelf/tap/dark-notify" brew "cormacrelf/tap/dark-notify"
# Cleans up your $HOME from those pesky dotfiles # Cleans up your $HOME from those pesky dotfiles
brew "doron-cohen/tap/antidot" brew "doron-cohen/tap/antidot"
# lets you quickly switch between multiple git user profiles # lets you quickly switch between multiple git user profiles
brew "gesquive/tap/git-user" brew "gesquive/tap/git-user"
brew "keith/formulae/reminders-cli"
# Automated code review tool integrated with any code analysis tools regardless of programming language. # Automated code review tool integrated with any code analysis tools regardless of programming language.
brew "reviewdog/tap/reviewdog" brew "reviewdog/tap/reviewdog"
# Imagick PHP extension
brew "shivammathur/extensions/imagick@8.3"
# Mcrypt PHP extension
brew "shivammathur/extensions/mcrypt@8.3"
# Msgpack PHP extension
brew "shivammathur/extensions/msgpack@8.3"
# PCOV PHP extension
brew "shivammathur/extensions/pcov@8.3"
# Redis PHP extension
brew "shivammathur/extensions/redis@8.3"
# Uuid PHP extension
brew "shivammathur/extensions/uuid@8.3"
# Yaml PHP extension
brew "shivammathur/extensions/yaml@8.3"
# General-purpose scripting language
brew "shivammathur/php/php"
# General-purpose scripting language
brew "shivammathur/php/php-debug"
# Command-line interface for 1Password # Command-line interface for 1Password
cask "1password-cli" cask "1password-cli"
# GPU-accelerated terminal emulator # GPU-accelerated terminal emulator
@@ -282,22 +274,6 @@ cask "dbeaver-community"
cask "dbngin" cask "dbngin"
# App to build and share containerised applications and microservices # App to build and share containerised applications and microservices
cask "docker" cask "docker"
# Unofficial overcast.fm podcast app
cask "fog"
# Typeface made for developers
cask "font-jetbrains-mono"
# Developer targeted fonts with a high number of glyphs
cask "font-jetbrains-mono-nerd-font"
cask "font-lato"
cask "font-open-sans"
# Font with a mechanical skeleton and the forms are largely geometric
cask "font-roboto"
cask "font-source-code-pro"
cask "font-source-code-pro-for-powerline"
cask "font-source-sans-pro"
cask "font-source-serif-pro"
# Open Source Webfont Converter
cask "fontplop"
# GIT client # GIT client
cask "fork" cask "fork"
# HTTP and GraphQL Client # HTTP and GraphQL Client
@@ -348,6 +324,8 @@ cask "soundsource"
cask "suspicious-package" cask "suspicious-package"
# Quicklook extension for source files # Quicklook extension for source files
cask "syntax-highlight" cask "syntax-highlight"
# Python IDE for beginners
cask "thonny"
# Configuration application for the Ultimate Hacking Keyboard # Configuration application for the Ultimate Hacking Keyboard
cask "uhk-agent" cask "uhk-agent"
# Open-source code editor # Open-source code editor
@@ -358,3 +336,5 @@ cask "vlc"
cask "voikkospellservice" cask "voikkospellservice"
# Application for generating TOTP and HOTP codes # Application for generating TOTP and HOTP codes
cask "yubico-authenticator" cask "yubico-authenticator"
# Multiplayer code editor
cask "zed"

View File

@@ -32,4 +32,4 @@
"NEWS.md": "6077" "NEWS.md": "6077"
}, },
"version": 6 "version": 6
} }

View File

@@ -111,9 +111,7 @@
{ {
"background": "transparent", "background": "transparent",
"foreground": "lightGreen", "foreground": "lightGreen",
"foreground_templates": [ "foreground_templates": ["{{ if gt .Code 0 }}red{{ end }}"],
"{{ if gt .Code 0 }}red{{ end }}"
],
"properties": { "properties": {
"always_enabled": true "always_enabled": true
}, },
@@ -128,9 +126,7 @@
"transient_prompt": { "transient_prompt": {
"background": "transparent", "background": "transparent",
"foreground": "lightGreen", "foreground": "lightGreen",
"foreground_templates": [ "foreground_templates": ["{{ if gt .Code 0 }}red{{ end }}"],
"{{ if gt .Code 0 }}red{{ end }}"
],
"template": "\u279c " "template": "\u279c "
}, },
"version": 2 "version": 2

View File

@@ -1,24 +0,0 @@
# shellcheck shell=bash
# Defaults
export DOTFILES="$HOME/.dotfiles"
# Explicitly set XDG folders
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_STATE_HOME="$HOME/.local/state"
# custom variables
export XDG_BIN_HOME="$HOME/.local/bin"
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_RUNTIME_DIR="$HOME/.local/run"
# Paths
export PATH="$XDG_BIN_HOME:$DOTFILES/local/bin:$HOME/.local/go/bin:$XDG_DATA_HOME/bob/nvim-bin:$XDG_DATA_HOME/cargo/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
# Split config files
source "$DOTFILES/config/exports"
source "$DOTFILES/config/functions"
source "$DOTFILES/config/alias"

96
config/shared.sh Executable file
View File

@@ -0,0 +1,96 @@
#!/usr/bin/env bash
#
# Shared configuration
#
# shellcheck shell=bash
# Defaults
[ -z "$DOTFILES" ] && export DOTFILES="$HOME/.dotfiles"
export DOTFILES_CURRENT_SHELL=$(basename "$SHELL")
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
# Enable debugging with DEBUG=1
DEBUG="${DEBUG:-0}"
# Enable debugging with DEBUG=1
[ "${DEBUG:-0}" -eq 1 ] && set -x
# Explicitly set XDG folders, if not already set
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
[ -z "$XDG_CONFIG_HOME" ] && export XDG_CONFIG_HOME="$HOME/.config"
[ -z "$XDG_DATA_HOME" ] && export XDG_DATA_HOME="$HOME/.local/share"
[ -z "$XDG_CACHE_HOME" ] && export XDG_CACHE_HOME="$HOME/.cache"
[ -z "$XDG_STATE_HOME" ] && export XDG_STATE_HOME="$HOME/.local/state"
[ -z "$XDG_BIN_HOME" ] && export XDG_BIN_HOME="$HOME/.local/bin"
# Paths
x-path-prepend "/usr/local/bin"
x-path-prepend "/opt/homebrew/bin"
x-path-prepend "$XDG_DATA_HOME/cargo/bin"
x-path-prepend "$XDG_DATA_HOME/bob/nvim-bin"
x-path-prepend "$DOTFILES/local/bin"
x-path-prepend "$XDG_BIN_HOME"
# Custom completion paths
[ -z "$ZSH_CUSTOM_COMPLETION_PATH" ] && export ZSH_CUSTOM_COMPLETION_PATH="$XDG_CONFIG_HOME/zsh/completion"
x-dc "$ZSH_CUSTOM_COMPLETION_PATH"
export FPATH="$ZSH_CUSTOM_COMPLETION_PATH:$FPATH"
if ! declare -f msg > /dev/null; then
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[ "$VERBOSE" -eq 1 ] && echo "$1"
return 0
}
msg "msg was not defined, defined it now"
fi
if ! declare -f msg_err > /dev/null; then
msg "msg_err was not defined, defined it now"
# Function to print error messages and exit
# $1 - error message (string)
msg_err()
{
echo "(!) ERROR: $1" >&2
exit 1
}
fi
if ! declare -f msg_done > /dev/null; then
msg "msg_done was not defined, defined it now"
# Function to print done message
# $1 - message (string)
msg_done()
{
echo "$1"
return 0
}
fi
if ! declare -f msg_run > /dev/null; then
msg "msg_run was not defined, defined it now"
# Function to print running message
# $1 - message (string)
msg_run()
{
echo "$1"
return 0
}
fi
if ! declare -f msg_ok > /dev/null; then
msg "msg_ok was not defined, defined it now"
# Function to print ok message
# $1 - message (string)
msg_ok()
{
echo "$1"
return 0
}
fi
source "$DOTFILES/config/exports"
source "$DOTFILES/config/alias"

53
docs/folders.md Normal file
View File

@@ -0,0 +1,53 @@
# Interesting folders
## XDG
XDG is a set of specifications that provide a standard for the organization
of user-specific files and directories. It is based on the _XDG Base Directory Specification_.
### XDG_BIN_HOME (`$HOME/.local/bin`)
`$XDG_BIN_HOME` defines directory that contains local binaries.
User-specific executable files may be stored in `$HOME/.local/bin`.
Distributions should ensure this directory shows up in the UNIX `$PATH`
environment variable, at an appropriate place.
### XDG_DATA_HOME (`$HOME/.local/share`)
`$XDG_DATA_HOME` defines the base directory relative to which
user-specific _data files_ should be stored.
If `$XDG_DATA_HOME` is either not set or empty,
a default equal to `$HOME/.local/share` should be used.
### XDG_CONFIG_HOME (`$HOME/.config`)
`$XDG_CONFIG_HOME` defines the base directory relative to which
user-specific _configuration files_ should be stored.
If `$XDG_CONFIG_HOME` is either not set or empty,
a default equal to `$HOME/.config` should be used.
### XDG_STATE_HOME (`$HOME/.local/state`)
`$XDG_STATE_HOME` defines the base directory relative to which
user-specific _state files_ should be stored.
If `$XDG_STATE_HOME` is either not set or empty,
a default equal to `$HOME/.local/state` should be used.
The `$XDG_STATE_HOME` contains _state data_ that should
_persist between (application) restarts_, but that is not important or
portable enough to the user that it should be stored in `$XDG_DATA_HOME`.
- It may contain:
- actions history (logs, history, recently used files, …)
- current state of the application that can be reused
on a restart (view, layout, open files, undo history, …)
### XDG_DATA_DIRS
`$XDG_DATA_DIRS` defines the preference-ordered set of base directories
to search for data files in addition to the `$XDG_DATA_HOME` base directory.
The directories in `$XDG_DATA_DIRS` should be separated with a colon ':'.

View File

@@ -19,29 +19,29 @@ n <Space>zc * :Commands<CR>
FZF: search commands. FZF: search commands.
n <Space>zf * :FZF<Space> n <Space>zf * :FZF<Space>
FZF: search for files in given path. FZF: search for files in given path.
<Space>f * <Lua 40: ~/.dotfiles/config/nvim-kickstart/init.lua:505> <Space>f * <Lua 69: ~/.dotfiles/config/nvim-kickstart/init.lua:505>
[F]ormat buffer [F]ormat buffer
n <Space>e * <Lua 80: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <Space>e * <Lua 52: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
n <Space>tz * <Lua 60: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <Space>4 * <Lua 49: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
Toggle ZenMode
n <Space>4 * <Lua 58: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
harpoon to file 4 harpoon to file 4
n <Space>3 * <Lua 57: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <Space>3 * <Lua 48: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
harpoon to file 3 harpoon to file 3
n <Space>2 * <Lua 56: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <Space>2 * <Lua 47: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
harpoon to file 2 harpoon to file 2
n <Space>1 * <Lua 55: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <Space>1 * <Lua 46: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
harpoon to file 1 harpoon to file 1
n <Space>xn * <Lua 54: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <Space>xn * <Lua 45: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
harpoon to next file harpoon to next file
n <Space>xN * <Lua 53: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <Space>xN * <Lua 44: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
harpoon to previous file harpoon to previous file
n <Space>xa * <Lua 52: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <Space>xa * <Lua 43: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
harpoon quick menu harpoon quick menu
n <Space>xA * <Lua 51: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <Space>xA * <Lua 42: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
harpoon file harpoon file
n <Space>5 * <Lua 49: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <Space>5 * <Lua 39: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
harpoon to file 5 harpoon to file 5
n <Space>tz * <Lua 37: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
Toggle ZenMode
n <Space>qq * <Cmd>wq!<CR> n <Space>qq * <Cmd>wq!<CR>
Quickly Quit Quickly Quit
n <Space>bq * <Lua 27: ~/.local/share/bob/v0.10.0/nvim-macos-arm64/share/nvim/runtime/lua/vim/diagnostic.lua:1984> n <Space>bq * <Lua 27: ~/.local/share/bob/v0.10.0/nvim-macos-arm64/share/nvim/runtime/lua/vim/diagnostic.lua:1984>
@@ -74,17 +74,17 @@ n ]% <Plug>(MatchitNormalMultiForward)
n ]d * <Lua 14: vim/_defaults.lua:0> n ]d * <Lua 14: vim/_defaults.lua:0>
Jump to the next diagnostic Jump to the next diagnostic
x a% <Plug>(MatchitVisualTextObject) x a% <Plug>(MatchitVisualTextObject)
o al <Lua 322: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> o al <Lua 236: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Around last textobject Around last textobject
o an <Lua 318: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> o an <Lua 235: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Around next textobject Around next textobject
x al <Lua 292: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> x al <Lua 232: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Around last textobject Around last textobject
x an <Lua 291: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> x an <Lua 231: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Around next textobject Around next textobject
o a <Lua 288: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> o a <Lua 229: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Around textobject Around textobject
x a <Lua 285: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> x a <Lua 227: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Around textobject Around textobject
n dj * <Lua 25: ~/.local/share/bob/v0.10.0/nvim-macos-arm64/share/nvim/runtime/lua/vim/diagnostic.lua:1222> n dj * <Lua 25: ~/.local/share/bob/v0.10.0/nvim-macos-arm64/share/nvim/runtime/lua/vim/diagnostic.lua:1222>
Go to next [D]iagnostic message Go to next [D]iagnostic message
@@ -93,21 +93,21 @@ n dk * <Lua 23: ~/.local/share/bob/v0.10.0/nvim-macos-arm64/share/nvim
o g% <Plug>(MatchitOperationBackward) o g% <Plug>(MatchitOperationBackward)
x g% <Plug>(MatchitVisualBackward) x g% <Plug>(MatchitVisualBackward)
n g% <Plug>(MatchitNormalBackward) n g% <Plug>(MatchitNormalBackward)
o g] <Lua 281: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1142> o g] <Lua 226: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1169>
Move to right "around" Move to right "around"
x g] <Lua 280: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1142> x g] <Lua 225: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1169>
Move to right "around" Move to right "around"
n g] <Lua 278: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1142> n g] <Lua 224: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1169>
Move to right "around" Move to right "around"
o g[ <Lua 277: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1141> o g[ <Lua 223: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1168>
Move to left "around" Move to left "around"
x g[ <Lua 273: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1141> x g[ <Lua 222: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1168>
Move to left "around" Move to left "around"
n g[ <Lua 266: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1141> n g[ <Lua 221: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1168>
Move to left "around" Move to left "around"
n gcA * <Lua 275: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:218> n gcA * <Lua 209: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:218>
Comment insert end of line Comment insert end of line
n gcO * <Lua 274: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:179> n gcO * <Lua 208: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:179>
Comment insert above Comment insert above
n gco * <Lua 11: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:182> n gco * <Lua 11: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:182>
Comment insert below Comment insert below
@@ -129,53 +129,53 @@ x gx * <Lua 9: vim/_defaults.lua:0>
Opens filepath or URI under cursor with the system handler (file explorer, web browser, …) Opens filepath or URI under cursor with the system handler (file explorer, web browser, …)
n gx * <Lua 8: vim/_defaults.lua:0> n gx * <Lua 8: vim/_defaults.lua:0>
Opens filepath or URI under cursor with the system handler (file explorer, web browser, …) Opens filepath or URI under cursor with the system handler (file explorer, web browser, …)
o il <Lua 325: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> o il <Lua 238: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Inside last textobject Inside last textobject
o in <Lua 324: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> o in <Lua 237: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Inside next textobject Inside next textobject
x il <Lua 296: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> x il <Lua 234: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Inside last textobject Inside last textobject
x in <Lua 295: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> x in <Lua 233: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Inside next textobject Inside next textobject
o i <Lua 289: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> o i <Lua 230: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Inside textobject Inside textobject
x i <Lua 286: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1145> x i <Lua 228: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/ai.lua:1172>
Inside textobject Inside textobject
n shn * <Lua 428: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n shn * <Lua 255: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Highlight next surrounding Highlight next surrounding
n sFn * <Lua 427: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sFn * <Lua 254: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Find next left surrounding Find next left surrounding
n sfn * <Lua 426: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sfn * <Lua 253: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Find next right surrounding Find next right surrounding
n srn * <Lua 425: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n srn * <Lua 252: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Replace next surrounding Replace next surrounding
n sdn * <Lua 424: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sdn * <Lua 251: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Delete next surrounding Delete next surrounding
n shl * <Lua 423: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n shl * <Lua 250: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Highlight previous surrounding Highlight previous surrounding
n sFl * <Lua 422: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sFl * <Lua 249: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Find previous left surrounding Find previous left surrounding
n sfl * <Lua 421: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sfl * <Lua 248: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Find previous right surrounding Find previous right surrounding
n srl * <Lua 386: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n srl * <Lua 247: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Replace previous surrounding Replace previous surrounding
n sdl * <Lua 371: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sdl * <Lua 246: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Delete previous surrounding Delete previous surrounding
x sa * :<C-U>lua MiniSurround.add('visual')<CR> x sa * :<C-U>lua MiniSurround.add('visual')<CR>
Add surrounding to selection Add surrounding to selection
n sn * <Lua 370: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:861> n sn * <Lua 245: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:892>
Update `MiniSurround.config.n_lines` Update `MiniSurround.config.n_lines`
n sh * <Lua 351: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sh * <Lua 244: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Highlight surrounding Highlight surrounding
n sF * <Lua 59: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sF * <Lua 243: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Find left surrounding Find left surrounding
n sf * <Lua 331: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sf * <Lua 242: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Find right surrounding Find right surrounding
n sr * <Lua 330: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sr * <Lua 241: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Replace surrounding Replace surrounding
n sd * <Lua 328: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sd * <Lua 240: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Delete surrounding Delete surrounding
n sa * <Lua 327: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1220> n sa * <Lua 239: ~/.local/share/nvim-kickstart/lazy/mini.nvim/lua/mini/surround.lua:1252>
Add surrounding Add surrounding
x <Plug>(MatchitVisualTextObject) <Plug>(MatchitVisualMultiBackward)o<Plug>(MatchitVisualMultiForward) x <Plug>(MatchitVisualTextObject) <Plug>(MatchitVisualMultiBackward)o<Plug>(MatchitVisualMultiForward)
o <Plug>(MatchitOperationMultiForward) * :<C-U>call matchit#MultiMatch("W", "o")<CR> o <Plug>(MatchitOperationMultiForward) * :<C-U>call matchit#MultiMatch("W", "o")<CR>
@@ -197,29 +197,28 @@ x <Plug>(fzf-maps-x) * :<C-U>call fzf#vim#maps('x', 0)<CR>
n <Plug>(fzf-maps-n) * :<C-U>call fzf#vim#maps('n', 0)<CR> n <Plug>(fzf-maps-n) * :<C-U>call fzf#vim#maps('n', 0)<CR>
n <Plug>(fzf-normal) * <Nop> n <Plug>(fzf-normal) * <Nop>
n <Plug>(fzf-insert) * i n <Plug>(fzf-insert) * i
n <Plug>PlenaryTestFile * :lua require('plenary.test_harness').test_file(vim.fn.expand("%:p"))<CR>
x <Plug>(comment_toggle_blockwise_visual) * <Esc><Cmd>lua require("Comment.api").locked("toggle.blockwise")(vim.fn.visualmode())<CR> x <Plug>(comment_toggle_blockwise_visual) * <Esc><Cmd>lua require("Comment.api").locked("toggle.blockwise")(vim.fn.visualmode())<CR>
Comment toggle blockwise (visual) Comment toggle blockwise (visual)
x <Plug>(comment_toggle_linewise_visual) * <Esc><Cmd>lua require("Comment.api").locked("toggle.linewise")(vim.fn.visualmode())<CR> x <Plug>(comment_toggle_linewise_visual) * <Esc><Cmd>lua require("Comment.api").locked("toggle.linewise")(vim.fn.visualmode())<CR>
Comment toggle linewise (visual) Comment toggle linewise (visual)
n <Plug>(comment_toggle_blockwise_count) * <Lua 272: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246> n <Plug>(comment_toggle_blockwise_count) * <Lua 206: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246>
Comment toggle blockwise with count Comment toggle blockwise with count
n <Plug>(comment_toggle_linewise_count) * <Lua 271: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246> n <Plug>(comment_toggle_linewise_count) * <Lua 205: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246>
Comment toggle linewise with count Comment toggle linewise with count
n <Plug>(comment_toggle_blockwise_current) * <Lua 270: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246> n <Plug>(comment_toggle_blockwise_current) * <Lua 204: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246>
Comment toggle current block Comment toggle current block
n <Plug>(comment_toggle_linewise_current) * <Lua 269: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246> n <Plug>(comment_toggle_linewise_current) * <Lua 203: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246>
Comment toggle current line Comment toggle current line
n <Plug>(comment_toggle_blockwise) * <Lua 268: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246> n <Plug>(comment_toggle_blockwise) * <Lua 202: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246>
Comment toggle blockwise Comment toggle blockwise
n <Plug>(comment_toggle_linewise) * <Lua 267: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246> n <Plug>(comment_toggle_linewise) * <Lua 201: ~/.local/share/nvim-kickstart/lazy/Comment.nvim/lua/Comment/api.lua:246>
Comment toggle linewise Comment toggle linewise
n <C-Bslash> * <Lua 75: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <C-Bslash> * <Lua 58: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
n <C-S> * <Cmd>w<CR> n <C-S> * <Cmd>w<CR>
Save file Save file
n <C-K> * <Lua 78: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <C-K> * <Lua 59: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
n <C-J> * <Lua 76: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <C-J> * <Lua 54: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
n <C-H> * <Lua 77: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <C-H> * <Lua 57: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
n <Down> * <Cmd>echo "Use j to move!!"<CR> n <Down> * <Cmd>echo "Use j to move!!"<CR>
n <Up> * <Cmd>echo "Use k to move!!"<CR> n <Up> * <Cmd>echo "Use k to move!!"<CR>
n <Right> * <Cmd>echo "Use l to move!!"<CR> n <Right> * <Cmd>echo "Use l to move!!"<CR>
@@ -228,7 +227,7 @@ n <C-W><C-D> <C-W>d
Show diagnostics under the cursor Show diagnostics under the cursor
n <C-W>d * <Lua 16: vim/_defaults.lua:0> n <C-W>d * <Lua 16: vim/_defaults.lua:0>
Show diagnostics under the cursor Show diagnostics under the cursor
n <C-L> * <Lua 73: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121> n <C-L> * <Lua 56: ~/.local/share/nvim-kickstart/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua:121>
``` ```
- Generated on Sun 30 Jun 2024 14:16:28 EEST - Generated on Mon 22 Jul 2024 17:32:22 EEST

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@@ -16,6 +16,8 @@
~/.local/bin: ~/.local/bin:
~/.local/run: ~/.local/run:
~/.local/share: ~/.local/share:
~/.local/share/gnupg:
mode: 0700
~/.local/state: ~/.local/state:
~/.ssh: ~/.ssh:
mode: 0700 mode: 0700

1
local/bin/asdf Submodule

Submodule local/bin/asdf added at ccdd47df9b

View File

@@ -14,19 +14,92 @@
SCRIPT=$(basename "$0") SCRIPT=$(basename "$0")
if ! declare -f msg > /dev/null; then
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[ "$VERBOSE" -eq 1 ] && echo "$1"
return 0
}
fi
if ! declare -f msg_err > /dev/null; then
# Function to print error messages and exit
# $1 - error message (string)
msg_err()
{
echo "(!) ERROR: $1" >&2
exit 1
}
fi
if ! declare -f msg_done > /dev/null; then
# Function to print done message
# $1 - message (string)
msg_done()
{
echo "✓ $1"
return 0
}
fi
VERSION_NVM="v0.39.5" VERSION_NVM="v0.39.5"
export DOTFILES="$HOME/.dotfiles"
# shellcheck source=./../../scripts/shared.sh
source "$HOME/.dotfiles/scripts/shared.sh"
source "$DOTFILES/config/exports"
source "$DOTFILES/config/alias"
source "$DOTFILES/config/functions"
# Loads configs for better installation experience # Loads configs for better installation experience
x-load-configs source "$DOTFILES/config/shared.sh"
function section_install source "${DOTFILES}/local/bin/msgr"
# -- Menu builder -- #
menu_section()
{
LINE=$(printf '%-18s [ %-15s ]\n' "$1" "$2")
echo -e " $(__log_marker) $LINE"
}
menu_item()
{
LINE=$(printf '%-15s %-30s\n' "$1" "$2")
echo -e "$(__log_indent)$(__log_marker) $LINE"
}
# Takes a bash array ("cow:moo", "dinosaur:roar") and loops
# through the keys to build menu section listing.
menu_usage_header()
{
MENU_CMD="$1"
shift
MENU_ARRAY=("$@")
KEYS=""
for item in "${MENU_ARRAY[@]}"; do
CMD=$(echo "${item}" | awk -F ":" '{print $1}')
KEYS+="${CMD} | "
done
# "???" removes 3 last characters, being " | " from the end
menu_section "$MENU_CMD" "${KEYS%???}"
}
# Takes the usage command "$0 dotfiles" and a
# bash array ("cow:moo" "dinosaur:roar") and loops
# through in building a menu for dfm command usage listing.
menu_usage()
{
MENU_CMD="$1"
shift
MENU_ARRAY=("$@")
msg "$MENU_CMD"
for item in "${MENU_ARRAY[@]}"; do
CMD=$(echo "${item}" | awk -F ":" '{print $1}')
DESC=$(echo "${item}" | awk -F ":" '{print $2}')
menu_item "$CMD" "$DESC"
done
}
section_install()
{ {
USAGE_PREFIX="$SCRIPT install <command>" USAGE_PREFIX="$SCRIPT install <command>"
@@ -56,7 +129,6 @@ function section_install
case "$1" in case "$1" in
all) all)
msgr msg "Starting to install all and reloading configurations..." msgr msg "Starting to install all and reloading configurations..."
x-load-configs
$0 install macos $0 install macos
$0 install fonts $0 install fonts
$0 install antigen $0 install antigen
@@ -65,12 +137,12 @@ function section_install
$0 install asdf $0 install asdf
# $0 install ohmybash # $0 install ohmybash
# $0 install pip # $0 install pip
$0 install cargo # $0 install cargo
$0 install composer $0 install composer
# $0 install dotenv # $0 install dotenv
$0 install fzf $0 install fzf
# $0 install gh # $0 install gh
$0 install go # $0 install go
$0 install cheat-databases $0 install cheat-databases
$0 install imagick $0 install imagick
# $0 install neofetch # $0 install neofetch
@@ -79,7 +151,7 @@ function section_install
$0 install ntfy $0 install ntfy
$0 install z $0 install z
msgr msg "Reloading configurations again..." msgr msg "Reloading configurations again..."
x-load-configs source "$DOTFILES/config/shared.sh"
msgr yay "All done!" msgr yay "All done!"
;; ;;
antigen) antigen)
@@ -210,7 +282,7 @@ function section_install
esac esac
} }
function section_brew section_brew()
{ {
USAGE_PREFIX="$SCRIPT brew <command>" USAGE_PREFIX="$SCRIPT brew <command>"
@@ -258,7 +330,7 @@ function section_brew
! x-have brew && menu_section "$USAGE_PREFIX" "brew not available on this system" ! x-have brew && menu_section "$USAGE_PREFIX" "brew not available on this system"
} }
function section_helpers section_helpers()
{ {
USAGE_PREFIX="$SCRIPT helpers <command>" USAGE_PREFIX="$SCRIPT helpers <command>"
MENU=( MENU=(
@@ -274,21 +346,23 @@ function section_helpers
esac esac
} }
function section_docs section_docs()
{ {
USAGE_PREFIX="$SCRIPT docs <command>" USAGE_PREFIX="$SCRIPT docs <command>"
MENU=( MENU=(
"tmux:Update tmux keybindings documentation" "tmux:Update tmux keybindings documentation"
"nvim:Update nvim keybindings documentation"
) )
case "$1" in case "$1" in
tmux) bash "$DOTFILES/local/bin/x-dfm-docs-xterm-keybindings" ;; tmux) bash "$DOTFILES/local/bin/x-dfm-docs-xterm-keybindings" ;;
nvim) bash "$DOTFILES/scripts/create-nvim-keymaps.sh" ;;
*) menu_usage "$USAGE_PREFIX" "${MENU[@]}" ;; *) menu_usage "$USAGE_PREFIX" "${MENU[@]}" ;;
esac esac
} }
function section_dotfiles section_dotfiles()
{ {
USAGE_PREFIX="$SCRIPT dotfiles <command>" USAGE_PREFIX="$SCRIPT dotfiles <command>"
@@ -344,7 +418,7 @@ function section_dotfiles
esac esac
} }
function section_check section_check()
{ {
USAGE_PREFIX="$SCRIPT check <command>" USAGE_PREFIX="$SCRIPT check <command>"
X_HOSTNAME=$(hostname) X_HOSTNAME=$(hostname)
@@ -369,7 +443,7 @@ function section_check
} }
# Secret menu for visual tests # Secret menu for visual tests
function section_tests section_tests()
{ {
USAGE_PREFIX="$SCRIPT tests <command>" USAGE_PREFIX="$SCRIPT tests <command>"
@@ -398,7 +472,7 @@ function section_tests
esac esac
} }
function usage usage()
{ {
echo "" echo ""
msg_prompt "Usage: $SCRIPT <section> <command>" msg_prompt "Usage: $SCRIPT <section> <command>"

View File

@@ -19,20 +19,28 @@
# Default dir to check, can be overridden in env (.bashrc, .zshrc, ...) # Default dir to check, can be overridden in env (.bashrc, .zshrc, ...)
: "${GIT_DIRTY_DIR:=$HOME/Code}" : "${GIT_DIRTY_DIR:=$HOME/Code}"
# If user has provided folder as a first argument, use it. # Enable verbosity with VERBOSE=1
if [ "$1" != "" ]; then VERBOSE="${VERBOSE:-0}"
GIT_DIRTY_DIR="$1"
fi
# UTF-8 ftw # UTF-8 ftw
GITDIRTY="❌ " GITDIRTY="❌ "
GITCLEAN="✅ " GITCLEAN="✅ "
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[ "$VERBOSE" -eq 1 ] && echo "$1"
}
# Function to handle errors
catch() catch()
{ {
echo "Error $1 occurred on $2" echo "Error $1 occurred on $2"
} }
# Function to check the git status of a directory
# $1 - directory (string)
gitdirty() gitdirty()
{ {
local d="$1" local d="$1"
@@ -40,13 +48,13 @@ gitdirty()
if [[ -d "$d" ]]; then if [[ -d "$d" ]]; then
if [[ -e "$d/.ignore" ]]; then if [[ -e "$d/.ignore" ]]; then
echo -e "" msg "Skipping ignored directory: $d"
else else
# Check that $d is not '--', 'vendor', or 'node_modules' # Check that $d is not '--', 'vendor', or 'node_modules'
if [[ "${d:0:2}" == "--" ]] || [[ "$d" == "vendor" ]] || [[ "$d" == "node_modules" ]]; then if [[ "${d:0:2}" == "--" ]] || [[ "$d" == "vendor" ]] || [[ "$d" == "node_modules" ]]; then
echo "" msg "Skipping excluded directory: $d"
else else
cd "$d" cd "$d" || exit
# If we have `.git` folder, check it. # If we have `.git` folder, check it.
if [[ -d ".git" ]]; then if [[ -d ".git" ]]; then
@@ -60,12 +68,14 @@ gitdirty()
# If it wasn't git repository, check subdirectories. # If it wasn't git repository, check subdirectories.
gitdirtyrepos ./* gitdirtyrepos ./*
fi fi
cd - > /dev/null || exit
fi fi
cd .. > /dev/null
fi fi
fi fi
} }
# Function to check git status for multiple directories
# $@ - directories
gitdirtyrepos() gitdirtyrepos()
{ {
for x in "$@"; do for x in "$@"; do
@@ -73,10 +83,20 @@ gitdirtyrepos()
done done
} }
set -e # Main function
trap 'case $? in main()
139) echo "segfault occurred";; {
11) echo "ssegfault occurred";; # If user has provided folder as a first argument, use it.
esac' EXIT if [ "${1:-}" != "" ]; then
GIT_DIRTY_DIR="$1"
fi
gitdirtyrepos "$GIT_DIRTY_DIR" trap 'case $? in
139) echo "segfault occurred";;
11) echo "segfault occurred";;
esac' EXIT
gitdirtyrepos "$GIT_DIRTY_DIR"
}
main "$@"

View File

@@ -6,18 +6,46 @@
# Copyright 2023 Ismo Vuorinen. All Rights Reserved. # Copyright 2023 Ismo Vuorinen. All Rights Reserved.
# License: MIT <https://opensource.org/license/mit/> # License: MIT <https://opensource.org/license/mit/>
STARTING_PATH=${1:-$(pwd)} set -euo pipefail
DIRS=$(find "$STARTING_PATH" -mindepth 1 -maxdepth 1 -type d) # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
for DIR in $DIRS; do # Function to print messages if VERBOSE is enabled
echo "-> Processing dir: $DIR" # $1 - message (string)
cd "$DIR" || exit 1 msg()
if [ -d "$DIR/.git" ]; then {
git fsck --no-dangling --full --no-progress [ "$VERBOSE" -eq 1 ] && echo "$1"
echo "" }
fi
done
echo "" # Function to perform git fsck on a repository
echo "Done." # $1 - directory (string)
fsck_repo()
{
local dir=$1
msg "Processing dir: $dir"
(
cd "$dir" || exit 1
if [ -d ".git" ]; then
git fsck --no-dangling --full --no-progress
echo ""
fi
)
}
# Main function
main()
{
local starting_path=${1:-$(pwd)}
local dirs
dirs=$(find "$starting_path" -mindepth 1 -maxdepth 1 -type d)
for dir in $dirs; do
fsck_repo "$dir"
done
echo ""
echo "Done."
}
main "$@"

View File

@@ -8,7 +8,39 @@
# Copyright (c) 2023 Ismo Vuorinen. All Rights Reserved. # Copyright (c) 2023 Ismo Vuorinen. All Rights Reserved.
# License: MIT <https://opensource.org/license/mit/> # License: MIT <https://opensource.org/license/mit/>
for f in */; do (cd "$f" && echo "-> $f" && git pull --rebase --autostash --prune); done set -euo pipefail
echo "Done." # Enable verbosity with VERBOSE=1
echo "" VERBOSE="${VERBOSE:-0}"
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[ "$VERBOSE" -eq 1 ] && echo "$1"
}
# Function to update a git repository
# $1 - directory (string)
update_repo()
{
local dir=$1
(
cd "$dir" || exit
msg "Updating $dir"
git pull --rebase --autostash --prune
)
}
# Main function to update all subfolder git repositories
main()
{
for dir in */; do
update_repo "$dir"
done
echo "Done."
echo ""
}
main "$@"

View File

@@ -3,33 +3,84 @@
# Backup a folder with a timestamp # Backup a folder with a timestamp
# Usage: x-backup-folder folder_to_backup [filename] # Usage: x-backup-folder folder_to_backup [filename]
# If filename is not provided, folder_to_backup will be used # If filename is not provided, folder_to_backup will be used
#
# Example: x-backup-folder ~/Documents/MyFolder # Example: x-backup-folder ~/Documents/MyFolder
# #
# Copyright (c) 2022 Ismo Vuorinen. All Rights Reserved. # Copyright (c) 2022 Ismo Vuorinen. All Rights Reserved.
# Licensed under the MIT license. # Licensed under the MIT license.
DIRECTORY=$1 set -euo pipefail
FILENAME=$2
if [ -z "${DIRECTORY}" ]; then # Enable verbosity with VERBOSE=1
echo "DIRECTORY (first argument) is missing" VERBOSE="${VERBOSE:-0}"
echo "Usage: $0 folder_to_backup"
exit
fi
if [ -z "${FILENAME}" ]; then # Function to print usage information
FILENAME=$DIRECTORY usage()
fi {
echo "Usage: $0 folder_to_backup [filename]"
exit 1
}
FILENAME=$( # Function to print messages if VERBOSE is enabled
${FILENAME} \ # $1 - message (string)
| tr '/' _ \ msg()
| iconv -t ascii//TRANSLIT \ {
| sed -r s/[^a-zA-Z0-9]+/_/g \ [[ "$VERBOSE" -eq 1 ]] && echo "$1"
| sed -r s/^_+\|-+$//g }
)
TIMESTAMP=$(date "+%Y%m%d_%H%M%S") # Function to print error messages and exit
FILENAME_TIMESTAMP="${FILENAME}_${TIMESTAMP}" # $1 - error message (string)
msg_err()
{
echo "(!) ERROR: $1" >&2
exit 1
}
tar cvzf "${FILENAME_TIMESTAMP}.tar.gz" "${DIRECTORY}/" # Function to sanitize the filename
# $1 - filename (string)
sanitize_filename()
{
local filename=$1
echo "$filename" | tr '/' '_' | iconv -t ascii//TRANSLIT | sed -r 's/[^a-zA-Z0-9]+/_/g' | sed -r 's/^_+|_+$//g'
}
# Function to backup the directory
# $1 - directory to backup (string)
# $2 - filename prefix (string)
backup_directory()
{
local directory=$1
local filename=$2
local sanitized_filename
sanitized_filename=$(sanitize_filename "$filename")
local timestamp
timestamp=$(date "+%Y%m%d_%H%M%S")
local filename_timestamp="${sanitized_filename}_${timestamp}"
msg "Backing up directory '$directory' to '${filename_timestamp}.tar.gz'"
tar cvzf "${filename_timestamp}.tar.gz" "${directory}/"
msg "Backup completed and saved to '${filename_timestamp}.tar.gz'"
}
# Main function
main()
{
if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then
usage
fi
local directory=$1
local filename=${2:-$directory}
if [ -z "$directory" ]; then
msg_err "DIRECTORY (first argument) is missing"
fi
backup_directory "$directory" "$filename"
}
main "$@"

View File

@@ -1,43 +1,91 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# #
# Backup local MySQL Database tables with certain prefix. # Backup local MySQL Database tables with a certain prefix.
# Ismo Vuorinen <https://github.com/ivuorinen> 2018 # Ismo Vuorinen <https://github.com/ivuorinen> 2018
# License: MIT # License: MIT
SCRIPT=$(basename "$0") set -euo pipefail
PREFIX=$1
FILENAME=$2
DATABASE=$3
: "${VERBOSE:=0}" # Enable verbosity with VERBOSE=1
: "${DEFAULT_DATABASE:="wordpress"}" VERBOSE="${VERBOSE:-0}"
# Default database
DEFAULT_DATABASE="wordpress"
if [ -z "${PREFIX}" ]; then # Function to print usage information
echo "(!) TABLE_PREFIX (first argument) is missing" usage()
{
echo "(>) Usage: $SCRIPT <TABLE_PREFIX> <FILENAME_PREFIX> [<DATABASE>]" echo "(>) Usage: $SCRIPT <TABLE_PREFIX> <FILENAME_PREFIX> [<DATABASE>]"
echo " * <TABLE_PREFIX> = database table prefix, e.g. 'wp_'" echo " * <TABLE_PREFIX> = database table prefix, e.g. 'wp_'"
echo " * <FILENAME_PREFIX> = FILENAME prefix, defaults to table prefix. Use something descriptive e.g. 'wordpress'" echo " * <FILENAME_PREFIX> = FILENAME prefix, defaults to table prefix. Use something descriptive e.g. 'wordpress'"
echo " * <DATABASE> = [optional] Third argument DATABASE, defaults to '$DEFAULT_DATABASE'." echo " * <DATABASE> = [optional] Third argument DATABASE, defaults to '$DEFAULT_DATABASE'."
exit 0 exit 1
fi }
if [ -z "${FILENAME}" ]; then # Function to print messages if VERBOSE is enabled
# echo "FILENAME (second argument) is missing, using PREFIX ($PREFIX)" # $1 - message (string)
FILENAME=$PREFIX msg()
fi {
[[ "$VERBOSE" -eq 1 ]] && echo "$1"
}
if [ -z "${DATABASE}" ]; then # Function to print error messages and exit
# echo "DATABASE (third argument) is missing, using default ($DEFAULT_DATABASE)" # $1 - error message (string)
DATABASE=$DEFAULT_DATABASE msg_err()
fi {
echo "(!) ERROR: $1" >&2
exit 1
}
TIMESTAMP=$(date "+%Y%m%d_%H%M%S") # Function to backup MySQL tables with a certain prefix
FILENAME_TIMESTAMP="${DATABASE}_${FILENAME}_${TIMESTAMP}.sql" # $1 - table prefix (string)
# $2 - filename prefix (string)
# $3 - database name (string)
backup_mysql_tables()
{
local prefix=$1
local filename=$2
local database=$3
mysqldump \ local timestamp
"${DATABASE}" \ timestamp=$(date "+%Y%m%d_%H%M%S")
"$( local filename_timestamp="${database}_${filename}_${timestamp}.sql"
echo "show tables like '${PREFIX}%';" \
| mysql "${DATABASE}" \ msg "Backing up tables with prefix '$prefix' from database '$database' to file '$filename_timestamp'"
| sed '/Tables_in/d'
)" > "${FILENAME_TIMESTAMP}" mysqldump \
"${database}" \
"$(
echo "show tables like '${prefix}%';" \
| mysql "${database}" \
| sed '/Tables_in/d'
)" > "${filename_timestamp}"
msg "Backup completed and saved to '$filename_timestamp'"
}
# Main function
main()
{
if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then
usage
fi
local prefix=$1
local filename=$2
local database=${3:-$DEFAULT_DATABASE}
if [ -z "$prefix" ]; then
msg_err "TABLE_PREFIX (first argument) is missing"
fi
if [ -z "$filename" ]; then
filename=$prefix
fi
backup_mysql_tables "$prefix" "$filename" "$database"
}
# Script name for usage information
SCRIPT=$(basename "$0")
main "$@"

View File

@@ -1,19 +1,71 @@
#!/usr/bin/env bash #!/usr/bin/env bash
#
# Adapted from https://gist.github.com/xqm32/17777d035930d622d0ff7530bfab61fd # Adapted from https://gist.github.com/xqm32/17777d035930d622d0ff7530bfab61fd
# #
set -euo pipefail
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
A_DIR="$HOME/.config/alacritty" A_DIR="$HOME/.config/alacritty"
set_alacritty_theme() { # Function to print usage information
cp -f "$A_DIR/theme-$1.toml" "$A_DIR/theme-active.toml" usage()
{
echo "Usage: $0 <theme>"
echo "Available themes: (dark|night) to turn dark mode on, (day|light) to turn off"
exit 1
} }
ALACRITTY_THEME=$1
if [ "$ALACRITTY_THEME" = "dark" ] || [ "$ALACRITTY_THEME" = "night" ]; then
set_alacritty_theme "night"
else
set_alacritty_theme "day"
fi
# Notify alacritty about the changes # Function to print messages if VERBOSE is enabled
touch "$A_DIR/alacritty.toml" # $1 - message (string)
msg()
{
[[ "$VERBOSE" -eq 1 ]] && echo "$1"
return 0
}
# Function to set the alacritty theme
# $1 - theme (string)
set_alacritty_theme()
{
local theme=$1
local theme_file="$A_DIR/theme-$theme.toml"
msg "Setting alacritty theme to $theme ($theme_file)"
cp -f "$theme_file" "$A_DIR/theme-active.toml"
return 0
}
# Function to notify alacritty about the changes
notify_alacritty()
{
msg "Notifying alacritty about the changes"
touch "$A_DIR/alacritty.toml"
return 0
}
# Main function
main()
{
if [ "$#" -ne 1 ]; then
usage
fi
local alacritty_theme=$1
case "$alacritty_theme" in
day | light)
set_alacritty_theme "day"
;;
*)
set_alacritty_theme "night"
;;
esac
notify_alacritty
msg "Theme set successfully!"
exit 0
}
main "$@"

View File

@@ -1,19 +1,41 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# #
# Check git repo's files .gitattributes and are all of them mapped. # Check git repo's files .gitattributes and ensure all of them are mapped.
# Ismo Vuorinen <https://github.com/ivuorinen> 2022 # Ismo Vuorinen <https://github.com/ivuorinen> 2022
# source "${DOTFILES}/config/shared.sh"
if ! command -v git &> /dev/null; then set -euo pipefail
echo "git could not be found, please install it first"
exit 1
fi
missing_attributes=$(git ls-files | git check-attr -a --stdin | grep "text: auto") # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
if [[ "$missing_attributes" ]]; then # Function to check if git is installed
echo ".gitattributes rule missing for the following files:" check_git_installed()
echo "$missing_attributes" {
else if ! command -v git &> /dev/null; then
echo "All files have a corresponding rule in .gitattributes" msg_err "git could not be found, please install it first"
fi fi
}
# Function to check for missing .gitattributes
check_gitattributes()
{
local missing_attributes
missing_attributes=$(git ls-files | git check-attr -a --stdin | grep "text: auto" || true)
if [[ -n "$missing_attributes" ]]; then
echo ".gitattributes rule missing for the following files:"
echo "$missing_attributes"
else
echo "All files have a corresponding rule in .gitattributes"
fi
}
# Main function
main()
{
check_git_installed
check_gitattributes
}
main "$@"

View File

@@ -4,13 +4,49 @@
# Copyright (c) 2023 Ismo Vuorinen. All Rights Reserved. # Copyright (c) 2023 Ismo Vuorinen. All Rights Reserved.
# Licensed under MIT License. http://www.opensource.org/licenses/mit-license. # Licensed under MIT License. http://www.opensource.org/licenses/mit-license.
dir="$1" # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
[ $# -eq 0 ] && { # Function to print usage information
usage()
{
echo "Usage: $0 full/path/to/dir/to/create" echo "Usage: $0 full/path/to/dir/to/create"
exit 1 exit 1
} }
if [ ! -d "$dir" ]; then # Function to print messages if VERBOSE is enabled
mkdir -p "$dir" && exit 0 # $1 - message (string)
fi msg()
{
[[ "$VERBOSE" -eq 1 ]] && echo "$1"
return 0
}
# Function to create a directory if it doesn't exist
# $1 - directory to create (string)
create_directory()
{
local dir=$1
if [ ! -d "$dir" ]; then
msg "Creating directory: $dir"
mkdir -p "$dir"
msg "Directory created: $dir"
else
msg "Directory already exists: $dir"
fi
return 0
}
# Main function
main()
{
if [ "$#" -ne 1 ]; then
usage
fi
create_directory "$1"
exit 0
}
main "$@"

View File

@@ -2,24 +2,48 @@
# #
# x-xterm-update-keybindings # x-xterm-update-keybindings
# Updates $HOME/.dotfiles/docs/tmux.md with my keybindings. # Updates $HOME/.dotfiles/docs/tmux.md with my keybindings.
# Usage: x-xterm-update-keybindings
# Author: Ismo Vuorinen <https://github.com/ivuorinen> 2024
# shellcheck source=./../../config/shared.sh
source "${DOTFILES}/config/shared.sh"
# shellcheck source=./../../scripts/shared.sh # Enable verbosity with VERBOSE=1
source "$HOME/.dotfiles/scripts/shared.sh" VERBOSE="${VERBOSE:-0}"
x-have tmux || { # Check if tmux is installed
msg_err "tmux not found" && exit 0 check_tmux_installed()
{
if ! x-have tmux; then
msg_err "tmux not found"
fi
} }
TMUX_KEYBINDINGS_DOCS="$DOTFILES/docs/tmux-keybindings.md" # Generate tmux keybindings documentation
generate_tmux_keybindings()
{
local tmux_keybindings_docs="$1"
CB="\n\`\`\`\n" local cb="\n\`\`\`\n"
KB=$(tmux lsk -Tprefix -N | sed -e 's/^/ /;') local kb
H="# tmux keybindings\n" kb=$(tmux lsk -Tprefix -N | sed -e 's/^/ /;')
L="\nLeader: \`<ctrl><space>\`\n" local h="# tmux keybindings\n"
local l="\nLeader: \`<ctrl><space>\`\n"
# Generalize expanded $HOME to "$HOME" # Generalize expanded $HOME to "$HOME"
KB="${KB//$HOME/\$HOME}" kb="${kb//$HOME/\$HOME}"
msg "Outputting tmux keybindings to $TMUX_KEYBINDINGS_DOCS" msg "Outputting tmux keybindings to $tmux_keybindings_docs"
echo -e "${H}${L}${CB}${KB}${CB}" > "$TMUX_KEYBINDINGS_DOCS" echo -e "${h}${l}${cb}${kb}${cb}" > "$tmux_keybindings_docs"
msg_done "Done!" msg "Done!"
}
# Main function
main()
{
check_tmux_installed
local tmux_keybindings_docs="$DOTFILES/docs/tmux-keybindings.md"
generate_tmux_keybindings "$tmux_keybindings_docs"
}
main "$@"

View File

@@ -1,17 +1,102 @@
#!/usr/bin/env bash #!/usr/bin/env bash
#
# Fetch the latest release version of a GitHub repository in tar.gz format (e.g. v1.0.0.tar.gz)
# Usage: x-gh-get-latest-release-targ <repo> [--get]
# Author: Ismo Vuorinen <https://github.com/ivuorinen> 2024
REPO=$1 set -euo pipefail
if [ -z "$REPO" ]; then # Enable verbosity with VERBOSE=1
echo "Usage: $0 <repo> (e.g. ivuorinen/dotfiles)" VERBOSE="${VERBOSE:-0}"
# Function to print usage information
usage()
{
echo "Usage: $0 <github repo> [--get] (e.g. ivuorinen/dotfiles)"
echo " --get: Download and extract the tarball"
exit 1 exit 1
fi }
LOCATION=$(curl -s "https://api.github.com/repos/${REPO}/releases/latest" \ # Function to print messages if VERBOSE is enabled
| sed -Ene '/^[[:blank:]]+"tarball_url":[[:blank:]]"(https:[^"]+)",/s//\1/p') # $1 - message (string)
msg()
{
[[ "$VERBOSE" -eq 1 ]] && echo "$1"
return 0
}
echo "Downloading and extracting from: $LOCATION" # Function to fetch the tarball URL of the latest release from GitHub
# $1 - GitHub repository (string)
get_latest_tarball_url()
{
local repo=$1
curl --location --silent "$LOCATION" | tar --extract --gzip --file=- local tarball_url
tarball_url=$(curl -s "https://api.github.com/repos/${repo}/releases/latest" \
| sed -Ene '/^[[:blank:]]+"tarball_url":[[:blank:]]"(https:[^"]+)",/s//\1/p')
if [ -z "$tarball_url" ]; then
echo "(!) Failed to fetch the tarball URL for repository: $repo"
exit 1
fi
echo "$tarball_url"
return 0
}
# Function to download and extract the tarball
# $1 - tarball URL (string)
download_and_extract()
{
local url="$1"
msg "Downloading and extracting from: $url"
curl --location --silent "$url" | tar --extract --gzip --file=- || {
echo "(!) Failed to download or extract the tarball."
exit 1
}
return 0
}
# Main function
main()
{
if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then
usage
fi
local repo=$1
local get_tarball=false
if [ "$#" -eq 2 ]; then
# Check if the first or second argument is --get
if [ "$1" == "--get" ] || [ "$2" == "--get" ]; then
get_tarball=true
else
usage
fi
fi
# Check if the first argument is --get
if [ "$1" == "--get" ]; then
repo="$2"
fi
msg "Fetching the tarball URL for the latest release of repository: $repo"
local location
location=$(get_latest_tarball_url "$repo")
if $get_tarball; then
download_and_extract "$location"
else
echo "$location"
fi
return 0
}
main "$@"
# vim: set ts=2 sw=2 ft=sh et: # vim: set ts=2 sw=2 ft=sh et:

View File

@@ -1,18 +1,68 @@
#!/usr/bin/env bash #!/usr/bin/env bash
#
# Get latest release version from GitHub
# Usage: x-gh-get-latest-version <repo>
# Author: Ismo Vuorinen <https://github.com/ivuorinen> 2024
REPO=$1 set -euo pipefail
if [ -z "$REPO" ]; then # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
# Function to print usage information
usage()
{
echo "Usage: $0 <repo> (e.g. ivuorinen/dotfiles)" echo "Usage: $0 <repo> (e.g. ivuorinen/dotfiles)"
exit 1 exit 1
fi }
VERSION=$( # Function to print messages if VERBOSE is enabled
curl -s "https://api.github.com/repos/${REPO}/releases/latest" \ # $1 - message (string)
msg()
{
[[ "$VERBOSE" -eq 1 ]] && echo "$1"
return 0
}
# Function to fetch the latest release version from GitHub
# $1 - GitHub repository (string)
get_latest_release()
{
local repo=$1
local version
version=$(curl -s "https://api.github.com/repos/${repo}/releases/latest" \
| grep "tag_name" \ | grep "tag_name" \
| awk '{print substr($2, 2, length($2)-3)}' | awk -F '"' '{print $4}')
)
echo "$VERSION" if [ -z "$version" ]; then
msg "Failed to fetch the latest release version for repository: $repo"
echo ""
exit 1
fi
echo "$version"
return 0
}
# Main function
main()
{
if [ "$#" -ne 1 ]; then
usage
fi
local repo=$1
msg "Fetching the latest release version for repository: $repo"
local version
version=$(get_latest_release "$repo")
echo "$version"
return 0
}
main "$@"
# vim: set ts=2 sw=2 ft=sh et: # vim: set ts=2 sw=2 ft=sh et:

View File

@@ -1,9 +1,47 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Returns which status # Returns which status
which "$1" >&/dev/null
if [ $? -eq 0 ]; then # Enable verbosity with VERBOSE=1
exit 0 VERBOSE="${VERBOSE:-0}"
else
# Function to print usage information
usage()
{
echo "Usage: $0 <command>"
exit 1 exit 1
fi }
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[[ "$VERBOSE" -eq 1 ]] && echo "$1"
return 0
}
# Function to check if a command exists
# $1 - command to check (string)
check_command()
{
local cmd=$1
if command -v "$cmd" > /dev/null 2>&1; then
msg "(*) '$cmd' is available on the system."
exit 0
else
msg "(!) '$cmd' is NOT available on the system."
exit 1
fi
}
# Main function
main()
{
if [ "$#" -ne 1 ]; then
usage
fi
check_command "$1"
}
main "$@"

View File

@@ -2,76 +2,96 @@
# Load our configuration files # Load our configuration files
# Copyright (c) 2023 Ismo Vuorinen. All Rights Reserved. # Copyright (c) 2023 Ismo Vuorinen. All Rights Reserved.
set -euo pipefail DOTFILES="${DOTFILES:-$HOME/.dotfiles}"
# Set verbosity with VERBOSE=1 x-load-configs source "$DOTFILES/config/shared.sh"
VERBOSE="${VERBOSE:=0}"
[ "$VERBOSE" = "1" ] && { # Enable verbosity with VERBOSE=1 x-load-configs
set -x VERBOSE="${VERBOSE:-0}"
# Enable debugging with DEBUG=1 x-load-configs
DEBUG="${DEBUG:-0}"
# Get the hostname
CONFIG_HOST="$(hostname -s)"
# Enable debugging if requested
[ "$DEBUG" = "1" ] && set -x
CONFIG_PATH="${DOTFILES}/config"
[ -d "$DOTFILES" ] || {
msg_err "Error: DOTFILES is not set or $DOTFILES does not exist"
} }
CONFIG_PATH="$DOTFILES/config" # Function to print messages if VERBOSE is enabled
# $1 - message type (string)
# $2 - message content (string)
config_msg()
{
# if $1 is empty, return
[ -z "$1" ] && return
[ -z "$2" ] && $2=""
# Load the shell dotfiles, and then some: local msg_type="$1"
HOST="$(hostname -s)" local msg_content="$2"
[ "$VERBOSE" = "1" ] && { [[ "$VERBOSE" -eq 1 ]] && printf 'x-load-configs: %s %s\n' "$msg_type" "$msg_content"
echo "x-load-configs: VERBOSE=1" return 0
echo "x-load-configs: HOST: $HOST"
} }
configFile() # Function to get the full path of a config file
# $1 - filename (string)
config_file_path()
{ {
echo "$CONFIG_PATH/$1" echo "$CONFIG_PATH/$1"
} }
configMsg() # Function to source configuration files
source_config()
{ {
printf 'x-load-configs: %s %s\n' "$1" "$2" local config_file=$1
if [ -f "$config_file" ]; then
eval "$config_file"
config_msg "Sourced" "$config_file"
else
msg "Config file $config_file not found"
fi
return 0
} }
loadConfigFiles() # Function to load a configuration file
# $1 - base config file name (string)
load_config_files()
{ {
CONFIG_FILE=$1 local config_file="$1"
SECRET_FILE=$CONFIG_FILE-secret local secret_file="${config_file}-secret"
HOST_FILE=$CONFIG_FILE-$HOST local host_file="${config_file}-${CONFIG_HOST}"
SECRET_HOST=$HOST_FILE-secret local secret_host_file="${host_file}-secret"
[ "$VERBOSE" = "1" ] && configMsg "?" "$CONFIG_FILE" config_msg "Looking for" "$config_file"
[ -r "$config_file" ] && {
# global (exports|alias|functions) FILENAME for all hosts source_config "$config_file"
# shellcheck source=../config/exports
[ -r "$CONFIG_FILE" ] && {
source "$CONFIG_FILE" && [ "$VERBOSE" = "1" ] && configMsg "Found" "$CONFIG_FILE"
} }
# global secret FILENAME, git ignored config_msg "Looking for" "$secret_file"
# shellcheck source=../config/exports-secret [ -r "$secret_file" ] && {
[ "$VERBOSE" = "1" ] && configMsg "?" "$SECRET_FILE" source_config "$secret_file"
[ -r "$SECRET_FILE" ] && {
source "$SECRET_FILE" && [ "$VERBOSE" = "1" ] && configMsg "Found" "$SECRET_FILE"
} }
# host specific (exports|alias|functions) FILENAME
# shellcheck source=../config/exports config_msg "Looking for" "$host_file"
[ "$VERBOSE" = "1" ] && configMsg "?" "$HOST_FILE" [ -r "$host_file" ] && {
[ -r "$HOST_FILE" ] && { source_config "$host_file"
source "$HOST_FILE" && [ "$VERBOSE" = "1" ] && configMsg "Found" "$HOST_FILE"
} }
# host specific (exports|alias|functions) FILENAME, git ignored
# shellcheck source=../config/exports config_msg "Looking for" "$secret_host_file"
[ "$VERBOSE" = "1" ] && configMsg "?" "$SECRET_HOST" [ -r "$secret_host_file" ] && {
[ -r "$SECRET_HOST" ] && { source_config "$secret_host_file"
source "$SECRET_HOST" \
&& [ "$VERBOSE" = "1" ] && configMsg "Found" "$SECRET_HOST"
} }
return 0
} }
FILE_EXPORTS=$(configFile "exports") config_msg "VERBOSE=1" "Verbose mode enabled"
FILE_FUNCTIONS=$(configFile "functions") config_msg "HOST" "$CONFIG_HOST"
FILE_ALIAS=$(configFile "alias")
loadConfigFiles "$FILE_EXPORTS"
loadConfigFiles "$FILE_FUNCTIONS"
loadConfigFiles "$FILE_ALIAS"
load_config_files "$(config_file_path "exports")"
load_config_files "$(config_file_path "alias")"
exit 0 exit 0

View File

@@ -1,4 +1,50 @@
#!/usr/bin/env bash #!/usr/bin/env bash
#
# Create a directory and cd into it # Create a directory and cd into it
# Usage: mkcd <dir>
mkdir -p "$@" && cd "$@" || exit set -euo pipefail
# Set verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
# Function to print usage information
usage()
{
echo "Usage: $0 <dir>"
exit 1
}
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[[ "$VERBOSE" -eq 1 ]] && echo "$1"
}
# Function to create a directory and cd into it
# $1 - directory to create and cd into (string)
mkcd()
{
local dir=$1
mkdir -p "$dir" && msg "Directory $dir created"
cd "$dir" || {
msg "Failed to cd into $dir"
exit 1
}
msg "Changed directory to $dir"
}
# Main function
main()
{
if [ "$#" -ne 1 ]; then
usage
fi
mkcd "$1"
}
main "$@"

View File

@@ -6,16 +6,34 @@
# Modified by: Ismo Vuorinen <https://github.com/ivuorinen> 2020 # Modified by: Ismo Vuorinen <https://github.com/ivuorinen> 2020
# Originally from: https://www.commandlinefu.com/commands/view/8951 # Originally from: https://www.commandlinefu.com/commands/view/8951
# Original author: https://www.commandlinefu.com/commands/by/wickedcpj # Original author: https://www.commandlinefu.com/commands/by/wickedcpj
#
echo 'User: Command: PID: Port:'
echo '========================================================='
lsof -i 4 -P -n +c 0 \ set -euo pipefail
| grep -i 'listen' \
| awk '{print $3, $1, $2, $9}' \
| sed 's/ [a-z0-9\.\*]*:/ /' \
| sort -k 3 -n \
| xargs printf '%-15s %-25s %-8s %-5s\n' \
| uniq
echo "" # Function to print the header
print_header()
{
echo 'User: Command: PID: Port:'
echo '========================================================='
}
# Function to list open ports
list_open_ports()
{
lsof -i 4 -P -n +c 0 \
| grep -i 'listen' \
| awk '{print $3, $1, $2, $9}' \
| sed 's/ [a-z0-9\.\*]*:/ /' \
| sort -k 3 -n \
| xargs printf '%-15s %-25s %-8s %-5s\n' \
| uniq
}
# Main function
main()
{
print_header
list_open_ports
echo ""
}
main "$@"

View File

@@ -3,5 +3,38 @@
# Add a directory to the beginning of the PATH if it's not already there. # Add a directory to the beginning of the PATH if it's not already there.
# Usage: x-path-append <dir> # Usage: x-path-append <dir>
x-path-remove "$1" # Set verbosity with VERBOSE=1
export PATH="${PATH:+"$PATH:"}$1" VERBOSE="${VERBOSE:-0}"
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[[ "$VERBOSE" -eq 1 ]] && echo "$1"
}
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <dir>"
exit 1
fi
dir="$1"
if echo "$PATH" | grep -qE "(^|:)$dir($|:)"; then
export PATH=$(echo -n "$PATH" | awk -v RS=: -v ORS=: "\$0 != \"$dir\"" | sed 's/:$//')
msg "Directory $dir has been removed from PATH"
else
msg "Directory $dir is not in PATH"
fi
if [ ! -d "$dir" ]; then
msg "(?) Directory $dir does not exist"
exit 0
fi
if echo "$PATH" | grep -qE "(^|:)$dir($|:)"; then
msg "(!) Directory $dir is already in PATH"
else
export PATH="${PATH:+"$PATH:"}$dir"
msg "(!) Directory $dir has been added to the end of PATH"
fi

View File

@@ -3,4 +3,31 @@
# Add a directory to the front of the PATH if it exists and is not already there # Add a directory to the front of the PATH if it exists and is not already there
# Usage: x-path-prepend <dir> # Usage: x-path-prepend <dir>
export PATH="$1${PATH:+":$PATH"}" # Set verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[[ "$VERBOSE" -eq 1 ]] && echo "$1"
}
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <dir>"
exit 1
fi
dir="$1"
if [ ! -d "$dir" ]; then
msg "(?) Directory $dir does not exist"
exit 0
fi
if echo "$PATH" | grep -qE "(^|:)$dir($|:)"; then
msg "(!) Directory $dir is already in PATH"
else
export PATH="$dir${PATH:+":$PATH"}"
msg "(!) Directory $dir has been added to the front of PATH"
fi

View File

@@ -3,4 +3,27 @@
# Remove a directory from the PATH # Remove a directory from the PATH
# Usage: x-path-remove <dir> # Usage: x-path-remove <dir>
export PATH=$(echo -n "$PATH" | awk -v RS=: -v ORS=: "\$0 != \"$1\"" | sed 's/:$//') # Set verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[[ "$VERBOSE" -eq 1 ]] && echo "$1"
}
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <dir>"
exit 1
fi
dir="$1"
if ! echo "$PATH" | grep -qE "(^|:)$dir($|:)"; then
msg "(?) Directory $dir is not in PATH"
exit 0
fi
export PATH=$(echo -n "$PATH" | awk -v RS=: -v ORS=: "\$0 != \"$dir\"" | sed 's/:$//')
msg "(!) Directory $dir has been removed from PATH"

View File

@@ -1,5 +1,15 @@
#!/usr/bin/env php #!/usr/bin/env php
<?php <?php
/**
* Quota usage
* Show quota usage
*
* @package x-quota-usage
* @version 1.0.0
* @link https://github.com/ivuorinen/dotfiles/blob/main/local/bin/x-quota-usage.php
* @license MIT
* @author Ismo Vuorinen <https://github.com/ivuorinen>
*/
error_reporting(E_ALL); error_reporting(E_ALL);
$debug = false; $debug = false;

View File

@@ -14,168 +14,119 @@
# pkill (coreutils) # pkill (coreutils)
# #
# 2021-2022 : João F. © BeyondMagic <koetemagie@gmail.com> # 2021-2022 : João F. © BeyondMagic <koetemagie@gmail.com>
# 2024- : Ismo Vuorinen <https://github.com/ivuorinen>
# 1. Variables. # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
# Variables
frame_rate=30
name='camera'
path_recordings="$HOME/.cache/recording"
replace_id="$HOME/.cache/recording.id"
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{ {
# A. Indepedent of variables. [ "$VERBOSE" -eq 1 ] && echo "$1"
frame_rate=30
time=10
name='カメラ'
# B. Depedent of variables.
path_recordings="$HOME/.cache/recording"
icons="$HOME/.local/share/icons"
replace_id="$HOME/.cache/recording.id"
} }
# 2. Functions to minise code. # Notify function
#{
# I.
notify() notify()
{ {
notify-call --replace-file "$replace_id" "$@"
notify-call \
--replace-file "$replace_id" \
"$@"
} }
# II. # Stop recording function
stop() stop()
{ {
# A.
#pkill -INT -f 'ffmpeg -f alsa -ac 1 -i pulse -f x11grab -r 30 -s '
giph --stop giph --stop
# C.
eww update record_menu=false eww update record_menu=false
}
#}
# #. Kill previous giph process.
if [ "$(pgrep -f 'bash.+giph')" ]; then
# A. Let the user decide.
next=$(notify \
-d 'echo yes' \
"$name" \
'Do you want to stop current recording?')
# A. End with previous giph session.
[ "$next" = 'yes' ] && stop
# B. Just exit cleanly.
exit 0
fi
# 2. To see if current fyletype is supported.
{
case "$1" in
# A. Supported.
'mkv' | 'gif' | 'webm' | 'mp4') ;;
# B. Not supported.
*)
# I. Let the user decide.
format=$(notify \
-o 'echo mkv:MKV' \
-o 'echo webm:WEBM' \
-o 'echo mp4:MP4' \
-o 'echo gif:GIF' \
"$name" \
'What is the filetype you want to record?')
# II. Execute itself.
exec $0 $format $2
;;
esac
} }
# 3. Whether to choose fullscreen recording or sizeable one. # Function to check for required applications
check_dependencies()
{ {
if [ "$2" = 'fullscreen' ]; then for cmd in ffmpeg notify-send.sh pkill eww giph slop; do
if ! command -v "$cmd" &> /dev/null; then
# A. From <WxH+X+Y> monitor. echo "Required command '$cmd' not found. Please install it before running this script."
geometry="$(xrandr | awk '/ primary/{print $4}')" exit 1
fi
elif [ "$2" = 'set' ]; then done
}
# A. To get size & position of the recording set.
geometry="$(slop -f "%wx%h+%x+%y")"
else
# I. Let the user decide.
next=$(notify \
-o 'echo fullscreen:The whole_screen!' \
-o 'echo set:Let me set.' \
"$name" \
'How exactly do you want to record?')
# II. Execute itself.
exec $0 $1 $next
# Function to kill previous giph process if running
kill_previous_process()
{
if pgrep -f 'bash.+giph' > /dev/null; then
next=$(notify -d 'echo yes' "$name" 'Do you want to stop current recording?')
[ "$next" = 'yes' ] && stop
exit 0
fi fi
} }
# 4. Start recording. # Function to check if the current file type is supported
check_file_type()
{ {
case "$1" in
'mkv' | 'gif' | 'webm' | 'mp4') ;;
*)
format=$(
notify \
-o 'echo mkv:MKV' \
-o 'echo webm:WEBM' \
-o 'echo mp4:MP4' \
-o 'echo gif:GIF' \
"$name" \
'What is the filetype you want to record?'
)
exec "$0" "$format" "$2"
;;
esac
}
# Function to determine recording scope
determine_scope()
{
if [ "$2" = 'fullscreen' ]; then
geometry=$(xrandr | awk '/ primary/{print $4}')
elif [ "$2" = 'set' ]; then
geometry=$(slop -f "%wx%h+%x+%y")
else
next=$(notify -o 'echo fullscreen:The whole_screen!' -o 'echo set:Let me set.' "$name" 'How exactly do you want to record?')
exec "$0" "$1" "$next"
fi
}
# Function to start recording
start_recording()
{
mkdir -p "$path_recordings" mkdir -p "$path_recordings"
name_file="$path_recordings/$2-$(date +'%a_%b_%d_%H:%M:%S').$1" name_file="$path_recordings/$2-$(date +'%a_%b_%d_%H:%M:%S').$1"
# A. Timer.
#for i in {1..$time}; do
# # I.
# notify "Starting in $i seconds."
# # II. Wait for next second.
# sleep ${i}s
#done
# B. Send a sign of recording to lemonbar so that you know it is being recorded.
eww update record_menu=true eww update record_menu=true
# C. Start recording. giph -g "$geometry" -f "$frame_rate" "$name_file"
giph \
-g "$geometry" \
-f "$frame_rate" \
"$name_file"
# D.
stop stop
# E. responder=$(notify -o 'echo open:See file?' -o 'echo none:Hell no' "$name" 'Recording has finished.')
responder="$(notify \
-o 'echo open:See file?' \
-o 'echo none:Hell no' \
"$name" \
'Recording has finished.')"
# F. For action-driven response.
if [ "$responder" = 'open' ]; then if [ "$responder" = 'open' ]; then
nohup gtk-launch "$(xdg-mime query default inode/directory)" "$path_recordings/" > /dev/null 2>&1 &
# I.
nohup \
gtk-launch \
"$(xdg-mime query default inode/directory)" \
"$path_recordings/" \
> /dev/null 2>&1 &
fi fi
rm -f "$replace_id"
} }
rm -f "$replace_id" main()
{
check_dependencies
kill_previous_process "$@"
check_file_type "$@"
determine_scope "$@"
start_recording "$@"
}
main "$@"

View File

@@ -1,50 +1,71 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Check which php versions are installed with brew, and create aliases for each installation. # Check which PHP versions are installed with brew, and create aliases for each installation.
# Copyright (c) 2023 Ismo Vuorinen. All Rights Reserved. # Copyright (c) 2023 Ismo Vuorinen. All Rights Reserved.
set -euo pipefail set -euo pipefail
# Set verbosity with VERBOSE=1 x-load-configs # Set verbosity with VERBOSE=1 x-set-php-aliases
VERBOSE="${VERBOSE:=0}" VERBOSE="${VERBOSE:-0}"
[ "$VERBOSE" = "2" ] && { # Enable debugging if verbosity is set to 2
set -x [ "$VERBOSE" = "2" ] && set -x
}
! x-have brew && { # Check if brew is installed, if not exit.
if ! command -v brew &> /dev/null; then
exit 0 exit 0
fi
# Function to read installed PHP versions using brew
get_php_versions()
{
local versions=()
while IFS="" read -r line; do
versions+=("$line")
done < <(bkt -- brew list | grep '^php')
echo "${versions[@]}"
} }
# Get installed php versions from brew and setup aliases # Function to create aliases for each PHP version
php_versions=() create_aliases()
while IFS="" read -r line; do php_versions+=("$line"); done < <(bkt -- brew list | grep '^php') {
local php_versions=("$@")
local php_error_reporting='-d error_reporting=22527'
php_error_reporting='-d error_reporting=22527' for version in "${php_versions[@]}"; do
[ "$VERBOSE" = "1" ] && echo "Setting aliases for $version"
for version in "${php_versions[@]}"; do # Drop the dot from version (e.g., 8.0 -> 80)
[ "$VERBOSE" = "1" ] && echo "Setting aliases for $version" local php_abbr="${version//\./}"
# drop the dot from version (8.0 -> 80) # Replace "php@" with "p" so "php@80" becomes "p80"
php_abbr="${version//\./}" local php_alias="${php_abbr//php@/p}"
# replace "php@" with "p" so "php@80" becomes "p80"
php_alias="${php_abbr//php@/p}"
# Fetch the exec path once # Fetch the exec path once
php_exec="$HOMEBREW_PREFIX/opt/$version/bin/php" local php_exec="$HOMEBREW_PREFIX/opt/$version/bin/php"
[ -f "$php_exec" ] && { if [ -f "$php_exec" ]; then
[ "$VERBOSE" = "1" ] && echo "-> php_exec $php_exec" [ "$VERBOSE" = "1" ] && echo "-> php_exec $php_exec"
# Raw PHP without error_reporting flag. # Raw PHP without error_reporting flag.
# shellcheck disable=SC2139 alias "${php_alias}r"="$php_exec"
alias "${php_alias}"r="$php_exec"
# PHP with error_reporting flag. # PHP with error_reporting flag.
# shellcheck disable=SC2139,SC2140 alias "$php_alias"="$php_exec $php_error_reporting"
alias "$php_alias"="$php_exec $php_error_reporting"
# Local PHP Server. # Local PHP Server.
# shellcheck disable=SC2139,SC2140 alias "${php_alias}s"="$php_exec -S localhost:9000"
alias "${php_alias}s"="$php_exec -S localhost:9000"
# Use composer with specific PHP and error_reporting flag on. # Use composer with specific PHP and error_reporting flag on.
# shellcheck disable=SC2139,SC2140 alias "${php_alias}c"="$php_exec $php_error_reporting $(which composer)"
alias "${php_alias}c"="$php_exec $php_error_reporting $(which composer)" fi
} done
done }
# Main function
main()
{
local php_versions
php_versions=($(get_php_versions))
create_aliases "${php_versions[@]}"
}
main "$@"

View File

@@ -6,47 +6,73 @@
# Ismo Vuorinen <https://github.com/ivuorinen> 2023 # Ismo Vuorinen <https://github.com/ivuorinen> 2023
# MIT License # MIT License
set -euo pipefail
# ENV Variables # ENV Variables
: "${VERBOSE:=0}" # VERBOSE=1 x-sha256sum-matcher file1 file2 : "${VERBOSE:=0}" # VERBOSE=1 x-sha256sum-matcher file1 file2
file_1="$1" # Return sha256sum for file
file_2="$2"
# return sha256sum for file
# $1 - filename (string) # $1 - filename (string)
get_sha256sum() get_sha256sum()
{ {
sha256sum "$1" | head -c 64 sha256sum "$1" | head -c 64
} }
[ $# -eq 0 ] && { # Print message if VERBOSE is enabled
echo "Usage: $0 file1.sh file2.sh" && exit 1 # $1 - message (string)
}
msg() msg()
{ {
[[ "$VERBOSE" -eq 1 ]] && echo "$1" [[ "$VERBOSE" -eq 1 ]] && echo "$1"
} }
# Print error message and exit
# $1 - error message (string)
error() error()
{ {
msg "(!) ERROR: $1" && exit 1 msg "(!) ERROR: $1"
exit 1
} }
if [ ! -f "$file_1" ]; then # Validate input arguments
error "File 1 does not exist: $file_1" validate_inputs()
fi {
if [ "$#" -ne 2 ]; then
echo "Usage: $0 file1 file2"
exit 1
fi
}
if [ ! -f "$file_2" ]; then # Check if file exists
error "File 2 does not exist: $file_2" # $1 - filename (string)
fi check_file_exists()
{
local filename=$1
if [ ! -f "$filename" ]; then
error "File does not exist: $filename"
fi
}
file_1_hash=$(get_sha256sum "$file_1") # Main function
file_2_hash=$(get_sha256sum "$file_2") main()
{
local file_1=$1
local file_2=$2
if [ "$file_1_hash" != "$file_2_hash" ]; then validate_inputs "$file_1" "$file_2"
error "Files do not match" check_file_exists "$file_1"
else check_file_exists "$file_2"
msg "(*) Success: Files do match"
exit 0 local file_1_hash
fi local file_2_hash
file_1_hash=$(get_sha256sum "$file_1")
file_2_hash=$(get_sha256sum "$file_2")
if [ "$file_1_hash" != "$file_2_hash" ]; then
error "Files do not match"
else
msg "(*) Success: Files do match"
fi
}
main "$@"

View File

@@ -1,39 +1,69 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Generate thumbnails using magick # Generate thumbnails using ImageMagick (magick)
# https://imagemagick.org/script/download.php # https://imagemagick.org/script/download.php
# #
# Defaults to current directory creating thumbs with 1000x1000 # Defaults to current directory creating thumbnails with 1000x1000
# images with 200px white borders around the original image. # dimensions and 200px white borders around the original image.
# #
# Defaults can be overridden with ENV variables like this: # Defaults can be overridden with ENV variables like this:
# $ THMB_BACKGROUND=black x-thumbgen ~/images/ # $ THMB_BACKGROUND=black x-thumbgen ~/images/
# #
# Created by: Ismo Vuorinen <https://github.com/ivuorinen> 2015 # Created by: Ismo Vuorinen <https://github.com/ivuorinen> 2015
: "${THMB_SOURCE:=$1}" set -euo pipefail
# Default values
: "${THMB_SOURCE:=${1:-}}"
: "${THMB_BACKGROUND:=white}" : "${THMB_BACKGROUND:=white}"
: "${THMB_RESIZE:=800x800}" : "${THMB_RESIZE:=800x800}"
: "${THMB_EXTENT:=1000x1000}" : "${THMB_EXTENT:=1000x1000}"
[ $# -eq 0 ] && { # Print usage information
usage()
{
echo "Usage: $0 /full/path/to/image/folder" echo "Usage: $0 /full/path/to/image/folder"
exit 1 exit 1
} }
if [ "$THMB_SOURCE" == "" ] || [ ! -d "$THMB_SOURCE" ]; then # Check if ImageMagick is installed
THMB_SOURCE=$(pwd) check_magick_installed()
fi {
if ! command -v magick &> /dev/null; then
echo "magick not found in PATH, https://imagemagick.org/script/download.php"
exit 1
fi
}
if command -v magick &> /dev/null; then # Generate thumbnails
generate_thumbnails()
{
local source=$1
magick \ magick \
"$THMB_SOURCE/*" \ "${source}/*" \
-resize "$THMB_RESIZE" \ -resize "$THMB_RESIZE" \
-background "$THMB_BACKGROUND" \ -background "$THMB_BACKGROUND" \
-gravity center \ -gravity center \
-extent "$THMB_EXTENT" \ -extent "$THMB_EXTENT" \
-set filename:fname '%t_thumb.%e' +adjoin '%[filename:fname]' -set filename:fname '%t_thumb.%e' +adjoin '%[filename:fname]'
}
else # Main function
echo "magick not found in PATH, https://imagemagick.org/script/download.php" main()
fi {
# Validate input
if [ -z "$THMB_SOURCE" ]; then
usage
fi
# Check if the source directory is valid
if [ ! -d "$THMB_SOURCE" ]; then
echo "Invalid directory: $THMB_SOURCE"
exit 1
fi
check_magick_installed
generate_thumbnails "$THMB_SOURCE"
}
main "$@"

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
## #
# This script contains helper for sha256 validating your downloads # This script contains a helper for sha256 validating your downloads
# #
# Source: https://gist.github.com/onnimonni/b49779ebc96216771a6be3de46449fa1 # Source: https://gist.github.com/onnimonni/b49779ebc96216771a6be3de46449fa1
# Author: Onni Hakala # Author: Onni Hakala
@@ -9,44 +9,60 @@
# Updated by Ismo Vuorinen <https://github.com/ivuorinen> 2022 # Updated by Ismo Vuorinen <https://github.com/ivuorinen> 2022
## ##
if ! command -v sha256 &> /dev/null; then set -euo pipefail
echo "git could not be found, please install it first"
exit
fi
# Stop program and give error message # Stop program and give error message
# $1 - error message (string) # $1 - error message (string)
function error error()
{ {
echo "(!) ERROR: $1" echo "(!) ERROR: $1" >&2
exit 1 exit 1
} }
# return sha256sum for file # Check for sha256sum command
if ! command -v sha256sum &> /dev/null; then
error "sha256sum could not be found, please install it first"
fi
# Return sha256sum for file
# $1 - filename (string) # $1 - filename (string)
function get_sha256sum get_sha256sum()
{ {
sha256sum "$1" | head -c 64 sha256sum "$1" | head -c 64
} }
# Good variable names pls # Validate input arguments
filename=$1 validate_inputs()
file_hash=$2 {
if [ -z "${filename:-}" ]; then
error "You need to provide filename as the first parameter"
fi
# Check input if [ -z "${file_hash:-}" ]; then
if [ -z "$filename" ]; then error "You need to provide sha256sum as the second parameter"
error "You need to provide filename in first parameter" fi
fi }
if [ -z "$file_hash" ]; then # Main validation logic
error "You need to provide sha256sum in second parameter" validate_file()
fi {
if [ ! -f "$filename" ]; then
error "File $filename doesn't exist"
elif [ "$(get_sha256sum "$filename")" = "$file_hash" ]; then
echo "(*) Success: $filename matches provided sha256sum"
else
error "$filename doesn't match provided sha256sum"
fi
}
# Check if the file is valid # Main function
if [ ! -f "$filename" ]; then main()
error "File $filename doesn't exist" {
elif [ "$(get_sha256sum "$filename")" = "$file_hash" ]; then filename=$1
echo "(*) Success: $filename matches provided sha256sum" file_hash=$2
else
error "$filename doesn't match provided sha256sum" validate_inputs
fi validate_file
}
main "$@"

View File

@@ -10,23 +10,31 @@
# ./when-down 1.2.3.4 ssh 1.2.3.4 # ./when-down 1.2.3.4 ssh 1.2.3.4
# #
# # Ensure we received the correct number of arguments.
# Ensure we received the correct number of arguments. if [ "$#" -lt 2 ]; then
#
if [ $# -lt 2 ]; then
echo "Usage: $0 HOST COMMAND..." echo "Usage: $0 HOST COMMAND..."
exit 1 exit 1
fi fi
HOST=$1 wait_for_host_down()
{
local host=$1
echo "Waiting for $HOST to get down..." echo "Waiting for $host to go down..."
true while ping -c 1 -W 1 "$host" > /dev/null 2>&1; do
while [ $? -ne 1 ]; do sleep 1
ping -c 1 -W 1 "$HOST" > /dev/null done
done }
shift main()
{
local host=$1
shift
"$@" wait_for_host_down "$host"
"$@"
}
main "$@"

View File

@@ -14,32 +14,46 @@
# ./when-up ssh 1.2.3.4 # ./when-up ssh 1.2.3.4
# #
# # Ensure we received the correct number of arguments.
# Ensure we received the correct number of arguments. if [ "$#" -lt 2 ]; then
#
if [ $# -lt 2 ]; then
echo "Usage: $0 HOST COMMAND..." echo "Usage: $0 HOST COMMAND..."
exit 1 exit 1
fi fi
if [ "$1" = "ssh" ]; then get_host()
HOST=$2 {
else if [ "$1" = "ssh" ]; then
HOST=$1 echo "$2"
fi else
echo "$1"
fi
}
echo "Waiting for $HOST to come online..." wait_for_host()
{
local host=$1
ping -c 1 -W 1 "$HOST" > /dev/null echo "Waiting for $host to come online..."
while [ $? -ne 0 ]; do
sleep 1
ping -c 1 -W 1 "$HOST" > /dev/null
done
# By the time we reach here the ping-command has completed successfully while ! ping -c 1 -W 1 "$host" > /dev/null 2>&1; do
# so we can launch the command we were given - along with any arguments. sleep 1
if [ "$1" != "ssh" ]; then done
shift }
fi
"$@" main()
{
local host
host=$(get_host "$@")
wait_for_host "$host"
if [ "$1" = "ssh" ]; then
shift 1
else
shift
fi
"$@"
}
main "$@"

View File

@@ -28,7 +28,8 @@
}, },
"homepage": "https://github.com/ivuorinen/dotfiles#readme", "homepage": "https://github.com/ivuorinen/dotfiles#readme",
"devDependencies": { "devDependencies": {
"@ivuorinen/base-configs": "^1.1.0" "@ivuorinen/base-configs": "^1.1.0",
"prettier-plugin-sh": "^0.14.0"
}, },
"packageManager": "yarn@1.22.22" "packageManager": "yarn@1.22.22"
} }

View File

@@ -1,23 +1,28 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Create file containing key mappings for Neovim # Create file containing key mappings for Neovim
# Usage: ./create-nvim-keymaps.sh # Usage: ./create-nvim-keymaps.sh
#
source "$HOME/.dotfiles/scripts/shared.sh" # shellcheck source=shared.sh
source "$HOME/.dotfiles/config/exports" source "${DOTFILES}/config/shared.sh"
source "$HOME/.dotfiles/config/alias"
source "$HOME/.dotfiles/config/functions"
DEST="$HOME/.dotfiles/docs/nvim-keybindings.md" DEST="$HOME/.dotfiles/docs/nvim-keybindings.md"
main()
{ {
printf "# nvim keybindings\n"; msg "Generating Neovim keybindings documentation"
printf "\n";
printf "\`\`\`txt";
} > "$DEST"
NVIM_APPNAME="nvim-kickstart" nvim -c "redir! >> $DEST" -c 'silent verbose map' -c 'redir END' -c 'q' {
printf "# nvim keybindings\n\n"
printf "\`\`\`txt\n"
} > "$DEST"
printf "\n\`\`\`\n\n- Generated on %s\n" "$(date)" >> "$DEST" NVIM_APPNAME="nvim-kickstart" nvim -c "redir! >> $DEST" -c 'silent verbose map' -c 'redir END' -c 'q'
# Remove lines with "Last set from" from the file printf "\n\`\`\`\n\n- Generated on %s\n" "$(date)" >> "$DEST"
sed -e '/^ Last set from/d' "$DEST" > "$DEST.tmp" && mv "$DEST.tmp" "$DEST"
# Remove lines with "Last set from" from the file
sed -e '/^ Last set from/d' "$DEST" > "${DEST}.tmp" && mv "${DEST}.tmp" "$DEST"
msg "Neovim keybindings documentation generated at $DEST"
}
main "$@"

View File

@@ -1,11 +1,18 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# #
# Export oh-my-posh configuration as an image
#
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" source "${DOTFILES}/config/shared.sh"
set -e
cd "$DOTFILES" || exit main()
oh-my-posh config export image \ {
--config "$OHMYPOSH_CFG" \ cd "$DOTFILES" || msg_err "Failed to change directory to $DOTFILES"
--output "$HOME/.dotfiles/.github/screenshots/oh-my-posh.png" \
--author "Ismo Vuorinen" oh-my-posh config export image \
--config "$OHMYPOSH_CFG" \
--output "$HOME/.dotfiles/.github/screenshots/oh-my-posh.png" \
--author "Ismo Vuorinen"
}
main "$@"

View File

@@ -1,78 +1,78 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# #
# Install asdf # Install asdf
source "${DOTFILES}/config/shared.sh"
source "${XDG_CONFIG_HOME}/exports" export ASDF_DIR="${XDG_BIN_HOME}/asdf"
source "${XDG_CONFIG_HOME}/alias" export PATH="${ASDF_DIR}/bin:$PATH"
source "${XDG_CONFIG_HOME}/functions"
source "${DOTFILES}/scripts/shared.sh"
# Installation variables
ASDF_GIT="https://github.com/asdf-vm/asdf.git"
ASDF_PATH="${XDG_DATA_HOME}/asdf"
if [ ! -d "$ASDF_PATH" ]; then
git clone --depth 1 "$ASDF_GIT" "$ASDF_PATH" \
--branch v0.14.0
msg_done "asdf ($ASDF_PATH/) installed"
else
msg_done "asdf ($ASDF_PATH/) already installed"
fi
export PATH="${ASDF_PATH}/bin:$PATH"
msg "Sourcing asdf in your shell" msg "Sourcing asdf in your shell"
. "$ASDF_PATH/asdf.sh" . "$ASDF_DIR/asdf.sh"
# Update asdf, and plugins # Function to update asdf and plugins
asdf update update_asdf()
{
asdf update
asdf plugin add asdf-plugin-manager https://github.com/asdf-community/asdf-plugin-manager.git asdf plugin add asdf-plugin-manager https://github.com/asdf-community/asdf-plugin-manager.git
asdf install asdf-plugin-manager latest asdf install asdf-plugin-manager latest
asdf global asdf-plugin-manager "$(asdf latest asdf-plugin-manager)" asdf global asdf-plugin-manager "$(asdf latest asdf-plugin-manager)"
asdf-plugin-manager version asdf-plugin-manager version
asdf-plugin-manager export > "${ASDF_PLUGIN_MANAGER_PLUGIN_VERSIONS_FILENAME}" asdf-plugin-manager add-all
asdf-plugin-manager add-all
asdf install asdf install
}
# ASDF_INSTALLABLES=( ASDF_INSTALLABLES=(
# "nodejs:github.com/asdf-vm/asdf-nodejs.git" "1password-cli:github.com/NeoHsu/asdf-1password-cli.git"
# "1password-cli:github.com/NeoHsu/asdf-1password-cli.git" "age:github.com/threkk/asdf-age.git"
# "age:github.com/threkk/asdf-age.git" "bottom:github.com/carbonteq/asdf-btm.git"
# "bottom:github.com/carbonteq/asdf-btm.git" "direnv:github.com/asdf-community/asdf-direnv.git"
# "dotenv-linter:github.com/wesleimp/asdf-dotenv-linter.git" "dotenv-linter:github.com/wesleimp/asdf-dotenv-linter.git"
# "editorconfig-checker:github.com/gabitchov/asdf-editorconfig-checker.git" "editorconfig-checker:github.com/gabitchov/asdf-editorconfig-checker.git"
# "eza:github.com/lwiechec/asdf-eza.git" "eza:github.com/lwiechec/asdf-eza.git"
# "fd:gitlab.com/wt0f/asdf-fd.git" "fd:gitlab.com/wt0f/asdf-fd.git"
# "github-cli:github.com/bartlomiejdanek/asdf-github-cli.git" "github-cli:github.com/bartlomiejdanek/asdf-github-cli.git"
# "hadolint:github.com/devlincashman/asdf-hadolint.git" "golang:github.com/asdf-community/asdf-golang.git"
# "kubectl:github.com/asdf-community/asdf-kubectl.git" "hadolint:github.com/devlincashman/asdf-hadolint.git"
# "lazygit:github.com/nklmilojevic/asdf-lazygit.git" "kubectl:github.com/asdf-community/asdf-kubectl.git"
# "pipx:github.com/yozachar/asdf-pipx.git" "lazygit:github.com/nklmilojevic/asdf-lazygit.git"
# "pre-commit:github.com/jonathanmorley/asdf-pre-commit.git" "nodejs:github.com/asdf-vm/asdf-nodejs.git"
# "ripgrep:gitlab.com/wt0f/asdf-ripgrep.git" "pipx:github.com/yozachar/asdf-pipx.git"
# "semgrep:github.com/brentjanderson/asdf-semgrep.git" "pre-commit:github.com/jonathanmorley/asdf-pre-commit.git"
# "terraform-ls:github.com/asdf-community/asdf-hashicorp.git" "ripgrep:gitlab.com/wt0f/asdf-ripgrep.git"
# "vault:github.com/asdf-community/asdf-hashicorp.git" "rust:github.com/code-lever/asdf-rust.git"
# "shellcheck:github.com/luizm/asdf-shellcheck.git" "semgrep:github.com/brentjanderson/asdf-semgrep.git"
# "shfmt:github.com/luizm/asdf-shfmt.git" "shellcheck:github.com/luizm/asdf-shellcheck.git"
# "terraform-lsp:github.com/bartlomiejdanek/asdf-terraform-lsp.git" "shfmt:github.com/luizm/asdf-shfmt.git"
# "terragrunt:github.com/ohmer/asdf-terragrunt.git" "terraform-ls:github.com/asdf-community/asdf-hashicorp.git"
# "tf-summarize:github.com/adamcrews/asdf-tf-summarize.git" "terraform-lsp:github.com/bartlomiejdanek/asdf-terraform-lsp.git"
# "yamllint:github.com/ericcornelissen/asdf-yamllint.git" "terragrunt:github.com/ohmer/asdf-terragrunt.git"
# "yq:github.com/sudermanjr/asdf-yq.git" "tf-summarize:github.com/adamcrews/asdf-tf-summarize.git"
# ) "vault:github.com/asdf-community/asdf-hashicorp.git"
# "yamllint:github.com/ericcornelissen/asdf-yamllint.git"
# msg "Installing asdf plugins, if not already installed" "yq:github.com/sudermanjr/asdf-yq.git"
# for item in "${ASDF_INSTALLABLES[@]}"; do )
# CMD=$(echo "${item}" | awk -F ":" '{print $1}')
# URL=$(echo "${item}" | awk -F ":" '{print $2}')
# asdf plugin add "${CMD}" "https://${URL}"
# asdf install "${CMD}" latest
# asdf global "${CMD}" "$(asdf latest "${CMD}")"
# done
msg "Reshim asdf" # Function to install asdf plugins
asdf reshim install_asdf_plugins()
{
msg "Installing asdf plugins, if not already installed"
for item in "${ASDF_INSTALLABLES[@]}"; do
CMD=$(echo "${item}" | awk -F ":" '{print $1}')
URL=$(echo "${item}" | awk -F ":" '{print $2}')
asdf plugin add "${CMD}" "https://${URL}"
asdf install "${CMD}" latest
asdf global "${CMD}" "$(asdf latest "${CMD}")"
done
}
main()
{
update_asdf
install_asdf_plugins
msg "Reshim asdf"
asdf reshim
}
main "$@"

View File

@@ -2,33 +2,18 @@
# Install cargo/rust packages. # Install cargo/rust packages.
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/config/exports" eval "$HOME/.dotfiles/config/shared.sh"
source "$HOME/.dotfiles/config/alias"
source "$HOME/.dotfiles/config/functions"
source "$HOME/.dotfiles/scripts/shared.sh"
msg "Starting to install rust/cargo packages" msg "Starting to install rust/cargo packages"
! x-have cargo && {
msg "cargo could not be found. installing cargo with rustup.rs"
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --no-modify-path -y
}
source "$CARGO_HOME/env" source "$CARGO_HOME/env"
! x-have rustup && {
msg_err "rustup could not be found. Aborting..."
exit 1
}
rustup default stable
# If we have cargo install-update, use it first # If we have cargo install-update, use it first
x-have cargo-install-update && { if command -v cargo-install-update &> /dev/null; then
msg_run "Updating cargo packages with cargo install-update" msg_run "Updating cargo packages with cargo install-update"
cargo install-update -a cargo install-update -a
msg_done "Done with cargo install-update" msg_done "Done with cargo install-update"
} fi
packages=( packages=(
# A cargo subcommand for checking and applying # A cargo subcommand for checking and applying
@@ -57,28 +42,41 @@ packages=(
# Number of jobs to run in parallel, this helps to keep the system responsive # Number of jobs to run in parallel, this helps to keep the system responsive
BUILD_JOBS=$(nproc --ignore=2) BUILD_JOBS=$(nproc --ignore=2)
for pkg in "${packages[@]}"; do # Function to install cargo packages
# Trim spaces install_packages()
pkg=${pkg// /} {
# Skip comments for pkg in "${packages[@]}"; do
if [[ ${pkg:0:1} == "#" ]]; then continue; fi # Trim spaces
pkg=${pkg// /}
# Skip comments
if [[ ${pkg:0:1} == "#" ]]; then continue; fi
msg_run "Installing cargo package $pkg" msg_run "Installing cargo package $pkg"
cargo install --jobs $BUILD_JOBS "$pkg" cargo install --jobs $BUILD_JOBS "$pkg"
echo ""
echo "" done
done
msg_done "Installed cargo packages!"
msg_run "Now doing the next steps for cargo packages"
# use bob to install latest stable nvim
x-have bob && {
bob use stable && x-path-append "$XDG_DATA_HOME/bob/nvim-bin"
} }
msg_run "Removing cargo cache" # Function to perform additional steps for installed cargo packages
cargo cache --autoclean post_install_steps()
msg_done "Done removing cargo cache" {
msg_run "Now doing the next steps for cargo packages"
# use bob to install latest stable nvim
if command -v bob &> /dev/null; then
bob use stable && x-path-append "$XDG_DATA_HOME/bob/nvim-bin"
fi
msg_run "Removing cargo cache"
cargo cache --autoclean
msg_done "Done removing cargo cache"
}
main()
{
install_packages
msg_done "Installed cargo packages!"
post_install_steps
}
main "$@"

View File

@@ -1,58 +1,83 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# shellcheck disable=SC2231,SC2034,SC2181,SC2068 # shellcheck disable=SC2231,SC2034,SC2181,SC2068
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" source "${DOTFILES}/config/shared.sh"
PBB_REQUIRED_TOOLS=(git cheat) PBB_REQUIRED_TOOLS=(git cheat)
for t in ${PBB_REQUIRED_TOOLS[@]}; do
! x-have "$t" && echo "(!) $t is missing, can't continue..." && exit 1
done
PBB_GIT="https://github.com/dylanaraps/pure-bash-bible.git" PBB_GIT="https://github.com/dylanaraps/pure-bash-bible.git"
PBB_SOURCE="source: $PBB_GIT" PBB_SOURCE="source: $PBB_GIT"
PBB_SYNTAX="syntax: bash" PBB_SYNTAX="syntax: bash"
PBB_TAGS="tags: [bash]" PBB_TAGS="tags: [bash]"
PBB_TEMP_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/cheat/pbb"
PBB_TEMP_PREFIX=$(basename "$0") check_required_tools()
PBB_TEMP_DIR="$XDG_CACHE_HOME/cheat/pbb" {
for t in "${PBB_REQUIRED_TOOLS[@]}"; do
if ! x-have "$t"; then
echo "(!) $t is missing, can't continue..."
exit 1
fi
done
}
# If there's no .git, clone the folder clone_or_update_repo()
if [ ! -d "$PBB_TEMP_DIR/.git" ]; then {
msg_run "Starting to clone $PBB_GIT" if [ ! -d "$PBB_TEMP_DIR/.git" ]; then
git clone --depth 1 --single-branch -q "$PBB_GIT" "$PBB_TEMP_DIR" \ msg_run "Starting to clone $PBB_GIT"
&& msg_yay "Cloned $PBB_GIT" git clone --depth 1 --single-branch -q "$PBB_GIT" "$PBB_TEMP_DIR" \
else && msg_yay "Cloned $PBB_GIT"
# Update the repo else
msg_run "Starting to update $PBB_GIT" msg_run "Starting to update $PBB_GIT"
git -C "$PBB_TEMP_DIR" reset --hard origin/master git -C "$PBB_TEMP_DIR" reset --hard origin/master
git -C "$PBB_TEMP_DIR" pull -q \ git -C "$PBB_TEMP_DIR" pull -q \
&& msg_yay "Updated $PBB_GIT" && msg_yay "Updated $PBB_GIT"
fi fi
}
PBB_CHAPTERS=$(ls -1v "$PBB_TEMP_DIR"/manuscript/chapter*) prepare_cheat_dest()
CHEAT_DEST="$(cheat -d | grep pure-bash-bible | head -1 | awk '{print $2}')" {
local cheat_dest
cheat_dest="$(cheat -d | grep pure-bash-bible | head -1 | awk '{print $2}')"
if [ ! -d "$CHEAT_DEST" ]; then if [ ! -d "$cheat_dest" ]; then
mkdir -p "$CHEAT_DEST" mkdir -p "$cheat_dest"
fi
for f in ${PBB_CHAPTERS[@]}; do
# get all headers, take the first one, strip the # and return the first word in lowercase
HEADER=$(grep -e '^[#] ' "$f" | head -1 | awk '{print tolower($2)}')
CHEAT_FILE="$CHEAT_DEST/${HEADER}"
replacable "$f" "$CHEAT_FILE"
override=$?
if [ "$override" -ne 1 ]; then
cp "$f" "$CHEAT_FILE" && msg_run "Updated: $CHEAT_FILE"
fi fi
LC_ALL=C perl -pi.bak -e 's/\<\!-- CHAPTER END --\>//' "$CHEAT_FILE" echo "$cheat_dest"
rm "$CHEAT_FILE.bak" }
# add tags if the file doesn't have them process_chapters()
if [ '---' != "$(head -1 < "$CHEAT_FILE")" ]; then {
T="$PBB_SYNTAX\n$PBB_TAGS\n$PBB_SOURCE\n" local cheat_dest
echo -e "---\n$T---\n$(cat "$CHEAT_FILE")" > "$CHEAT_FILE" cheat_dest=$(prepare_cheat_dest)
fi
done mapfile -t PBB_CHAPTERS < <(ls -1v "$PBB_TEMP_DIR"/manuscript/chapter*)
for f in "${PBB_CHAPTERS[@]}"; do
local header cheat_file
header=$(grep -e '^[#] ' "$f" | head -1 | awk '{print tolower($2)}')
cheat_file="$cheat_dest/$header"
if ! replacable "$f" "$cheat_file"; then
cp "$f" "$cheat_file" && msg_run "Updated: $cheat_file"
fi
LC_ALL=C perl -pi.bak -e 's/\<\!-- CHAPTER END --\>//' "$cheat_file"
rm "$cheat_file.bak"
if [ '---' != "$(head -1 < "$cheat_file")" ]; then
local metadata
metadata="$PBB_SYNTAX\n$PBB_TAGS\n$PBB_SOURCE\n"
echo -e "---\n$metadata---\n$(cat "$cheat_file")" > "$cheat_file"
fi
done
}
main()
{
check_required_tools
clone_or_update_repo
process_chapters
}
main "$@"

View File

@@ -2,9 +2,12 @@
# Install PHP Package Manager Composer # Install PHP Package Manager Composer
# #
# shellcheck source="shared.sh" # shellcheck source="shared.sh"
source "$HOME/.dotfiles/scripts/shared.sh" eval "$HOME/.dotfiles/config/shared.sh"
! x-have "php" && msg_err "PHP Not Available, cannot install composer" && exit 0 if ! command -v php &> /dev/null; then
msg_err "PHP Not Available, cannot install composer"
exit 0
fi
EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')" EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

View File

@@ -2,7 +2,7 @@
# Install NerdFonts # Install NerdFonts
# #
# shellcheck source="shared.sh" # shellcheck source="shared.sh"
source "$HOME/.dotfiles/scripts/shared.sh" source "$DOTFILES/config/shared.sh"
GIT_REPO="https://github.com/ryanoasis/nerd-fonts.git" GIT_REPO="https://github.com/ryanoasis/nerd-fonts.git"
TMP_PATH="$XDG_CACHE_HOME/nerd-fonts" TMP_PATH="$XDG_CACHE_HOME/nerd-fonts"
@@ -17,28 +17,50 @@ fonts=(
SpaceMono SpaceMono
) )
if [ ! -d "$TMP_PATH" ]; then # Function to clone or update the NerdFonts repository
git clone --filter=blob:none --sparse "$GIT_REPO" "$TMP_PATH" clone_or_update_repo()
fi {
if [ ! -d "$TMP_PATH" ]; then
git clone --quiet --filter=blob:none --sparse "$GIT_REPO" "$TMP_PATH"
fi
cd "$TMP_PATH" || { cd "$TMP_PATH" || msg_err "No such folder $TMP_PATH"
msg_err "No such folder $TMP_PATH"
exit 1
} }
for ext in "${fonts[@]}"; do # Function to add fonts to sparse-checkout
# Trim spaces add_fonts_to_sparse_checkout()
ext=${ext// /} {
# Skip comments for font in "${fonts[@]}"; do
if [[ ${ext:0:1} == "#" ]]; then continue; fi # Trim spaces
font=${font// /}
# Skip comments
if [[ ${font:0:1} == "#" ]]; then continue; fi
msg_run "Adding $ext to sparse-checkout" msg_run "Adding $font to sparse-checkout"
git sparse-checkout add "patched-fonts/$ext" git sparse-checkout add "patched-fonts/$font"
echo "" echo ""
done done
}
msg "Starting to install NerdFonts..." # Function to install NerdFonts
install_fonts()
{
msg "Starting to install NerdFonts..."
./install.sh -q -s ${fonts[*]}
msg_ok "Done"
}
./install.sh -s ${fonts[*]} remove_tmp_path()
{
rm -rf "$TMP_PATH"
}
msg_ok "Done" main()
{
clone_or_update_repo
add_fonts_to_sparse_checkout
install_fonts
remove_tmp_path
}
main "$@"

View File

@@ -3,17 +3,23 @@
# Install fzf # Install fzf
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" eval "$DOTFILES/config/shared.sh"
FZF_GIT="https://github.com/junegunn/fzf.git" FZF_GIT="https://github.com/junegunn/fzf.git"
FZF_PATH="${XDG_CONFIG_HOME}/fzf" FZF_PATH="${XDG_CONFIG_HOME}/fzf"
FZF_BUILD="/tmp/fzf" FZF_BUILD="/tmp/fzf"
if [ ! -d "$FZF_BUILD" ]; then main()
git clone --depth 1 "$FZF_GIT" "$FZF_BUILD" {
"$FZF_BUILD/install" \ if [ ! -d "$FZF_BUILD" ]; then
--xdg \ git clone --depth 1 "$FZF_GIT" "$FZF_BUILD"
--bin "$FZF_BUILD/install" \
else --xdg \
msg_done "fzf ($FZF_PATH/) already installed" --bin
fi msg_done "fzf installed"
else
msg_done "fzf ($FZF_PATH/) already installed"
fi
}
main "$@"

View File

@@ -2,13 +2,17 @@
# Install GitHub CLI extensions # Install GitHub CLI extensions
# #
# shellcheck source="shared.sh" # shellcheck source="shared.sh"
source "$HOME/.dotfiles/scripts/shared.sh" source "${DOTFILES}/config/shared.sh"
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
msg_run "Installing gh (GitHub Client) extensions" msg_run "Installing gh (GitHub Client) extensions"
! x-have "gh" \ if ! command -v gh &> /dev/null; then
&& msg_err "gh (GitHub Client) could not be found, please install it first" \ msg_err "gh (GitHub Client) could not be found, please install it first"
&& exit 0 exit 0
fi
extensions=( extensions=(
# GitHub CLI extension for generating a report on repository dependencies. # GitHub CLI extension for generating a report on repository dependencies.
@@ -30,15 +34,25 @@ extensions=(
rsese/gh-actions-status rsese/gh-actions-status
) )
for ext in "${extensions[@]}"; do # Function to install GitHub CLI extensions
# Trim spaces install_extensions()
ext=${ext// /} {
# Skip comments for ext in "${extensions[@]}"; do
if [[ ${ext:0:1} == "#" ]]; then continue; fi # Trim spaces
ext=${ext// /}
# Skip comments
if [[ ${ext:0:1} == "#" ]]; then continue; fi
msg_nested "Installing $ext" msg_nested "Installing $ext"
gh extensions install "$ext" gh extension install "$ext"
echo "" echo ""
done done
}
msg_ok "Done" main()
{
install_extensions
msg_ok "Done"
}
main "$@"

View File

@@ -4,12 +4,14 @@
# NOTE: Experimental, wip # NOTE: Experimental, wip
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" source "${DOTFILES}/config/shared.sh"
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
msg_run "Installing git-crypt" msg_run "Installing git-crypt"
x-have "git-crypt" || { if ! command -v git-crypt &> /dev/null; then
REPO_URL="https://github.com/AGWA/git-crypt.git" REPO_URL="https://github.com/AGWA/git-crypt.git"
CHECK_PATH="${XDG_BIN_HOME}/git-crypt" CHECK_PATH="${XDG_BIN_HOME}/git-crypt"
BUILD_PATH="/tmp/git-crypt" BUILD_PATH="/tmp/git-crypt"
@@ -23,5 +25,6 @@ x-have "git-crypt" || {
else else
msg_done "git-crypt ($CHECK_PATH) already installed" msg_done "git-crypt ($CHECK_PATH) already installed"
fi fi
} fi
msg_done "Done installing git-crypt" msg_done "Done installing git-crypt"

View File

@@ -2,7 +2,10 @@
# Install Go packages # Install Go packages
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" eval "$DOTFILES/config/shared.sh"
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
msg_run "Installing go packages" msg_run "Installing go packages"
@@ -33,32 +36,50 @@ packages=(
github.com/doron-cohen/antidot@latest github.com/doron-cohen/antidot@latest
) )
for pkg in "${packages[@]}"; do # Function to install go packages
# Trim spaces install_packages()
pkg=${pkg// /} {
# Skip comments for pkg in "${packages[@]}"; do
if [[ ${pkg:0:1} == "#" ]]; then continue; fi # Trim spaces
pkg=${pkg// /}
# Skip comments
if [[ ${pkg:0:1} == "#" ]]; then continue; fi
msg_nested "Installing go package: $pkg" msg_nested "Installing go package: $pkg"
go install "$pkg" go install "$pkg"
echo "" echo ""
done done
msg_run "Installing completions for selected packages"
x-have git-profile && {
git-profile completion zsh > "$ZSH_CUSTOM_COMPLETION_PATH/_git-profile" \
&& msg_ok "Installed completions for git-profile"
} }
x-have antidot && { # Function to install completions and run actions for selected packages
antidot update \ post_install()
&& msg_ok "Updated antidot database" {
msg_run "Installing completions for selected packages"
if command -v git-profile &> /dev/null; then
git-profile completion zsh > "$ZSH_CUSTOM_COMPLETION_PATH/_git-profile" \
&& msg_ok "Installed completions for git-profile"
fi
if command -v antidot &> /dev/null; then
antidot update \
&& msg_ok "Updated antidot database"
fi
} }
echo "" # Function to clear go cache
clear_go_cache()
{
msg_run "Clearing go cache"
go clean -cache -modcache
}
msg_run "Clearing go cache" main()
go clean -cache -modcache {
install_packages
post_install
clear_go_cache
msg_ok "Done"
}
msg_ok "Done" main "$@"

View File

@@ -3,23 +3,71 @@
# Install neofetch from source # Install neofetch from source
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" source "$DOTFILES/config/shared.sh"
NEOFETCH_VERSION="7.1.0" if ! declare -f msg > /dev/null; then
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[ "$VERBOSE" -eq 1 ] && echo "$1"
return 0
}
fi
if ! declare -f msg_err > /dev/null; then
# Function to print error messages and exit
# $1 - error message (string)
msg_err()
{
echo "(!) ERROR: $1" >&2
exit 1
}
fi
if ! declare -f msg_done > /dev/null; then
# Function to print done message
# $1 - message (string)
msg_done()
{
echo "$1"
return 0
}
fi
NEOFETCH_VERSION="$(x-gh-get-latest-version dylanaraps/neofetch)"
NEOFETCH_REPO="https://github.com/dylanaraps/neofetch" NEOFETCH_REPO="https://github.com/dylanaraps/neofetch"
NEOFETCH_URL="${NEOFETCH_REPO}/archive/refs/tags/${NEOFETCH_VERSION}.tar.gz" NEOFETCH_URL="${NEOFETCH_REPO}/archive/refs/tags/${NEOFETCH_VERSION}.tar.gz"
NEOFETCH_TEMP="/tmp/neofetch" NEOFETCH_TEMP="/tmp/neofetch"
NEOFETCH_INSTALL_PREFIX="$HOME/.local" NEOFETCH_INSTALL_PREFIX="$HOME/.local"
x-have "neofetch" || { # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
# Function to install neofetch from source
install_neofetch()
{
LC_ALL=C LC_ALL=C
mkdir -p "$NEOFETCH_TEMP" "$NEOFETCH_INSTALL_PREFIX" mkdir -p "$NEOFETCH_TEMP" "$NEOFETCH_INSTALL_PREFIX"
curl -L "$NEOFETCH_URL" > "$NEOFETCH_TEMP.tar.gz" curl -L "$NEOFETCH_URL" -o "$NEOFETCH_TEMP.tar.gz"
tar zxvf "$NEOFETCH_TEMP.tar.gz" --directory="$NEOFETCH_TEMP" tar zxvf "$NEOFETCH_TEMP.tar.gz" --directory="$NEOFETCH_TEMP"
cd "$NEOFETCH_TEMP/neofetch-$NEOFETCH_VERSION" \ cd "$NEOFETCH_TEMP/neofetch-$NEOFETCH_VERSION" \
&& make PREFIX="${NEOFETCH_INSTALL_PREFIX}" install \ && make PREFIX="${NEOFETCH_INSTALL_PREFIX}" install \
&& rm -rf "$NEOFETCH_TEMP*" \ && rm -rf "$NEOFETCH_TEMP*" \
&& msg_yay "neofetch installed!" && msg_yay "neofetch installed!"
} }
main()
{
if ! command -v neofetch &> /dev/null; then
install_neofetch
elif [ "$NEOFETCH_VERSION" != "$(neofetch --version | awk '{print $2}')" ]; then
install_neofetch
else
msg_done "neofetch v.${NEOFETCH_VERSION} already installed"
fi
}
main "$@"

View File

@@ -2,11 +2,17 @@
# Install npm packages globally. # Install npm packages globally.
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" eval "$DOTFILES/config/shared.sh"
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
msg "Starting to install npm packages" msg "Starting to install npm packages"
! x-have "npm" && msg_err "npm could not be found." && exit 0 if ! command -v npm &> /dev/null; then
msg_err "npm could not be found."
exit 0
fi
packages=( packages=(
# This is a tool to check if your files consider your .editorconfig rules. # This is a tool to check if your files consider your .editorconfig rules.
@@ -18,27 +24,48 @@ packages=(
"corepack" "corepack"
) )
for pkg in "${packages[@]}"; do # Function to install npm packages
# Trim spaces install_packages()
pkg=${pkg// /} {
# Skip comments for pkg in "${packages[@]}"; do
if [[ ${pkg:0:1} == "#" ]]; then continue; fi # Trim spaces
pkg=${pkg// /}
# Skip comments
if [[ ${pkg:0:1} == "#" ]]; then continue; fi
if [[ $(npm ls -g -p "$pkg") != "" ]]; then if npm ls -g -p "$pkg" &> /dev/null; then
msg_run_done "$pkg" "already installed" msg_run_done "$pkg" "already installed"
else else
msg_run "Installing npm package:" "$pkg" msg_run "Installing npm package:" "$pkg"
npm install -g --no-fund --no-progress --no-timing "$pkg" npm install -g --no-fund --no-progress --no-timing "$pkg"
fi fi
echo ""
done
}
echo "" # Function to upgrade all global npm packages
done upgrade_global_packages()
{
msg_run "Upgrading all global packages"
npm -g --no-progress --no-timing --no-fund outdated
npm -g --no-timing --no-fund upgrade
}
msg_run "Upgrading all global packages" # Function to clean npm cache
npm -g --no-progress --no-timing --no-fund outdated clean_npm_cache()
npm -g --no-timing --no-fund upgrade {
msg_run "Cleaning up npm cache"
npm cache verify
npm cache clean --force
npm cache verify
}
msg_run "Cleaning up npm cache" main()
npm cache verify {
npm cache clean --force install_packages
npm cache verify upgrade_global_packages
clean_npm_cache
msg_yay "npm package installations complete"
}
main "$@"

View File

@@ -3,11 +3,18 @@
# Install ntfy # Install ntfy
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" eval "$DOTFILES/config/shared.sh"
set -e
x-have "ntfy" && msg "ntfy already installed" && exit 0 # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
# Check if ntfy is already installed
if x-have "ntfy"; then
msg "ntfy already installed"
exit 0
fi
# Determine the architecture
case $(dfm check arch) in case $(dfm check arch) in
Linux) Linux)
NTFY_ARCH="linux_$(arch)" NTFY_ARCH="linux_$(arch)"
@@ -15,21 +22,36 @@ case $(dfm check arch) in
Darwin) Darwin)
NTFY_ARCH="macOS_all" NTFY_ARCH="macOS_all"
;; ;;
*)
msg_err "Unsupported OS"
;;
esac esac
NTFY_VERSION=2.2.0 NTFY_VERSION="$(x-gh-get-latest-version binwiederhier/ntfy)"
NTFY_URL="https://github.com/binwiederhier/ntfy" NTFY_URL="https://github.com/binwiederhier/ntfy"
NTFY_DEST="/tmp/ntfy_${NTFY_VERSION}_${NTFY_ARCH}" NTFY_DEST="/tmp/ntfy_${NTFY_VERSION}_${NTFY_ARCH}"
curl -L "$NTFY_URL/releases/download/v${NTFY_VERSION}/${NTFY_DEST}.tar.gz" \ # Download and extract ntfy
> "${NTFY_DEST}.tar.gz" install_ntfy()
tar zxvf "${NTFY_DEST}.tar.gz" {
cp -a "${NTFY_DEST}/ntfy" ~/.local/bin/ntfy curl -L "$NTFY_URL/releases/download/v${NTFY_VERSION}/${NTFY_DEST}.tar.gz" -o "${NTFY_DEST}.tar.gz"
mkdir -p ~/.config/ntfy tar zxvf "${NTFY_DEST}.tar.gz"
cp -a "${NTFY_DEST}/ntfy" ~/.local/bin/ntfy
mkdir -p ~/.config/ntfy
# copy config only if it does not exist # Copy config only if it does not exist
if [ ! -f "$HOME/.config/ntfy/client.yml" ]; then if [ ! -f "$HOME/.config/ntfy/client.yml" ]; then
cp "${NTFY_DEST}/client/client.yml" ~/.config/ntfy/client.yml cp "${NTFY_DEST}/client/client.yml" ~/.config/ntfy/client.yml
fi fi
rm -rf "${NTFY_DEST}" "${NTFY_DEST}.tar.gz" # Clean up
rm -rf "${NTFY_DEST}" "${NTFY_DEST}.tar.gz"
}
main()
{
install_ntfy
msg "ntfy installation complete"
}
main "$@"

View File

@@ -3,14 +3,31 @@
# Install oh-my-bash # Install oh-my-bash
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" source "${DOTFILES}/config/shared.sh"
export OSH="$HOME/.local/share/oh-my-bash" set -euo pipefail
if [ ! -d "$OSH" ]; then # Enable verbosity with VERBOSE=1
[ -f "$HOME/.bashrc" ] && mv "$HOME/.bashrc" "$HOME/.bashrc.temp" VERBOSE="${VERBOSE:-0}"
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)" --unattended
[ -f "$HOME/.bashrc.temp" ] && mv "$HOME/.bashrc.temp" "$HOME/.bashrc" OSH="$HOME/.local/share/oh-my-bash"
else
msg_done "oh-my-bash ($OSH) already installed" # Function to install oh-my-bash
fi install_oh_my_bash()
{
if [ ! -d "$OSH" ]; then
[ -f "$HOME/.bashrc" ] && mv "$HOME/.bashrc" "$HOME/.bashrc.temp"
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)" --unattended
[ -f "$HOME/.bashrc.temp" ] && mv "$HOME/.bashrc.temp" "$HOME/.bashrc"
msg "oh-my-bash installed to $OSH"
else
msg_done "oh-my-bash ($OSH) already installed"
fi
}
main()
{
install_oh_my_bash
}
main "$@"

View File

@@ -3,9 +3,31 @@
# Install oh-my-posh # Install oh-my-posh
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" source "${DOTFILES}/config/shared.sh"
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/.local/bin # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
eval "$(oh-my-posh init zsh --config $OHMYPOSH_CFG)" msg "Starting to install oh-my-posh"
# Install oh-my-posh
install_oh_my_posh()
{
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/.local/bin
msg "oh-my-posh installed to ~/.local/bin"
}
# Initialize oh-my-posh
init_oh_my_posh()
{
eval "$(oh-my-posh init zsh --config $OHMYPOSH_CFG)"
msg "oh-my-posh initialized with config $OHMYPOSH_CFG"
}
main()
{
install_oh_my_posh
init_oh_my_posh
}
main "$@"

View File

@@ -2,13 +2,17 @@
# Install python/pip packages. # Install python/pip packages.
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" source "${DOTFILES}/config/shared.sh"
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
msg "Starting to install pip packages" msg "Starting to install pip packages"
x-have "python3" || { if ! command -v python3 &> /dev/null; then
msg_err "Could not find python3, something really weird is going on." && exit 1 msg_err "Could not find python3, something really weird is going on."
} exit 1
fi
msg_nested "Upgrading pip" msg_nested "Upgrading pip"
python3 -m pip install --user --upgrade pip python3 -m pip install --user --upgrade pip
@@ -18,16 +22,20 @@ packages=(
"libtmux" "libtmux"
) )
for pkg in "${packages[@]}"; do # Function to install pip packages
# Trim spaces install_packages()
pkg=${pkg// /} {
# Skip comments for pkg in "${packages[@]}"; do
if [[ ${pkg:0:1} == "#" ]]; then continue; fi # Trim spaces
pkg=${pkg// /}
# Skip comments
if [[ ${pkg:0:1} == "#" ]]; then continue; fi
msg_nested "Installing pip package: $pkg" msg_nested "Installing pip package: $pkg"
python3 -m pip install --user --upgrade "$pkg" python3 -m pip install --user --upgrade "$pkg"
echo ""
echo "" done
done }
install_packages
msg_yay "Run pip package installations" msg_yay "Run pip package installations"

View File

@@ -4,29 +4,40 @@
# Ismo Vuorinen <https://github.com/ivuorinen> 2018 # Ismo Vuorinen <https://github.com/ivuorinen> 2018
# #
[ "$(uname)" != "Darwin" ] && echo "Not a macOS system" && exit 0 # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
! x-have xcode-select \ # Check if the script is running on macOS
&& msg_err "xcode-select could not be found, skipping" \ if [ "$(uname)" != "Darwin" ]; then
&& exit 0 echo "Not a macOS system"
exit 0
fi
# Check if xcode-select is available
if ! command -v xcode-select &> /dev/null; then
msg_err "xcode-select could not be found, skipping"
exit 0
fi
# Ask for the administrator password upfront # Ask for the administrator password upfront
sudo -v sudo -v
# Keep-alive: update existing `sudo` time stamp until `settler` has finished # Keep-alive: update existing `sudo` time stamp until the script has finished
while true; do keep_alive_sudo()
sudo -n true {
sleep 60 while true; do
kill -0 "$$" || exit sudo -n true
done 2> /dev/null & sleep 60
kill -0 "$$" || exit
done 2> /dev/null &
}
XCODE_TOOLS_PATH=$(xcode-select -p) XCODE_TOOLS_PATH=$(xcode-select -p)
XCODE_SWIFT_PATH="$XCODE_TOOLS_PATH/usr/bin/swift" XCODE_SWIFT_PATH="$XCODE_TOOLS_PATH/usr/bin/swift"
# Modified from https://unix.stackexchange.com/a/408305 # Function to prompt for XCode CLI Tools installation
if [ -a "$XCODE_SWIFT_PATH" ]; then prompt_xcode_install()
echo "You have swift from xcode-select. Continuing..." {
else
XCODE_MESSAGE="$( XCODE_MESSAGE="$(
osascript -e \ osascript -e \
'tell app "System Events" to display dialog "Please click install when Command Line Developer Tools appears"' 'tell app "System Events" to display dialog "Please click install when Command Line Developer Tools appears"'
@@ -36,11 +47,25 @@ else
xcode-select --install xcode-select --install
else else
echo "You have cancelled the installation, please rerun the installer." echo "You have cancelled the installation, please rerun the installer."
exit exit 1
fi fi
fi }
until [ -f "$XCODE_SWIFT_PATH" ]; do # Main function
echo -n "." main()
sleep 1 {
done keep_alive_sudo
if [ -x "$XCODE_SWIFT_PATH" ]; then
echo "You have swift from xcode-select. Continuing..."
else
prompt_xcode_install
fi
until [ -f "$XCODE_SWIFT_PATH" ]; do
echo -n "."
sleep 1
done
}
main "$@"

View File

@@ -3,13 +3,29 @@
# Install z # Install z
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" source "${DOTFILES}/config/shared.sh"
Z_GIT_PATH="https://github.com/rupa/z.git" Z_GIT_PATH="https://github.com/rupa/z.git"
Z_BIN_PATH="$XDG_BIN_HOME/z" Z_BIN_PATH="$XDG_BIN_HOME/z"
if [ ! -d "$Z_BIN_PATH" ]; then # Function to clone the z repository
git clone "$Z_GIT_PATH" "$Z_BIN_PATH" clone_z_repo()
else {
msg_done "z ($Z_BIN_PATH/) already installed" local git_path=$1
fi local bin_path=$2
if [ ! -d "$bin_path" ]; then
git clone "$git_path" "$bin_path"
msg "z installed at $bin_path"
else
msg "z ($bin_path/) already installed"
fi
}
# Main function
main()
{
clone_z_repo "$Z_GIT_PATH" "$Z_BIN_PATH"
}
main "$@"

View File

@@ -9,7 +9,7 @@
[ "$(uname)" != "Darwin" ] && echo "Not a macOS system" && exit 0 [ "$(uname)" != "Darwin" ] && echo "Not a macOS system" && exit 0
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/scripts/shared.sh" eval "$HOME/.dotfiles/config/shared.sh"
msg_run "Starting to set macOS defaults, these require sudo privileges:" msg_run "Starting to set macOS defaults, these require sudo privileges:"
@@ -63,7 +63,7 @@ defaults write NSGlobalDomain NSDocumentSaveNewDocumentsToCloud -bool false
# Automatically quit printer app once the print jobs complete # Automatically quit printer app once the print jobs complete
defaults write com.apple.print.PrintingPrefs "Quit When Finished" -bool true defaults write com.apple.print.PrintingPrefs "Quit When Finished" -bool true
# Disable the Are you sure you want to open this application? dialog # Disable the "Are you sure you want to open this application?" dialog
defaults write com.apple.LaunchServices LSQuarantine -bool false defaults write com.apple.LaunchServices LSQuarantine -bool false
# Disable Resume system-wide # Disable Resume system-wide
@@ -79,10 +79,10 @@ defaults write NSGlobalDomain NSDisableAutomaticTermination -bool true
# in the login window # in the login window
sudo defaults write /Library/Preferences/com.apple.loginwindow AdminHostInfo HostName sudo defaults write /Library/Preferences/com.apple.loginwindow AdminHostInfo HostName
# Disable smart quotes as theyre annoying when typing code # Disable smart quotes as they're annoying when typing code
defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
# Disable smart dashes as theyre annoying when typing code # Disable smart dashes as they're annoying when typing code
defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
############################################################################### ###############################################################################
@@ -94,7 +94,7 @@ msg_nested "Setting SSD-specific tweaks"
# Disable hibernation (speeds up entering sleep mode) # Disable hibernation (speeds up entering sleep mode)
sudo pmset -a hibernatemode 0 sudo pmset -a hibernatemode 0
# Disable the sudden motion sensor as its not useful for SSDs # Disable the sudden motion sensor as it's not useful for SSDs
sudo pmset -a sms 0 sudo pmset -a sms 0
############################################################################### ###############################################################################
@@ -117,7 +117,7 @@ defaults write com.apple.BluetoothAudioAgent "Negotiated Bitpool Min" 80
defaults write NSGlobalDomain AppleKeyboardUIMode -int 3 defaults write NSGlobalDomain AppleKeyboardUIMode -int 3
# Set language and text formats # Set language and text formats
# Note: if youre in the US, replace `EUR` with `USD`, `Centimeters` with # Note: if you're in the US, replace `EUR` with `USD`, `Centimeters` with
# `Inches`, `en_GB` with `en_US`, and `true` with `false`. # `Inches`, `en_GB` with `en_US`, and `true` with `false`.
defaults write NSGlobalDomain AppleLanguages -array "en" defaults write NSGlobalDomain AppleLanguages -array "en"
defaults write NSGlobalDomain AppleLocale -string "en_GB@currency=EUR" defaults write NSGlobalDomain AppleLocale -string "en_GB@currency=EUR"
@@ -197,7 +197,7 @@ defaults write com.apple.finder WarnOnEmptyTrash -bool false
# chflags nohidden /Users # chflags nohidden /Users
# Expand the following File Info panes: # Expand the following File Info panes:
# General, Open with, and Sharing & Permissions # "General", "Open with", and "Sharing & Permissions"
defaults write com.apple.finder FXInfoPanesExpanded -dict \ defaults write com.apple.finder FXInfoPanesExpanded -dict \
General -bool true \ General -bool true \
OpenWith -bool true \ OpenWith -bool true \
@@ -235,17 +235,17 @@ defaults write com.apple.dock tilesize -int 30
defaults write com.apple.dock show-process-indicators -bool true defaults write com.apple.dock show-process-indicators -bool true
# Wipe all (default) app icons from the Dock # Wipe all (default) app icons from the Dock
# This is only really useful when setting up a new Mac, or if you dont use # This is only really useful when setting up a new Mac, or if you don't use
# the Dock to launch apps. # the Dock to launch apps.
# defaults write com.apple.dock persistent-apps -array "" # defaults write com.apple.dock persistent-apps -array ""
# Disable Dashboard # Disable Dashboard
defaults write com.apple.dashboard mcx-disabled -bool true defaults write com.apple.dashboard mcx-disabled -bool true
# Dont show Dashboard as a Space # Don't show Dashboard as a Space
defaults write com.apple.dock dashboard-in-overlay -bool true defaults write com.apple.dock dashboard-in-overlay -bool true
# Dont automatically rearrange Spaces based on most recent use # Don't automatically rearrange Spaces based on most recent use
defaults write com.apple.dock mru-spaces -bool false defaults write com.apple.dock mru-spaces -bool false
# Make Dock icons of hidden applications translucent # Make Dock icons of hidden applications translucent
@@ -257,7 +257,7 @@ defaults write com.apple.dock showhidden -bool true
msg_nested "Settings for Safari & WebKit" msg_nested "Settings for Safari & WebKit"
# Enable Safaris debug menu # Enable Safari's debug menu
defaults write com.apple.Safari IncludeInternalDebugMenu -bool true defaults write com.apple.Safari IncludeInternalDebugMenu -bool true
# Enable the Develop menu and the Web Inspector in Safari # Enable the Develop menu and the Web Inspector in Safari
@@ -268,7 +268,7 @@ defaults write com.apple.Safari \
com.apple.Safari.ContentPageGroupIdentifier.WebKit2DeveloperExtrasEnabled \ com.apple.Safari.ContentPageGroupIdentifier.WebKit2DeveloperExtrasEnabled \
-bool true -bool true
# Dont display the annoying prompt when quitting iTerm # Don't display the annoying prompt when quitting iTerm
defaults write com.googlecode.iterm2 PromptOnQuit -bool false defaults write com.googlecode.iterm2 PromptOnQuit -bool false
# Use iTerm2 preferences from the .dotfiles folder. # Use iTerm2 preferences from the .dotfiles folder.
defaults write com.googlecode.iterm2 PrefsCustomFolder \ defaults write com.googlecode.iterm2 PrefsCustomFolder \
@@ -315,7 +315,7 @@ defaults write com.apple.TextEdit PlainTextEncodingForWrite -int 4
msg_nested "Settings for Messages" msg_nested "Settings for Messages"
# Disable smart quotes as its annoying for messages that contain code # Disable smart quotes as it's annoying for messages that contain code
defaults write com.apple.messageshelper.MessageController \ defaults write com.apple.messageshelper.MessageController \
SOInputLineSettings \ SOInputLineSettings \
-dict-add "automaticQuoteSubstitutionEnabled" \ -dict-add "automaticQuoteSubstitutionEnabled" \
@@ -335,7 +335,7 @@ msg_nested "Restarting applications to apply changes"
for app in "Activity Monitor" "Address Book" "Calendar" "Contacts" "cfprefsd" \ for app in "Activity Monitor" "Address Book" "Calendar" "Contacts" "cfprefsd" \
"Dock" "Finder" "Mail" "Messages" "Safari" "SizeUp" "SystemUIServer" \ "Dock" "Finder" "Mail" "Messages" "Safari" "SizeUp" "SystemUIServer" \
"Terminal" "Transmission" "Twitter" "iCal"; do "Terminal" "Transmission" "iCal"; do
killall "${app}" > /dev/null 2>&1 killall "${app}" > /dev/null 2>&1
done done

View File

@@ -6,174 +6,14 @@
# Helper env variables. Use like this: VERBOSE=1 ./script.sh # Helper env variables. Use like this: VERBOSE=1 ./script.sh
: "${VERBOSE:=0}" : "${VERBOSE:=0}"
# Modified from https://stackoverflow.com/a/28776166 # Set variable that checks if the shared.sh script has been sourced only once
( # If the script has been sourced more than once, the script not be sourced again
[[ -n $ZSH_VERSION && $ZSH_EVAL_CONTEXT =~ :file$ ]] \ [ -z "$SHARED_SCRIPTS_SOURCED" ] && {
|| [[ -n $BASH_VERSION ]] && (return 0 2> /dev/null)
) && sourced=1 || sourced=0
export DOTFILES="$HOME/.dotfiles" source "${DOTFILES}/config/shared.sh"
DOTFILES_CURRENT_SHELL=$(ps -p $$ -oargs=) msgr done "(!) shared.sh not sourced"
export DOTFILES_CURRENT_SHELL
# Explicitly set XDG folders # Set variable that checks if the shared.sh script has been sourced only once
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html # shellcheck disable=SC2034
export XDG_CONFIG_HOME="$HOME/.config" export SHARED_SCRIPTS_SOURCED=1
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_STATE_HOME="$HOME/.local/state"
# custom variables
export XDG_BIN_HOME="$HOME/.local/bin"
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_RUNTIME_DIR="$HOME/.local/run"
# Other variables
export OHMYPOSH_CFG="$HOME/.dotfiles/config/omp/own.toml"
# Remove directory from the PATH variable
# usage: path_remove ~/.local/bin
function path_remove
{
x-path-remove "$1"
}
# Append directory to the PATH
# usage: path_append ~/.local/bin
function path_append
{
x-path-remove "$1"
x-path-prepend "$1"
}
# Prepend directory to the PATH
# usage: path_prepend ~/.local/bin
function path_prepend
{
x-path-remove "$1"
x-path-prepend "$1"
}
# Run command silently
# Usage: silent uptime
silent()
{
"$@" >&/dev/null
}
# Check if a file contains non-ascii characters
nonascii()
{
LC_ALL=C grep -n '[^[:print:][:space:]]' "${@}"
}
source "$DOTFILES/local/bin/msgr"
# -- Menu builder -- #
function menu_section()
{
LINE=$(printf '%-18s [ %-15s ]\n' "$1" "$2")
echo -e " $(__log_marker) $LINE"
}
function menu_item()
{
LINE=$(printf '%-15s %-30s\n' "$1" "$2")
echo -e "$(__log_indent)$(__log_marker) $LINE"
}
# https://stackoverflow.com/a/85932
function fn_exists()
{
declare -f -F "$1" > /dev/null
return $?
}
# Takes a bash array ("cow:moo", "dinosaur:roar") and loops
# through the keys to build menu section listing.
function menu_usage_header()
{
MENU_CMD="$1"
shift
MENU_ARRAY=("$@")
KEYS=""
for item in "${MENU_ARRAY[@]}"; do
CMD=$(echo "${item}" | awk -F ":" '{print $1}')
KEYS+="${CMD} | "
done
# "???" removes 3 last characters, being " | " from the end
menu_section "$MENU_CMD" "${KEYS%???}"
}
# Takes the usage command "$0 dotfiles" and a
# bash array ("cow:moo" "dinosaur:roar") and loops
# through in building a menu for dfm command usage listing.
function menu_usage()
{
MENU_CMD="$1"
shift
MENU_ARRAY=("$@")
msg "$MENU_CMD"
for item in "${MENU_ARRAY[@]}"; do
CMD=$(echo "${item}" | awk -F ":" '{print $1}')
DESC=$(echo "${item}" | awk -F ":" '{print $2}')
menu_item "$CMD" "$DESC"
done
}
# Creates a random string
rnd()
{
echo $RANDOM | md5sum | head -c 20
}
# return sha256sum for file
# $1 - filename (string)
function get_sha256sum()
{
sha256sum "$1" | head -c 64
}
# Replaceable file
#
# $1 - filename (string)
# $2 - filename (string)
#
# Returns 1 when replaceable, 0 when not replaceable.
function replacable()
{
FILE1="$1"
FILE2="$2"
[[ ! -r "$FILE1" ]] && {
[[ $VERBOSE -eq 1 ]] && msg_err "File 1 ($FILE1) does not exist"
return 0
}
[[ ! -r "$FILE2" ]] && {
[[ $VERBOSE -eq 1 ]] && msg_err "File 2 ($FILE2) does not exist, replaceable"
return 1
}
FILE1_HASH=$(get_sha256sum "$FILE1")
FILE2_HASH=$(get_sha256sum "$FILE2")
[[ $FILE1_HASH = "" ]] && {
[[ $VERBOSE -eq 1 ]] && msg_err "Could not get hash for file 1 ($FILE1)"
return 0
}
[[ $FILE2_HASH = "" ]] && {
[[ $VERBOSE -eq 1 ]] && msg_err "Could not get hash for file 2 ($FILE2), replaceable"
return 1
}
[[ "$FILE1_HASH" == "$FILE2_HASH" ]] && {
[[ $VERBOSE -eq 1 ]] && msg_ok "Files match, not replaceable: $FILE1"
return 0
}
[[ $VERBOSE -eq 1 ]] && msg_warn "Files do not match ($FILE1_HASH != $FILE2_HASH), replaceable"
return 1
} }

View File

@@ -3418,6 +3418,11 @@ mute-stream@^1.0.0:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e"
integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==
mvdan-sh@^0.10.1:
version "0.10.1"
resolved "https://registry.yarnpkg.com/mvdan-sh/-/mvdan-sh-0.10.1.tgz#5b3a4462a89cf20739b12d851589342c875f4d1f"
integrity sha512-kMbrH0EObaKmK3nVRKUIIya1dpASHIEusM13S4V1ViHFuxuNxCo+arxoa6j/dbV22YBGjl7UKJm9QQKJ2Crzhg==
mz@^2.4.0: mz@^2.4.0:
version "2.7.0" version "2.7.0"
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
@@ -4008,6 +4013,14 @@ prelude-ls@^1.2.1:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
prettier-plugin-sh@^0.14.0:
version "0.14.0"
resolved "https://registry.yarnpkg.com/prettier-plugin-sh/-/prettier-plugin-sh-0.14.0.tgz#22b186adea79b36212ccd9faa8dd01f33ef34ff6"
integrity sha512-hfXulj5+zEl/ulrO5kMuuTPKmXvOg0bnLHY1hKFNN/N+/903iZbNp8NyZBTsgI8dtkSgFfAEIQq0IQTyP1ZVFQ==
dependencies:
mvdan-sh "^0.10.1"
sh-syntax "^0.4.1"
prettier@3.3.2: prettier@3.3.2:
version "3.3.2" version "3.3.2"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a"
@@ -4353,6 +4366,13 @@ set-function-name@^2.0.1:
functions-have-names "^1.2.3" functions-have-names "^1.2.3"
has-property-descriptors "^1.0.2" has-property-descriptors "^1.0.2"
sh-syntax@^0.4.1:
version "0.4.2"
resolved "https://registry.yarnpkg.com/sh-syntax/-/sh-syntax-0.4.2.tgz#3bad5c6134b510e7b4c53b16f409ce4fd2a65245"
integrity sha512-/l2UZ5fhGZLVZa16XQM9/Vq/hezGGbdHeVEA01uWjOL1+7Ek/gt6FquW0iKKws4a9AYPYvlz6RyVvjh3JxOteg==
dependencies:
tslib "^2.6.2"
shebang-command@^2.0.0: shebang-command@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -4796,6 +4816,11 @@ tsconfig-paths@^3.15.0:
minimist "^1.2.6" minimist "^1.2.6"
strip-bom "^3.0.0" strip-bom "^3.0.0"
tslib@^2.6.2:
version "2.6.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
tuf-js@^2.2.1: tuf-js@^2.2.1:
version "2.2.1" version "2.2.1"
resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.2.1.tgz#fdd8794b644af1a75c7aaa2b197ddffeb2911b56" resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.2.1.tgz#fdd8794b644af1a75c7aaa2b197ddffeb2911b56"