diff options
author | Elizabeth <me@liz.coffee> | 2025-05-19 23:03:02 -0700 |
---|---|---|
committer | Elizabeth <me@liz.coffee> | 2025-05-19 23:03:02 -0700 |
commit | 15b24ab9d782a8e5683f305ec8b1c31849a64246 (patch) | |
tree | bdb7c85f0d1f81e493c43360125ca61d6d26145c | |
download | dotfiles-15b24ab9d782a8e5683f305ec8b1c31849a64246.tar.gz dotfiles-15b24ab9d782a8e5683f305ec8b1c31849a64246.zip |
initial commit
130 files changed, 3160 insertions, 0 deletions
diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9a042b9 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "alacritty/.config/alacritty/alacritty-theme"] + path = alacritty/.config/alacritty/alacritty-theme + url = https://github.com/alacritty/alacritty-theme +[submodule "tmux/.tmux/plugins/tpm"] + path = tmux/.tmux/plugins/tpm + url = https://github.com/tmux-plugins/tpm diff --git a/aerospace/.aerospace.toml b/aerospace/.aerospace.toml new file mode 100644 index 0000000..81162d9 --- /dev/null +++ b/aerospace/.aerospace.toml @@ -0,0 +1,158 @@ +after-login-command = [] +after-startup-command = [ + 'exec-and-forget borders active_color=0xffe1e3e4 inactive_color=0xff494d64 width=4.0' +] + +start-at-login = true + +# Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization +enable-normalization-flatten-containers = true +enable-normalization-opposite-orientation-for-nested-containers = true + +# See: https://nikitabobko.github.io/AeroSpace/guide#layouts +# The 'accordion-padding' specifies the size of accordion padding +# You can set 0 to disable the padding feature +accordion-padding = 30 + +# Possible values: tiles|accordion +default-root-container-layout = 'tiles' + +# Possible values: horizontal|vertical|auto +# 'auto' means: wide monitor (anything wider than high) gets horizontal orientation, +# tall monitor (anything higher than wide) gets vertical orientation +default-root-container-orientation = 'auto' + +on-focus-changed = ['move-mouse window-lazy-center'] + +# You can effectively turn off macOS "Hide application" (cmd-h) feature by toggling this flag +# Useful if you don't use this macOS feature, but accidentally hit cmd-h or cmd-alt-h key +# Also see: https://nikitabobko.github.io/AeroSpace/goodies#disable-hide-app +automatically-unhide-macos-hidden-apps = true + +# Possible values: (qwerty|dvorak|colemak) +# See https://nikitabobko.github.io/AeroSpace/guide#key-mapping +[key-mapping] + preset = 'qwerty' + +# Gaps between windows (inner-*) and between monitor edges (outer-*). +# Possible values: +# - Constant: gaps.outer.top = 8 +# - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24] +# In this example, 24 is a default value when there is no match. +# Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'. +# See: +# https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors +[gaps] + inner.horizontal = 8 + inner.vertical = 8 + outer.left = 8 + outer.bottom = 8 + outer.top = 8 + outer.right = 8 + +[mode.main.binding] + # All possible commands: https://nikitabobko.github.io/AeroSpace/commands + + # See: https://nikitabobko.github.io/AeroSpace/commands#layout + alt-slash = 'layout tiles horizontal vertical' + alt-comma = 'layout accordion horizontal vertical' + + alt-ctrl-d = 'close' + alt-h = 'focus left' + alt-j = 'focus down' + alt-k = 'focus up' + alt-l = 'focus right' + + alt-shift-h = 'move left' + alt-shift-j = 'move down' + alt-shift-k = 'move up' + alt-shift-l = 'move right' + + alt-ctrl-space = ['mode main'] + alt-ctrl-h = ['join-with left', 'mode main'] + alt-ctrl-j = ['join-with down', 'mode main'] + alt-ctrl-k = ['join-with up', 'mode main'] + alt-ctrl-l = ['join-with right', 'mode main'] + + alt-minus = 'resize smart -50' + alt-equal = 'resize smart +50' + + # Monitor One Workspaces + alt-1 = 'workspace 1' + alt-2 = 'workspace 2' + alt-3 = 'workspace 3' + alt-4 = 'workspace 4' + alt-5 = 'workspace 5' + alt-q = 'workspace 1' + alt-w = 'workspace 2' + alt-e = 'workspace 3' + alt-r = 'workspace 4' + alt-t = 'workspace 5' + alt-shift-1 = 'move-node-to-workspace 1' + alt-shift-2 = 'move-node-to-workspace 2' + alt-shift-3 = 'move-node-to-workspace 3' + alt-shift-4 = 'move-node-to-workspace 4' + alt-shift-5 = 'move-node-to-workspace 5' + alt-shift-a = 'move-node-to-workspace 1' + alt-shift-s = 'move-node-to-workspace 2' + alt-shift-d = 'move-node-to-workspace 3' + alt-shift-f = 'move-node-to-workspace 4' + alt-shift-g = 'move-node-to-workspace 5' + + # Monitor Two Workspaces + alt-6 = 'workspace 6' + alt-7 = 'workspace 7' + alt-8 = 'workspace 8' + alt-9 = 'workspace 9' + alt-0 = 'workspace 10' + alt-y = 'workspace 6' + alt-u = 'workspace 7' + alt-i = 'workspace 8' + alt-o = 'workspace 9' + alt-p = 'workspace 10' + alt-shift-6 = 'move-node-to-workspace 6' + alt-shift-7 = 'move-node-to-workspace 7' + alt-shift-8 = 'move-node-to-workspace 8' + alt-shift-9 = 'move-node-to-workspace 9' + alt-shift-0 = 'move-node-to-workspace 10' + alt-shift-y = 'move-node-to-workspace 6' + alt-shift-u = 'move-node-to-workspace 7' + alt-shift-i = 'move-node-to-workspace 8' + alt-shift-o = 'move-node-to-workspace 9' + alt-shift-p = 'move-node-to-workspace 10' + + # See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth + alt-tab = 'workspace-back-and-forth' + # See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor + alt-shift-tab = 'move-workspace-to-monitor --wrap-around next' + + # See: https://nikitabobko.github.io/AeroSpace/commands#mode + alt-shift-semicolon = 'mode service' + +[workspace-to-monitor-force-assignment] + 1 = 'main' + 2 = 'main' + 3 = 'main' + 4 = 'main' + 5 = 'main' + 6 = 'secondary' + 7 = 'secondary' + 8 = 'secondary' + 9 = 'secondary' + 10 = 'secondary' + +# 'service' binding mode declaration. +# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes +[mode.service.binding] + esc = ['reload-config', 'mode main'] + r = ['flatten-workspace-tree', 'mode main'] # reset layout + f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout + backspace = ['close-all-windows-but-current', 'mode main'] + + # sticky is not yet supported https://github.com/nikitabobko/AeroSpace/issues/2 + #s = ['layout sticky tiling', 'mode main'] + + down = 'volume down' + up = 'volume up' + shift-down = ['volume set 0', 'mode main'] + diff --git a/alacritty/.config/alacritty/alacritty.toml b/alacritty/.config/alacritty/alacritty.toml new file mode 100644 index 0000000..f742d05 --- /dev/null +++ b/alacritty/.config/alacritty/alacritty.toml @@ -0,0 +1,44 @@ +[cursor] +style = "Block" +unfocused_hollow = false + +[font] +size = 14.0 + +[font.glyph_offset] +x = 0 +y = 0 + +[font.bold] +family = "Lekton Nerd Font Mono" +style = "Bold" + +[font.italic] +family = "Lekton Nerd Font Mono" +style = "Italic" + +[font.normal] +family = "Lekton Nerd Font Mono" +style = "Regular" + +[font.offset] +x = 0 +y = 1 + +[window] +dynamic_padding = true +option_as_alt = "Both" +decorations = "Buttonless" +opacity = 0.91 +blur = true + +[window.padding] +x = 12 +y = 4 + +[env] +TERM = "alacritty-direct" + +[general] +import = ["~/.theme/alacritty.toml"] + diff --git a/alacritty/.config/alacritty/theme.toml b/alacritty/.config/alacritty/theme.toml new file mode 100644 index 0000000..b8631a4 --- /dev/null +++ b/alacritty/.config/alacritty/theme.toml @@ -0,0 +1,4 @@ +[general] +import = [ + "/tmp/alacritty_theme.toml" +] diff --git a/cleanup.sh b/cleanup.sh new file mode 100755 index 0000000..4b208c1 --- /dev/null +++ b/cleanup.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +find . -type d -mindepth 1 -maxdepth 1 -not -path '*/.*' \ + | sed "s/^\.\///" \ + | while read dir; do stow -D "$dir"; done diff --git a/git/.config/git/rootignore b/git/.config/git/rootignore new file mode 100644 index 0000000..136db89 --- /dev/null +++ b/git/.config/git/rootignore @@ -0,0 +1,7 @@ +.classpath +.factorypath +.project +.settings +.idea +.cache +.vscode diff --git a/git/.gitconfig b/git/.gitconfig new file mode 100644 index 0000000..575b008 --- /dev/null +++ b/git/.gitconfig @@ -0,0 +1,10 @@ +[user] + signingkey = 7BB52F7036FA7C18 +[commit] + gpgsign = true +[core] + excludesFile = ~/.config/git/rootignore +[push] + autoSetupRemote = true +[pull] + rebase = true diff --git a/gpg/.gnupg/common.conf b/gpg/.gnupg/common.conf new file mode 100755 index 0000000..5add401 --- /dev/null +++ b/gpg/.gnupg/common.conf @@ -0,0 +1 @@ +use-keyboxd diff --git a/gpg/.gnupg/gpg-agent.conf b/gpg/.gnupg/gpg-agent.conf new file mode 100755 index 0000000..3578512 --- /dev/null +++ b/gpg/.gnupg/gpg-agent.conf @@ -0,0 +1,2 @@ +pinentry-program /tmp/pinentry +enable-ssh-support diff --git a/home/Documents/pubkey.asc b/home/Documents/pubkey.asc new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/home/Documents/pubkey.asc diff --git a/home/Pictures/pfp/bubblegum.png b/home/Pictures/pfp/bubblegum.png Binary files differnew file mode 100644 index 0000000..171bc62 --- /dev/null +++ b/home/Pictures/pfp/bubblegum.png diff --git a/home/Pictures/pfp/eejypenguin.png b/home/Pictures/pfp/eejypenguin.png Binary files differnew file mode 100644 index 0000000..2ae47cb --- /dev/null +++ b/home/Pictures/pfp/eejypenguin.png diff --git a/home/Pictures/pfp/gus.jpg b/home/Pictures/pfp/gus.jpg Binary files differnew file mode 100644 index 0000000..8073311 --- /dev/null +++ b/home/Pictures/pfp/gus.jpg diff --git a/home/Pictures/pfp/mefr.png b/home/Pictures/pfp/mefr.png Binary files differnew file mode 100644 index 0000000..46e6948 --- /dev/null +++ b/home/Pictures/pfp/mefr.png diff --git a/home/Pictures/pfp/shoppingpenguin.png b/home/Pictures/pfp/shoppingpenguin.png Binary files differnew file mode 100644 index 0000000..02c14ec --- /dev/null +++ b/home/Pictures/pfp/shoppingpenguin.png diff --git a/home/Pictures/wallpapers/5m5kLI9.png b/home/Pictures/wallpapers/5m5kLI9.png Binary files differnew file mode 100644 index 0000000..bf7b60d --- /dev/null +++ b/home/Pictures/wallpapers/5m5kLI9.png diff --git a/home/Pictures/wallpapers/Flight1.webp b/home/Pictures/wallpapers/Flight1.webp Binary files differnew file mode 100644 index 0000000..c59bd58 --- /dev/null +++ b/home/Pictures/wallpapers/Flight1.webp diff --git a/home/Pictures/wallpapers/Pages.png b/home/Pictures/wallpapers/Pages.png Binary files differnew file mode 100644 index 0000000..3e4cf16 --- /dev/null +++ b/home/Pictures/wallpapers/Pages.png diff --git a/home/Pictures/wallpapers/beach.jpg b/home/Pictures/wallpapers/beach.jpg Binary files differnew file mode 100644 index 0000000..e2e3949 --- /dev/null +++ b/home/Pictures/wallpapers/beach.jpg diff --git a/home/Pictures/wallpapers/maciek-sulkowski-fJ-22PLNGvE.jpg b/home/Pictures/wallpapers/maciek-sulkowski-fJ-22PLNGvE.jpg Binary files differnew file mode 100644 index 0000000..c2f6350 --- /dev/null +++ b/home/Pictures/wallpapers/maciek-sulkowski-fJ-22PLNGvE.jpg diff --git a/home/Pictures/wallpapers/rose01.png b/home/Pictures/wallpapers/rose01.png Binary files differnew file mode 100644 index 0000000..0b11bcb --- /dev/null +++ b/home/Pictures/wallpapers/rose01.png diff --git a/home/Pictures/wallpapers/table.png b/home/Pictures/wallpapers/table.png Binary files differnew file mode 100644 index 0000000..bb86417 --- /dev/null +++ b/home/Pictures/wallpapers/table.png diff --git a/home/Pictures/wallpapers/wall.jpg b/home/Pictures/wallpapers/wall.jpg Binary files differnew file mode 100644 index 0000000..f9df8f1 --- /dev/null +++ b/home/Pictures/wallpapers/wall.jpg diff --git a/home/scripts/greet.sh b/home/scripts/greet.sh new file mode 100755 index 0000000..00b6be5 --- /dev/null +++ b/home/scripts/greet.sh @@ -0,0 +1,29 @@ +#!/bin/bash +source log.sh "greet.sh" + +pick_greeting() { + path="$1" + greetings=("$1"/*) + greeting="${greetings[$RANDOM % ${#greetings[@]}]}" + echo "$greeting" +} + +GREETINGS_LIST="$XDG_CONFIG_HOME/zsh/greetings" +if [ ! -d "$GREETINGS_LIST" ]; then + log DEBUG "no such file $GREETINGS_LIST" + exit 0 +fi + +for greetings in $(ls "$GREETINGS_LIST" | sort); do + echo + log DEBUG "greeting $greetings" + + path="$GREETINGS_LIST/$greetings" + if [ ! -d "$path" ]; then + log DEBUG "greetings $path is not a directory" + continue + fi + + greeting=$(pick_greeting "$path") + cat "$greeting" +done diff --git a/home/scripts/log.sh b/home/scripts/log.sh new file mode 100755 index 0000000..8895097 --- /dev/null +++ b/home/scripts/log.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +# usage: +# > source log.sh <CALLER> +# > log INFO "hello" +# > log "this is epic" +# > log DEBUG "yo" + +_LOG_CALLER=$(basename "$1") + +log() { + LEVEL=$1 + shift + + case "$LEVEL" in + INFO|DEBUG|ERROR) + ;; + *) + set -- "INFO" "$LEVEL" "$@" + LEVEL="INFO" + ;; + esac + + TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') + MESSAGE="$*" + + if [ "$LEVEL" = "DEBUG" ] && [ -z "$DEBUG" ]; then + return + fi + + echo "[$TIMESTAMP] [$_LOG_CALLER] [$LEVEL] $MESSAGE" +} diff --git a/home/scripts/pinentry.sh b/home/scripts/pinentry.sh new file mode 100755 index 0000000..f02ee6f --- /dev/null +++ b/home/scripts/pinentry.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +source log.sh "pinentry.sh" + +#-- <gpg> -- +bin="${HOMEBREW_PREFIX:-"/usr"}/bin" +case "$PINENTRY_USER_DATA" in + *USE_TTY*) pe=$bin/pinentry-tty ;; + *USE_CURSES*) pe=$bin/pinentry-curses ;; + *USE_QT*) pe=$bin/pinentry-qt ;; + *USE_MAC*) pe=$bin/pinentry-mac ;; + *USE_GTK2*) pe=$bin/pinentry-gtk-2 ;; + *USE_GNOME3*) pe=$bin/pinentry-gnome3 ;; + *USE_X11*) pe=$bin/pinentry-x11 ;; +esac + +log DEBUG "$pe" + +exec $pe "$@" +#-- </gpg> -- diff --git a/home/scripts/platform.sh b/home/scripts/platform.sh new file mode 100755 index 0000000..9449ceb --- /dev/null +++ b/home/scripts/platform.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +case "$OSTYPE" in + solaris*) echo "solaris" ;; + darwin*) echo "osx" ;; + linux*) echo "linux" ;; + bsd*) echo "bsd" ;; + msys*) echo "windows" ;; + cygwin*) echo "windows" ;; + *) echo "unknown" ;; +esac diff --git a/home/scripts/system_name.sh b/home/scripts/system_name.sh new file mode 100755 index 0000000..92b714a --- /dev/null +++ b/home/scripts/system_name.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +platform="$(platform.sh)" + +MACHINE="$HOST" +if [ "$platform" = "osx" ]; then + MACHINE="$(scutil --get ComputerName)" +elif [ "$platform" = "linux" ]; then + MACHINE="$(cat /proc/sys/kernel/hostname)" +fi + +echo $MACHINE | awk -F\. '{print $1}' \ + | tr '[:upper:]' '[:lower:]' \ + | tr ' ' '-' diff --git a/home/scripts/theme.sh b/home/scripts/theme.sh new file mode 100755 index 0000000..3608c14 --- /dev/null +++ b/home/scripts/theme.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# usage: theme.sh <theme_name> + +source log.sh "theme.sh" + +THEME="$1" +log DEBUG "setting theme $THEME" + +THEME_SRC="$XDG_CONFIG_HOME/theme" +THEME_DEST="$HOME/.theme" +log DEBUG "src $THEME_SRC -> dest $THEME_DEST" + +THEME_TEMPL="{{THEME}}" + +find "$THEME_SRC/" -type f | while read source_file; do + destination_file=`echo "$source_file" | sed "s|^$THEME_SRC|$THEME_DEST|g"` + mkdir -p `dirname $destination_file` + log DEBUG "src $source_file -> dest $dest_file" + cat "$source_file" | sed "s|$THEME_TEMPL|$THEME|g" > $destination_file +done + @@ -0,0 +1,5 @@ +#!/bin/sh + +find . -type d -mindepth 1 -maxdepth 1 -not -path '*/.*' \ + | sed "s/^\.\///" \ + | while read dir; do stow --no-folding "$dir"; done diff --git a/mise/.config/mise/config.toml b/mise/.config/mise/config.toml new file mode 100644 index 0000000..adb8f3f --- /dev/null +++ b/mise/.config/mise/config.toml @@ -0,0 +1,4 @@ +[tools] +node = "lts" +python = "3.12" +deno = "2.3.3" diff --git a/nvim/.config/nvim/config/lazy.lua b/nvim/.config/nvim/config/lazy.lua new file mode 100644 index 0000000..f5ee74c --- /dev/null +++ b/nvim/.config/nvim/config/lazy.lua @@ -0,0 +1,35 @@ +-- Bootstrap lazy.nvim +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end +end +vim.opt.rtp:prepend(lazypath) + +-- Make sure to setup `mapleader` and `maplocalleader` before +-- loading lazy.nvim so that mappings are correct. +-- This is also a good place to setup other settings (vim.opt) +vim.g.mapleader = " " +vim.g.maplocalleader = "\\" + +-- Setup lazy.nvim +require("lazy").setup({ + spec = { + -- import your plugins + { import = "plugins" }, + }, + -- Configure any other settings here. See the documentation for more details. + -- colorscheme that will be used when installing plugins. + install = { colorscheme = { "habamax" } }, + -- automatically check for plugin updates + checker = { enabled = true }, +}) diff --git a/nvim/.config/nvim/config/options.lua b/nvim/.config/nvim/config/options.lua new file mode 100644 index 0000000..01489f0 --- /dev/null +++ b/nvim/.config/nvim/config/options.lua @@ -0,0 +1,39 @@ +local options = { + cmdheight = 0, + + number = true, + relativenumber = true, + + clipboard = "unnamedplus", + + breakindent = true, + tabstop = 4, + softtabstop = 4, + shiftwidth = 4, + expandtab = true, + + undofile = true, + + hlsearch = false, + ignorecase = true, + smartcase = true, + + completeopt = "menuone,noselect", + + timeout = true, + timeoutlen = 500, + + foldcolumn = "0", + foldlevel = 99, + foldlevelstart = 99, + foldenable = true, + + spelllang = { "nb", "en" }, + spellcapcheck = "", +} + +vim.g.spellfile_URL = "https://ftp.nluug.nl/pub/vim/runtime/spell/" + +for k, v in pairs(options) do + vim.opt[k] = v +end diff --git a/nvim/.config/nvim/init.lua b/nvim/.config/nvim/init.lua new file mode 100644 index 0000000..ae56b98 --- /dev/null +++ b/nvim/.config/nvim/init.lua @@ -0,0 +1,9 @@ +-- <leader> -- +vim.g.mapleader = " " +vim.g.maplocalleader = "\\" +-- </leader> -- + +-- <init.config> -- +require("config.lazy") +require("config.options") +-- </init.config> -- diff --git a/nvim/.config/nvim/lua/.gitkeep b/nvim/.config/nvim/lua/.gitkeep new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/nvim/.config/nvim/lua/.gitkeep diff --git a/nvim/.config/nvim/lua/autopairs.lua b/nvim/.config/nvim/lua/autopairs.lua new file mode 100644 index 0000000..cd78d93 --- /dev/null +++ b/nvim/.config/nvim/lua/autopairs.lua @@ -0,0 +1,16 @@ +return { + "windwp/nvim-autopairs", + config = function() + require("nvim-autopairs").setup({}) + + local cmp_autopairs = require("nvim-autopairs.completion.cmp") + local cmp = require("cmp") + + cmp.event:on( + "confirm_done", + cmp_autopairs.on_confirm_done() + ) + + end, +} + diff --git a/nvim/.config/nvim/lua/comment.lua b/nvim/.config/nvim/lua/comment.lua new file mode 100644 index 0000000..fe9adbe --- /dev/null +++ b/nvim/.config/nvim/lua/comment.lua @@ -0,0 +1,6 @@ +return { + "numToStr/Comment.nvim", + opts = {}, + lazy = false, +} + diff --git a/nvim/.config/nvim/lua/lualine.lua b/nvim/.config/nvim/lua/lualine.lua new file mode 100644 index 0000000..a5c341d --- /dev/null +++ b/nvim/.config/nvim/lua/lualine.lua @@ -0,0 +1,34 @@ +return { + { + 'nvim-lualine/lualine.nvim', + event = 'VeryLazy', + opts = function() + return { + options = { + icons_enabled = true, + theme = 'gruvbox', + component_separators = { left = '', right = ''}, + section_separators = { left = '', right = ''}, + }, + sections = { + lualine_c = { + { 'filename', path = 1 }, + }, + lualine_y = { + { + require('tmux-status').tmux_windows, + cond = require('tmux-status').show, + padding = { left = 1, right = 1 }, + }, + } + }, + } + end, + }, + { + "christopher-francisco/tmux-status.nvim", +-- lazy = true, + opts = {}, + }, +} + diff --git a/nvim/.config/nvim/lua/telescope.lua b/nvim/.config/nvim/lua/telescope.lua new file mode 100644 index 0000000..47b0b36 --- /dev/null +++ b/nvim/.config/nvim/lua/telescope.lua @@ -0,0 +1,25 @@ +return { + "nvim-telescope/telescope.nvim", + branch = "0.1.x", + dependencies = { + "nvim-lua/plenary.nvim", + { + "nvim-telescope/telescope-fzf-native.nvim", + build = "make", + cond = function() + return vim.fn.executable "make" == 1 + end, + }, + }, + config = function () + pcall(require("telescope").load_extension, "fzf") + end, + opt = { + pickers = { + colorscheme = { + enable_preview = true + } + } + }, +} + diff --git a/nvim/.config/nvim/lua/theme.lua b/nvim/.config/nvim/lua/theme.lua new file mode 100644 index 0000000..7f53fa8 --- /dev/null +++ b/nvim/.config/nvim/lua/theme.lua @@ -0,0 +1,9 @@ +return { + "ellisonleao/gruvbox.nvim", + opts = { + transparent_mode = true, + }, + init = function() + vim.cmd("colorscheme gruvbox") + end +} diff --git a/nvim/.config/nvim/lua/whichkey.lua b/nvim/.config/nvim/lua/whichkey.lua new file mode 100644 index 0000000..1173e06 --- /dev/null +++ b/nvim/.config/nvim/lua/whichkey.lua @@ -0,0 +1,6 @@ +return { + "folke/which-key.nvim", + event = "VeryLazy", + opts = {}, +} + diff --git a/ssh/.ssh/config b/ssh/.ssh/config new file mode 100644 index 0000000..6470283 --- /dev/null +++ b/ssh/.ssh/config @@ -0,0 +1,14 @@ +Host coffee + User serve + ForwardAgent yes + Hostname outbound.liz.coffee + +Host coffee-one + User serve + ForwardAgent yes + Hostname outbound-one.liz.coffee + +Host coffee-src + User liz + Hostname src.liz.coffee + Port 2222 diff --git a/starship/.config/starship.toml b/starship/.config/starship.toml new file mode 100644 index 0000000..1967fe4 --- /dev/null +++ b/starship/.config/starship.toml @@ -0,0 +1,53 @@ +format = """ +${custom.tztime} \ +$username\ +$hostname\ +$directory\ +$git_branch\ +$git_state\ +$git_status\ +$cmd_duration\ +$line_break\ +$character""" + +[username] +show_always = true + +[hostname] +ssh_only = false + +[directory] +style = "blue" + +[character] +success_symbol = "[λ](blue)" +error_symbol = "[λ](red)" +vimcmd_symbol = "[λ](green)" + +[git_branch] +format = "[$branch]($style)" +style = "bright-black" + +[git_status] +format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](218) ($ahead_behind$stashed)]($style)" +style = "cyan" +conflicted = "" +untracked = "" +modified = "" +staged = "" +renamed = "" +deleted = "" +stashed = "≡" + +[git_state] +format = '\([$state( $progress_current/$progress_total)]($style)\) ' +style = "bright-black" + +[cmd_duration] +format = "[$duration]($style) " +style = "yellow" + +[custom.tztime] +command = 'date +"%a %b %d %Y %l:%M%p (%Z%z)"' +when = "true" +format = '[\[$symbol($output)\]](green)' diff --git a/theme/.config/theme/alacritty.toml b/theme/.config/theme/alacritty.toml new file mode 100644 index 0000000..d3c158b --- /dev/null +++ b/theme/.config/theme/alacritty.toml @@ -0,0 +1,4 @@ +[general] +import = [ + "~/.config/alacritty/alacritty-theme/themes/{{THEME}}.toml" +] diff --git a/tmux/.config/tmux/tmux.conf b/tmux/.config/tmux/tmux.conf new file mode 100644 index 0000000..3f2862a --- /dev/null +++ b/tmux/.config/tmux/tmux.conf @@ -0,0 +1,26 @@ +#-- <keybinds> -- +set -g prefix C-s + +unbind r +bind r source-file ~/.config/tmux/tmux.conf + +bind-key h select-pane -L +bind-key j select-pane -D +bind-key k select-pane -U +bind-key l select-pane -R +#-- </keybinds> -- + +#-- <plugins> -- +set -g @plugin 'tmux-plugins/tpm' +set -g @plugin 'tmux-plugins/tmux-sensible' +#-- </plugins> -- + +#-- <theme> -- +set -g @plugin 'egel/tmux-gruvbox' +set -g @tmux-gruvbox 'dark' +#-- </theme> -- + +#-- <tpm> -- +# keep at bottom +run '~/.tmux/plugins/tpm/tpm' +#-- </tpm> -- diff --git a/tmux/.tmux/plugins/tpm/.gitattributes b/tmux/.tmux/plugins/tpm/.gitattributes new file mode 100644 index 0000000..80772e4 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/.gitattributes @@ -0,0 +1,9 @@ +# Force text files to have unix eols, so Windows/Cygwin does not break them +*.* eol=lf + +# These files are unfortunately not recognized as text files so +# explicitly listing them here +tpm eol=lf +bin/* eol=lf +bindings/* eol=lf +tests/* eol=lf diff --git a/tmux/.tmux/plugins/tpm/.gitignore b/tmux/.tmux/plugins/tpm/.gitignore new file mode 100644 index 0000000..8a94156 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/.gitignore @@ -0,0 +1,4 @@ +**/.vagrant/ +run_tests +tests/run_tests_in_isolation +tests/helpers/helpers.sh diff --git a/tmux/.tmux/plugins/tpm/.gitmodules b/tmux/.tmux/plugins/tpm/.gitmodules new file mode 100644 index 0000000..5e44e3c --- /dev/null +++ b/tmux/.tmux/plugins/tpm/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/tmux-test"] + path = lib/tmux-test + url = https://github.com/tmux-plugins/tmux-test.git diff --git a/tmux/.tmux/plugins/tpm/.travis.yml b/tmux/.tmux/plugins/tpm/.travis.yml new file mode 100644 index 0000000..ac45d8b --- /dev/null +++ b/tmux/.tmux/plugins/tpm/.travis.yml @@ -0,0 +1,19 @@ +# generic packages and tmux +before_install: + - sudo apt-get update + - sudo apt-get install -y git-core expect + - sudo apt-get install -y python-software-properties software-properties-common + - sudo apt-get install -y libevent-dev libncurses-dev + - git clone https://github.com/tmux/tmux.git + - cd tmux + - git checkout 2.0 + - sh autogen.sh + - ./configure && make && sudo make install + +install: + - git fetch --unshallow --recurse-submodules || git fetch --recurse-submodules + # manual `git clone` required for testing `tmux-test` plugin itself + - git clone https://github.com/tmux-plugins/tmux-test lib/tmux-test; true + - lib/tmux-test/setup + +script: ./tests/run_tests_in_isolation diff --git a/tmux/.tmux/plugins/tpm/CHANGELOG.md b/tmux/.tmux/plugins/tpm/CHANGELOG.md new file mode 100644 index 0000000..a9ce81e --- /dev/null +++ b/tmux/.tmux/plugins/tpm/CHANGELOG.md @@ -0,0 +1,86 @@ +# Changelog + +### master + +### v3.1.0, 2023-01-03 +- upgrade to new version of `tmux-test` +- bug: when using `emacs` copy mode, Enter does not quit screen after tpm + installation/update. Fix by making `Escape` the key for emacs mode. +- add a doc with troubleshooting instructions +- add `.gitattributes` file that forces linefeed characters (classic `\n`) as + line endings - helps with misconfigured git on windows/cygwin +- readme update: announce Cygwin support +- un-deprecate old plugin definition syntax: `set -g @tpm_plugins` +- More stuff, check `git log`. + +### v3.0.0, 2015-08-03 +- refactor `shared_set_tpm_path_constant` function +- move all instructions to `docs/` dir +- add `bin/install_plugins` cli executable script +- improved test runner function +- switch to using [tmux-test](https://github.com/tmux-plugins/tmux-test) + framework +- add `bin/update_plugins` cli executable script +- refactor test `expect` scripts, make them simpler and ensure they properly + assert expectations +- refactor code that sets 'TMUX_PLUGIN_MANAGER_PATH' global env var +- stop using global variable for 'tpm path' +- support defining plugins via `set -g @plugin` in sourced files as well + +### v2.0.0, 2015-07-07 +- enable overriding default key bindings +- start using `C-c` to clear screen +- add uninstall/clean procedure and keybinding (prefix+alt+u) (@chilicuil) +- add new `set @plugin 'repo'` plugin definition syntax (@chilicuil) +- revert back to using `-g` flag in new plugin definition syntax +- permit leading whitespace with new plugin definition syntax (thanks @chilicuil) +- make sure `TMUX_PLUGIN_MANAGER_PATH` always has trailng slash +- ensure old/deprecated plugin syntax `set -g @tpm_plugins` works alongside new + `set -g @plugin` syntax + +### v1.2.2, 2015-02-08 +- set GIT_TERMINAL_PROMPT=0 when doing `git clone`, `pull` or `submodule update` + to ensure git does not prompt for username/password in any case + +### v1.2.1, 2014-11-21 +- change the way plugin name is expanded. It now uses the http username + and password by default, like this: `https://git::@github.com/`. This prevents + username and password prompt (and subsequently tmux install hanging) with old + git versions. Fixes #7. + +### v1.2.0, 2014-11-20 +- refactor tests so they can be used on travis +- add travis.yml, add travis badge to the readme + +### v1.1.0, 2014-11-19 +- if the plugin is not downloaded do not source it +- remove `PLUGINS.md`, an obsolete list of plugins +- update readme with instructions about uninstalling plugins +- tilde char and `$HOME` in `TMUX_SHARED_MANAGER_PATH` couldn't be used because + they are just plain strings. Fixing the problem by manually expanding them. +- bugfix: fragile `*.tmux` file globbing (@majutsushi) + +### v1.0.0, 2014-08-05 +- update readme because of github organization change to + [tmux-plugins](https://github.com/tmux-plugins) +- update tests to pass +- update README to suggest different first plugin +- update list of plugins in the README +- remove README 'about' section +- move key binding to the main file. Delete `key_binding.sh`. +- rename `display_message` -> `echo_message` +- installing plugins installs just new plugins. Already installed plugins aren't + updated. +- add 'update plugin' binding and functionality +- add test for updating a plugin + +### v0.0.2, 2014-07-17 +- run all *.tmux plugin files as executables +- fix all redirects to /dev/null +- fix bug: TPM shared path is created before sync (cloning plugins from github + is done) +- add test suite running in Vagrant +- add Tmux version check. `TPM` won't run if Tmux version is less than 1.9. + +### v0.0.1, 2014-05-21 +- get TPM up and running diff --git a/tmux/.tmux/plugins/tpm/HOW_TO_PLUGIN.md b/tmux/.tmux/plugins/tpm/HOW_TO_PLUGIN.md new file mode 100644 index 0000000..9901619 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/HOW_TO_PLUGIN.md @@ -0,0 +1,2 @@ +Instructions moved to +[docs/how_to_create_plugin.md](docs/how_to_create_plugin.md). diff --git a/tmux/.tmux/plugins/tpm/LICENSE.md b/tmux/.tmux/plugins/tpm/LICENSE.md new file mode 100644 index 0000000..1222865 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/LICENSE.md @@ -0,0 +1,20 @@ +MIT license +Copyright (C) 2014 Bruno Sutic + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tmux/.tmux/plugins/tpm/README.md b/tmux/.tmux/plugins/tpm/README.md new file mode 100644 index 0000000..2371863 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/README.md @@ -0,0 +1,101 @@ +# Tmux Plugin Manager + +[](https://travis-ci.org/tmux-plugins/tpm) + +Installs and loads `tmux` plugins. + +Tested and working on Linux, OSX, and Cygwin. + +See list of plugins [here](https://github.com/tmux-plugins/list). + +### Installation + +Requirements: `tmux` version 1.9 (or higher), `git`, `bash`. + +Clone TPM: + +```bash +git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm +``` + +Put this at the bottom of `~/.tmux.conf` (`$XDG_CONFIG_HOME/tmux/tmux.conf` +works too): + +```bash +# List of plugins +set -g @plugin 'tmux-plugins/tpm' +set -g @plugin 'tmux-plugins/tmux-sensible' + +# Other examples: +# set -g @plugin 'github_username/plugin_name' +# set -g @plugin 'github_username/plugin_name#branch' +# set -g @plugin 'git@github.com:user/plugin' +# set -g @plugin 'git@bitbucket.com:user/plugin' + +# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf) +run '~/.tmux/plugins/tpm/tpm' +``` + +Reload TMUX environment so TPM is sourced: + +```bash +# type this in terminal if tmux is already running +tmux source ~/.tmux.conf +``` + +That's it! + +### Installing plugins + +1. Add new plugin to `~/.tmux.conf` with `set -g @plugin '...'` +2. Press `prefix` + <kbd>I</kbd> (capital i, as in **I**nstall) to fetch the plugin. + +You're good to go! The plugin was cloned to `~/.tmux/plugins/` dir and sourced. + +### Uninstalling plugins + +1. Remove (or comment out) plugin from the list. +2. Press `prefix` + <kbd>alt</kbd> + <kbd>u</kbd> (lowercase u as in **u**ninstall) to remove the plugin. + +All the plugins are installed to `~/.tmux/plugins/` so alternatively you can +find plugin directory there and remove it. + +### Key bindings + +`prefix` + <kbd>I</kbd> +- Installs new plugins from GitHub or any other git repository +- Refreshes TMUX environment + +`prefix` + <kbd>U</kbd> +- updates plugin(s) + +`prefix` + <kbd>alt</kbd> + <kbd>u</kbd> +- remove/uninstall plugins not on the plugin list + +### Docs + +- [Help, tpm not working](docs/tpm_not_working.md) - problem solutions + +More advanced features and instructions, regular users probably do not need +this: + +- [How to create a plugin](docs/how_to_create_plugin.md). It's easy. +- [Managing plugins via the command line](docs/managing_plugins_via_cmd_line.md) +- [Changing plugins install dir](docs/changing_plugins_install_dir.md) +- [Automatic TPM installation on a new machine](docs/automatic_tpm_installation.md) + +### Tests + +Tests for this project run on [Travis CI](https://travis-ci.org/tmux-plugins/tpm). + +When run locally, [vagrant](https://www.vagrantup.com/) is required. +Run tests with: + +```bash +# within project directory +./run_tests +``` + +### License + +[MIT](LICENSE.md) diff --git a/tmux/.tmux/plugins/tpm/bin/clean_plugins b/tmux/.tmux/plugins/tpm/bin/clean_plugins new file mode 100755 index 0000000..12f8730 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/bin/clean_plugins @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +# Script intended for use via the command line. +# +# `.tmux.conf` needs to be set for TPM. Tmux has to be installed on the system, +# but does not need to be started in order to run this script. + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +SCRIPTS_DIR="$CURRENT_DIR/../scripts" + +main() { + "$SCRIPTS_DIR/clean_plugins.sh" # has correct exit code +} +main diff --git a/tmux/.tmux/plugins/tpm/bin/install_plugins b/tmux/.tmux/plugins/tpm/bin/install_plugins new file mode 100755 index 0000000..c66b15b --- /dev/null +++ b/tmux/.tmux/plugins/tpm/bin/install_plugins @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +# Script intended for use via the command line. +# +# `.tmux.conf` needs to be set for TPM. Tmux has to be installed on the system, +# but does not need to be started in order to run this script. + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +SCRIPTS_DIR="$CURRENT_DIR/../scripts" + +main() { + "$SCRIPTS_DIR/install_plugins.sh" # has correct exit code +} +main diff --git a/tmux/.tmux/plugins/tpm/bin/update_plugins b/tmux/.tmux/plugins/tpm/bin/update_plugins new file mode 100755 index 0000000..30a5646 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/bin/update_plugins @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +# Script intended for use via the command line. +# +# `.tmux.conf` needs to be set for TPM. Tmux has to be installed on the system, +# but does not need to be started in order to run this script. + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +SCRIPTS_DIR="$CURRENT_DIR/../scripts" +PROGRAM_NAME="$0" + +if [ $# -eq 0 ]; then + echo "usage:" + echo " $PROGRAM_NAME all update all plugins" + echo " $PROGRAM_NAME tmux-foo update plugin 'tmux-foo'" + echo " $PROGRAM_NAME tmux-bar tmux-baz update multiple plugins" + exit 1 +fi + +main() { + "$SCRIPTS_DIR/update_plugin.sh" --shell-echo "$*" # has correct exit code +} +main "$*" + diff --git a/tmux/.tmux/plugins/tpm/bindings/clean_plugins b/tmux/.tmux/plugins/tpm/bindings/clean_plugins new file mode 100755 index 0000000..9a0d5d7 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/bindings/clean_plugins @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +# Tmux key-binding script. +# Scripts intended to be used via the command line are in `bin/` directory. + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +SCRIPTS_DIR="$CURRENT_DIR/../scripts" +HELPERS_DIR="$SCRIPTS_DIR/helpers" + +source "$HELPERS_DIR/tmux_echo_functions.sh" +source "$HELPERS_DIR/tmux_utils.sh" + +main() { + reload_tmux_environment + "$SCRIPTS_DIR/clean_plugins.sh" --tmux-echo >/dev/null 2>&1 + reload_tmux_environment + end_message +} +main diff --git a/tmux/.tmux/plugins/tpm/bindings/install_plugins b/tmux/.tmux/plugins/tpm/bindings/install_plugins new file mode 100755 index 0000000..3ade3c4 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/bindings/install_plugins @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +# Tmux key-binding script. +# Scripts intended to be used via the command line are in `bin/` directory. + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +SCRIPTS_DIR="$CURRENT_DIR/../scripts" +HELPERS_DIR="$SCRIPTS_DIR/helpers" + +source "$HELPERS_DIR/tmux_echo_functions.sh" +source "$HELPERS_DIR/tmux_utils.sh" + +main() { + reload_tmux_environment + "$SCRIPTS_DIR/install_plugins.sh" --tmux-echo >/dev/null 2>&1 + reload_tmux_environment + end_message +} +main diff --git a/tmux/.tmux/plugins/tpm/bindings/update_plugins b/tmux/.tmux/plugins/tpm/bindings/update_plugins new file mode 100755 index 0000000..28cc281 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/bindings/update_plugins @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +# Tmux key-binding script. +# Scripts intended to be used via the command line are in `bin/` directory. + +# This script: +# - shows a list of installed plugins +# - starts a prompt to enter the name of the plugin that will be updated + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +SCRIPTS_DIR="$CURRENT_DIR/../scripts" +HELPERS_DIR="$SCRIPTS_DIR/helpers" + +source "$HELPERS_DIR/plugin_functions.sh" +source "$HELPERS_DIR/tmux_echo_functions.sh" +source "$HELPERS_DIR/tmux_utils.sh" + +display_plugin_update_list() { + local plugins="$(tpm_plugins_list_helper)" + tmux_echo "Installed plugins:" + tmux_echo "" + + for plugin in $plugins; do + # displaying only installed plugins + if plugin_already_installed "$plugin"; then + local plugin_name="$(plugin_name_helper "$plugin")" + tmux_echo " $plugin_name" + fi + done + + tmux_echo "" + tmux_echo "Type plugin name to update it." + tmux_echo "" + tmux_echo "- \"all\" - updates all plugins" + tmux_echo "- ENTER - cancels" +} + +update_plugin_prompt() { + tmux command-prompt -p 'plugin update:' " \ + send-keys C-c; \ + run-shell '$SCRIPTS_DIR/update_plugin_prompt_handler.sh %1'" +} + +main() { + reload_tmux_environment + display_plugin_update_list + update_plugin_prompt +} +main diff --git a/tmux/.tmux/plugins/tpm/docs/automatic_tpm_installation.md b/tmux/.tmux/plugins/tpm/docs/automatic_tpm_installation.md new file mode 100644 index 0000000..630573f --- /dev/null +++ b/tmux/.tmux/plugins/tpm/docs/automatic_tpm_installation.md @@ -0,0 +1,12 @@ +# Automatic tpm installation + +One of the first things we do on a new machine is cloning our dotfiles. Not everything comes with them though, so for example `tpm` most likely won't be installed. + +If you want to install `tpm` and plugins automatically when tmux is started, put the following snippet in `.tmux.conf` before the final `run '~/.tmux/plugins/tpm/tpm'`: + +``` +if "test ! -d ~/.tmux/plugins/tpm" \ + "run 'git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm && ~/.tmux/plugins/tpm/bin/install_plugins'" +``` + +This useful tip was submitted by @acr4 and narfman0. diff --git a/tmux/.tmux/plugins/tpm/docs/changing_plugins_install_dir.md b/tmux/.tmux/plugins/tpm/docs/changing_plugins_install_dir.md new file mode 100644 index 0000000..27de96d --- /dev/null +++ b/tmux/.tmux/plugins/tpm/docs/changing_plugins_install_dir.md @@ -0,0 +1,16 @@ +# Changing plugins install dir + +By default, TPM installs plugins in a subfolder named `plugins/` inside +`$XDG_CONFIG_HOME/tmux/` if a `tmux.conf` file was found at that location, or +inside `~/.tmux/` otherwise. + +You can change the install path by putting this in `.tmux.conf`: + + set-environment -g TMUX_PLUGIN_MANAGER_PATH '/some/other/path/' + +Tmux plugin manager initialization in `.tmux.conf` should also be updated: + + # initializes TMUX plugin manager in a new path + run /some/other/path/tpm/tpm + +Please make sure that the `run` line is at the very bottom of `.tmux.conf`. diff --git a/tmux/.tmux/plugins/tpm/docs/how_to_create_plugin.md b/tmux/.tmux/plugins/tpm/docs/how_to_create_plugin.md new file mode 100644 index 0000000..f7d9c13 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/docs/how_to_create_plugin.md @@ -0,0 +1,108 @@ +# How to create Tmux plugins + +Creating a new plugin is easy. + +For demonstration purposes we'll create a simple plugin that lists all +installed TPM plugins. Yes, a plugin that lists plugins :) We'll bind that to +`prefix + T`. + +The source code for this example plugin can be found +[here](https://github.com/tmux-plugins/tmux-example-plugin). + +### 1. create a new git project + +TPM depends on git for downloading and updating plugins. + +To create a new git project: + + $ mkdir tmux_my_plugin + $ cd tmux_my_plugin + $ git init + +### 2. create a `*.tmux` plugin run file + +When it sources a plugin, TPM executes all `*.tmux` files in your plugins' +directory. That's how plugins are run. + +Create a plugin run file in plugin directory: + + $ touch my_plugin.tmux + $ chmod u+x my_plugin.tmux + +You can have more than one `*.tmux` file, and all will get executed. However, usually +you'll need just one. + +### 3. create a plugin key binding + +We want the behavior of the plugin to trigger when a user hits `prefix + T`. + +Key `T` is chosen because: + - it's "kind of" a mnemonic for `TPM` + - the key is not used by Tmux natively. Tmux man page, KEY BINDINGS section + contains a list of all the bindings Tmux uses. There's plenty of unused keys + and we don't want to override any of Tmux default key bindings. + +Open the plugin run file in your favorite text editor: + + $ vim my_plugin.tmux + # or + $ subl my_plugin.tmux + +Put the following content in the file: + + #!/usr/bin/env bash + + CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + tmux bind-key T run-shell "$CURRENT_DIR/scripts/tmux_list_plugins.sh" + +As you can see, plugin run file is a simple bash script that sets up the binding. + +When pressed, `prefix + T` will execute another shell script: +`tmux_list_plugins.sh`. That script should be in `scripts/` directory - +relative to the plugin run file. + + +### 4. listing plugins + +Now that we have the binding, let's create a script that's invoked with +`prefix + T`. + + $ mkdir scripts + $ touch scripts/tmux_list_plugins.sh + $ chmod u+x scripts/tmux_list_plugins.sh + +And here's the script content: + + #!/usr/bin/env bash + + # fetching the directory where plugins are installed + plugin_path="$(tmux show-env -g TMUX_PLUGIN_MANAGER_PATH | cut -f2 -d=)" + + # listing installed plugins + ls -1 "$plugin_path" + +### 5. try it out + +To see if this works, execute the plugin run file: + + $ ./my_plugin.tmux + +That should set up the key binding. Now hit `prefix + T` and see if it works. + +### 6. publish the plugin + +When everything is ready, push the plugin to an online git repository, +preferably GitHub. + +Other users can install your plugin by just adding plugin git URL to the +`@plugin` list in their `.tmux.conf`. + +If the plugin is on GitHub, your users will be able to use the shorthand of +`github_username/repository`. + +### Conclusion + +Hopefully, that was easy. As you can see, it's mostly shell scripting. + +You can use other scripting languages (ruby, python etc) but plain old shell +is preferred because of portability. diff --git a/tmux/.tmux/plugins/tpm/docs/managing_plugins_via_cmd_line.md b/tmux/.tmux/plugins/tpm/docs/managing_plugins_via_cmd_line.md new file mode 100644 index 0000000..7aefd7d --- /dev/null +++ b/tmux/.tmux/plugins/tpm/docs/managing_plugins_via_cmd_line.md @@ -0,0 +1,36 @@ +# Managing plugins via the command line + +Aside from tmux key bindings, TPM provides shell interface for managing plugins +via scripts located in [bin/](../bin/) directory. + +Tmux does not need to be started in order to run scripts (but it's okay if it +is). If you [changed tpm install dir](../docs/changing_plugins_install_dir.md) +in `.tmux.conf` that should work fine too. + +Prerequisites: + +- tmux installed on the system (doh) +- `.tmux.conf` set up for TPM + +### Installing plugins + +As usual, plugins need to be specified in `.tmux.conf`. Run the following +command to install plugins: + + ~/.tmux/plugins/tpm/bin/install_plugins + +### Updating plugins + +To update all installed plugins: + + ~/.tmux/plugins/tpm/bin/update_plugins all + +or update a single plugin: + + ~/.tmux/plugins/tpm/bin/update_plugins tmux-sensible + +### Removing plugins + +To remove plugins not on the plugin list: + + ~/.tmux/plugins/tpm/bin/clean_plugins diff --git a/tmux/.tmux/plugins/tpm/docs/tpm_not_working.md b/tmux/.tmux/plugins/tpm/docs/tpm_not_working.md new file mode 100644 index 0000000..6680291 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/docs/tpm_not_working.md @@ -0,0 +1,102 @@ +# Help, tpm not working! + +Here's the list of issues users had with `tpm`: + +<hr /> + +> Nothing works. `tpm` key bindings `prefix + I`, `prefix + U` not even + defined. + +Related [issue #22](https://github.com/tmux-plugins/tpm/issues/22) + +- Do you have required `tmux` version to run `tpm`?<br/> + Check `tmux` version with `$ tmux -V` command and make sure it's higher or + equal to the required version for `tpm` as stated in the readme. + +- ZSH tmux plugin might be causing issues.<br/> + If you have it installed, try disabling it and see if `tpm` works then. + +<hr /> + +> Help, I'm using custom config file with `tmux -f /path/to/my_tmux.conf` +to start Tmux and for some reason plugins aren't loaded!? + +Related [issue #57](https://github.com/tmux-plugins/tpm/issues/57) + +`tpm` has a known issue when using custom config file with `-f` option. +The solution is to use alternative plugin definition syntax. Here are the steps +to make it work: + +1. remove all `set -g @plugin` lines from tmux config file +2. in the config file define the plugins in the following way: + + # List of plugins + set -g @tpm_plugins ' \ + tmux-plugins/tpm \ + tmux-plugins/tmux-sensible \ + tmux-plugins/tmux-resurrect \ + ' + + # Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf) + run '~/.tmux/plugins/tpm/tpm' + +3. Reload TMUX environment so TPM is sourced: `$ tmux source /path/to/my_tmux.conf` + +The plugins should now be working. + +<hr /> + +> Weird sequence of characters show up when installing or updating plugins + +Related: [issue #25](https://github.com/tmux-plugins/tpm/issues/25) + +- This could be caused by [tmuxline.vim](https://github.com/edkolev/tmuxline.vim) + plugin. Uninstall it and see if things work. + +<hr /> + +> "failed to connect to server" error when sourcing .tmux.conf + +Related: [issue #48](https://github.com/tmux-plugins/tpm/issues/48) + +- Make sure `tmux source ~/.tmux.conf` command is ran from inside `tmux`. + +<hr /> + +> tpm not working: '~/.tmux/plugins/tpm/tpm' returned 2 (Windows / Cygwin) + +Related: [issue #81](https://github.com/tmux-plugins/tpm/issues/81) + +This issue is most likely caused by Windows line endings. For example, if you +have git's `core.autocrlf` option set to `true`, git will automatically convert +all the files to Windows line endings which might cause a problem. + +The solution is to convert all line ending to Unix newline characters. This +command handles that for all files under `.tmux/` dir (skips `.git` +subdirectories): + +```bash +find ~/.tmux -type d -name '.git*' -prune -o -type f -print0 | xargs -0 dos2unix +``` + +<hr /> + +> '~/.tmux/plugins/tpm/tpm' returned 127 (on macOS, w/ tmux installed using brew) + +Related: [issue #67](https://github.com/tmux-plugins/tpm/issues/67) + +This problem is because tmux's `run-shell` command runs a shell which doesn't read from user configs, thus tmux installed in a brew prefix (e.g. `/usr/local/bin`) will not be found. + +The solution is to find your brew prefix + +```sh +> echo "$(brew --prefix)/bin" +/opt/homebrew/bin +``` + +And prepend it to the `PATH` environment variable +``` +set-environment -g PATH "/opt/homebrew/bin:/bin:/usr/bin" +``` + +before any `run-shell`/`run` commands in `~/.tmux.conf`. diff --git a/tmux/.tmux/plugins/tpm/scripts/check_tmux_version.sh b/tmux/.tmux/plugins/tpm/scripts/check_tmux_version.sh new file mode 100755 index 0000000..b0aedec --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/check_tmux_version.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash + +VERSION="$1" +UNSUPPORTED_MSG="$2" + +get_tmux_option() { + local option=$1 + local default_value=$2 + local option_value=$(tmux show-option -gqv "$option") + if [ -z "$option_value" ]; then + echo "$default_value" + else + echo "$option_value" + fi +} + +# Ensures a message is displayed for 5 seconds in tmux prompt. +# Does not override the 'display-time' tmux option. +display_message() { + local message="$1" + + # display_duration defaults to 5 seconds, if not passed as an argument + if [ "$#" -eq 2 ]; then + local display_duration="$2" + else + local display_duration="5000" + fi + + # saves user-set 'display-time' option + local saved_display_time=$(get_tmux_option "display-time" "750") + + # sets message display time to 5 seconds + tmux set-option -gq display-time "$display_duration" + + # displays message + tmux display-message "$message" + + # restores original 'display-time' value + tmux set-option -gq display-time "$saved_display_time" +} + +# this is used to get "clean" integer version number. Examples: +# `tmux 1.9` => `19` +# `1.9a` => `19` +get_digits_from_string() { + local string="$1" + local only_digits="$(echo "$string" | tr -dC '[:digit:]')" + echo "$only_digits" +} + +tmux_version_int() { + local tmux_version_string=$(tmux -V) + echo "$(get_digits_from_string "$tmux_version_string")" +} + +unsupported_version_message() { + if [ -n "$UNSUPPORTED_MSG" ]; then + echo "$UNSUPPORTED_MSG" + else + echo "Error, Tmux version unsupported! Please install Tmux version $VERSION or greater!" + fi +} + +exit_if_unsupported_version() { + local current_version="$1" + local supported_version="$2" + if [ "$current_version" -lt "$supported_version" ]; then + display_message "$(unsupported_version_message)" + exit 1 + fi +} + +main() { + local supported_version_int="$(get_digits_from_string "$VERSION")" + local current_version_int="$(tmux_version_int)" + exit_if_unsupported_version "$current_version_int" "$supported_version_int" +} +main diff --git a/tmux/.tmux/plugins/tpm/scripts/clean_plugins.sh b/tmux/.tmux/plugins/tpm/scripts/clean_plugins.sh new file mode 100755 index 0000000..a025524 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/clean_plugins.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +HELPERS_DIR="$CURRENT_DIR/helpers" + +source "$HELPERS_DIR/plugin_functions.sh" +source "$HELPERS_DIR/utility.sh" + +if [ "$1" == "--tmux-echo" ]; then # tmux-specific echo functions + source "$HELPERS_DIR/tmux_echo_functions.sh" +else # shell output functions + source "$HELPERS_DIR/shell_echo_functions.sh" +fi + +clean_plugins() { + local plugins plugin plugin_directory + plugins="$(tpm_plugins_list_helper)" + + for plugin_directory in "$(tpm_path)"/*; do + [ -d "${plugin_directory}" ] || continue + plugin="$(plugin_name_helper "${plugin_directory}")" + case "${plugins}" in + *"${plugin}"*) : ;; + *) + [ "${plugin}" = "tpm" ] && continue + echo_ok "Removing \"$plugin\"" + rm -rf "${plugin_directory}" >/dev/null 2>&1 + [ -d "${plugin_directory}" ] && + echo_err " \"$plugin\" clean fail" || + echo_ok " \"$plugin\" clean success" + ;; + esac + done +} + +main() { + ensure_tpm_path_exists + clean_plugins + exit_value_helper +} +main diff --git a/tmux/.tmux/plugins/tpm/scripts/helpers/plugin_functions.sh b/tmux/.tmux/plugins/tpm/scripts/helpers/plugin_functions.sh new file mode 100644 index 0000000..f33d215 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/helpers/plugin_functions.sh @@ -0,0 +1,104 @@ +# using @tpm_plugins is now deprecated in favor of using @plugin syntax +tpm_plugins_variable_name="@tpm_plugins" + +# manually expanding tilde char or `$HOME` variable. +_manual_expansion() { + local path="$1" + local expanded_tilde="${path/#\~/$HOME}" + echo "${expanded_tilde/#\$HOME/$HOME}" +} + +_tpm_path() { + local string_path="$(tmux start-server\; show-environment -g TMUX_PLUGIN_MANAGER_PATH | cut -f2 -d=)/" + _manual_expansion "$string_path" +} + +_CACHED_TPM_PATH="$(_tpm_path)" + +# Get the absolute path to the users configuration file of TMux. +# This includes a prioritized search on different locations. +# +_get_user_tmux_conf() { + # Define the different possible locations. + xdg_location="${XDG_CONFIG_HOME:-$HOME/.config}/tmux/tmux.conf" + default_location="$HOME/.tmux.conf" + + # Search for the correct configuration file by priority. + if [ -f "$xdg_location" ]; then + echo "$xdg_location" + + else + echo "$default_location" + fi +} + +_tmux_conf_contents() { + user_config=$(_get_user_tmux_conf) + cat /etc/tmux.conf "$user_config" 2>/dev/null + if [ "$1" == "full" ]; then # also output content from sourced files + local file + for file in $(_sourced_files); do + cat $(_manual_expansion "$file") 2>/dev/null + done + fi +} + +# return files sourced from tmux config files +_sourced_files() { + _tmux_conf_contents | + sed -E -n -e "s/^[[:space:]]*source(-file)?[[:space:]]+(-q+[[:space:]]+)?['\"]?([^'\"]+)['\"]?/\3/p" +} + +# Want to be able to abort in certain cases +trap "exit 1" TERM +export TOP_PID=$$ + +_fatal_error_abort() { + echo >&2 "Aborting." + kill -s TERM $TOP_PID +} + +# PUBLIC FUNCTIONS BELOW + +tpm_path() { + if [ "$_CACHED_TPM_PATH" == "/" ]; then + echo >&2 "FATAL: Tmux Plugin Manager not configured in tmux.conf" + _fatal_error_abort + fi + echo "$_CACHED_TPM_PATH" +} + +tpm_plugins_list_helper() { + # lists plugins from @tpm_plugins option + echo "$(tmux start-server\; show-option -gqv "$tpm_plugins_variable_name")" + + # read set -g @plugin "tmux-plugins/tmux-example-plugin" entries + _tmux_conf_contents "full" | + awk '/^[ \t]*set(-option)? +-g +@plugin/ { gsub(/'\''/,""); gsub(/'\"'/,""); print $4 }' +} + +# Allowed plugin name formats: +# 1. "git://github.com/user/plugin_name.git" +# 2. "user/plugin_name" +plugin_name_helper() { + local plugin="$1" + # get only the part after the last slash, e.g. "plugin_name.git" + local plugin_basename="$(basename "$plugin")" + # remove ".git" extension (if it exists) to get only "plugin_name" + local plugin_name="${plugin_basename%.git}" + echo "$plugin_name" +} + +plugin_path_helper() { + local plugin="$1" + local plugin_name="$(plugin_name_helper "$plugin")" + echo "$(tpm_path)${plugin_name}/" +} + +plugin_already_installed() { + local plugin="$1" + local plugin_path="$(plugin_path_helper "$plugin")" + [ -d "$plugin_path" ] && + cd "$plugin_path" && + git remote >/dev/null 2>&1 +} diff --git a/tmux/.tmux/plugins/tpm/scripts/helpers/shell_echo_functions.sh b/tmux/.tmux/plugins/tpm/scripts/helpers/shell_echo_functions.sh new file mode 100644 index 0000000..ecaa37e --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/helpers/shell_echo_functions.sh @@ -0,0 +1,7 @@ +echo_ok() { + echo "$*" +} + +echo_err() { + fail_helper "$*" +} diff --git a/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_echo_functions.sh b/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_echo_functions.sh new file mode 100644 index 0000000..7a6ef0a --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_echo_functions.sh @@ -0,0 +1,28 @@ +_has_emacs_mode_keys() { + $(tmux show -gw mode-keys | grep -q emacs) +} + +tmux_echo() { + local message="$1" + tmux run-shell "echo '$message'" +} + +echo_ok() { + tmux_echo "$*" +} + +echo_err() { + tmux_echo "$*" +} + +end_message() { + if _has_emacs_mode_keys; then + local continue_key="ESCAPE" + else + local continue_key="ENTER" + fi + tmux_echo "" + tmux_echo "TMUX environment reloaded." + tmux_echo "" + tmux_echo "Done, press $continue_key to continue." +} diff --git a/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_utils.sh b/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_utils.sh new file mode 100644 index 0000000..238952d --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_utils.sh @@ -0,0 +1,6 @@ +HELPERS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +source "$HELPERS_DIR/plugin_functions.sh" + +reload_tmux_environment() { + tmux source-file $(_get_user_tmux_conf) >/dev/null 2>&1 +} diff --git a/tmux/.tmux/plugins/tpm/scripts/helpers/utility.sh b/tmux/.tmux/plugins/tpm/scripts/helpers/utility.sh new file mode 100644 index 0000000..de6eb35 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/helpers/utility.sh @@ -0,0 +1,17 @@ +ensure_tpm_path_exists() { + mkdir -p "$(tpm_path)" +} + +fail_helper() { + local message="$1" + echo "$message" >&2 + FAIL="true" +} + +exit_value_helper() { + if [ "$FAIL" == "true" ]; then + exit 1 + else + exit 0 + fi +} diff --git a/tmux/.tmux/plugins/tpm/scripts/install_plugins.sh b/tmux/.tmux/plugins/tpm/scripts/install_plugins.sh new file mode 100755 index 0000000..e2450ac --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/install_plugins.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +HELPERS_DIR="$CURRENT_DIR/helpers" + +source "$HELPERS_DIR/plugin_functions.sh" +source "$HELPERS_DIR/utility.sh" + +if [ "$1" == "--tmux-echo" ]; then # tmux-specific echo functions + source "$HELPERS_DIR/tmux_echo_functions.sh" +else # shell output functions + source "$HELPERS_DIR/shell_echo_functions.sh" +fi + +clone() { + local plugin="$1" + local branch="$2" + if [ -n "$branch" ]; then + cd "$(tpm_path)" && + GIT_TERMINAL_PROMPT=0 git clone -b "$branch" --single-branch --recursive "$plugin" >/dev/null 2>&1 + else + cd "$(tpm_path)" && + GIT_TERMINAL_PROMPT=0 git clone --single-branch --recursive "$plugin" >/dev/null 2>&1 + fi +} + +# tries cloning: +# 1. plugin name directly - works if it's a valid git url +# 2. expands the plugin name to point to a GitHub repo and tries cloning again +clone_plugin() { + local plugin="$1" + local branch="$2" + clone "$plugin" "$branch" || + clone "https://git::@github.com/$plugin" "$branch" +} + +# clone plugin and produce output +install_plugin() { + local plugin="$1" + local branch="$2" + local plugin_name="$(plugin_name_helper "$plugin")" + + if plugin_already_installed "$plugin"; then + echo_ok "Already installed \"$plugin_name\"" + else + echo_ok "Installing \"$plugin_name\"" + clone_plugin "$plugin" "$branch" && + echo_ok " \"$plugin_name\" download success" || + echo_err " \"$plugin_name\" download fail" + fi +} + +install_plugins() { + local plugins="$(tpm_plugins_list_helper)" + for plugin in $plugins; do + IFS='#' read -ra plugin <<< "$plugin" + install_plugin "${plugin[0]}" "${plugin[1]}" + done +} + +verify_tpm_path_permissions() { + local path="$(tpm_path)" + # check the write permission flag for all users to ensure + # that we have proper access + [ -w "$path" ] || + echo_err "$path is not writable!" +} + +main() { + ensure_tpm_path_exists + verify_tpm_path_permissions + install_plugins + exit_value_helper +} +main diff --git a/tmux/.tmux/plugins/tpm/scripts/source_plugins.sh b/tmux/.tmux/plugins/tpm/scripts/source_plugins.sh new file mode 100755 index 0000000..6381d54 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/source_plugins.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +HELPERS_DIR="$CURRENT_DIR/helpers" + +source "$HELPERS_DIR/plugin_functions.sh" + +plugin_dir_exists() { + [ -d "$1" ] +} + +# Runs all *.tmux files from the plugin directory. +# Files are ran as executables. +# No errors if the plugin dir does not exist. +silently_source_all_tmux_files() { + local plugin_path="$1" + local plugin_tmux_files="$plugin_path*.tmux" + if plugin_dir_exists "$plugin_path"; then + for tmux_file in $plugin_tmux_files; do + # if the glob didn't find any files this will be the + # unexpanded glob which obviously doesn't exist + [ -f "$tmux_file" ] || continue + # runs *.tmux file as an executable + $tmux_file >/dev/null 2>&1 + done + fi +} + +source_plugins() { + local plugin plugin_path + local plugins="$(tpm_plugins_list_helper)" + for plugin in $plugins; do + IFS='#' read -ra plugin <<< "$plugin" + plugin_path="$(plugin_path_helper "${plugin[0]}")" + silently_source_all_tmux_files "$plugin_path" + done +} + +main() { + source_plugins +} +main diff --git a/tmux/.tmux/plugins/tpm/scripts/update_plugin.sh b/tmux/.tmux/plugins/tpm/scripts/update_plugin.sh new file mode 100755 index 0000000..e533664 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/update_plugin.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash + +# this script handles core logic of updating plugins + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +HELPERS_DIR="$CURRENT_DIR/helpers" + +source "$HELPERS_DIR/plugin_functions.sh" +source "$HELPERS_DIR/utility.sh" + +if [ "$1" == "--tmux-echo" ]; then # tmux-specific echo functions + source "$HELPERS_DIR/tmux_echo_functions.sh" +else # shell output functions + source "$HELPERS_DIR/shell_echo_functions.sh" +fi + +# from now on ignore first script argument +shift + +pull_changes() { + local plugin="$1" + local plugin_path="$(plugin_path_helper "$plugin")" + cd "$plugin_path" && + GIT_TERMINAL_PROMPT=0 git pull && + GIT_TERMINAL_PROMPT=0 git submodule update --init --recursive +} + +update() { + local plugin="$1" output + output=$(pull_changes "$plugin" 2>&1) + if (( $? == 0 )); then + echo_ok " \"$plugin\" update success" + echo_ok "$(echo "$output" | sed -e 's/^/ | /')" + else + echo_err " \"$plugin\" update fail" + echo_err "$(echo "$output" | sed -e 's/^/ | /')" + fi +} + +update_all() { + echo_ok "Updating all plugins!" + echo_ok "" + local plugins="$(tpm_plugins_list_helper)" + for plugin in $plugins; do + IFS='#' read -ra plugin <<< "$plugin" + local plugin_name="$(plugin_name_helper "${plugin[0]}")" + # updating only installed plugins + if plugin_already_installed "$plugin_name"; then + update "$plugin_name" & + fi + done + wait +} + +update_plugins() { + local plugins="$*" + for plugin in $plugins; do + IFS='#' read -ra plugin <<< "$plugin" + local plugin_name="$(plugin_name_helper "${plugin[0]}")" + if plugin_already_installed "$plugin_name"; then + update "$plugin_name" & + else + echo_err "$plugin_name not installed!" & + fi + done + wait +} + +main() { + ensure_tpm_path_exists + if [ "$1" == "all" ]; then + update_all + else + update_plugins "$*" + fi + exit_value_helper +} +main "$*" diff --git a/tmux/.tmux/plugins/tpm/scripts/update_plugin_prompt_handler.sh b/tmux/.tmux/plugins/tpm/scripts/update_plugin_prompt_handler.sh new file mode 100755 index 0000000..5e1f7d9 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/update_plugin_prompt_handler.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +HELPERS_DIR="$CURRENT_DIR/helpers" + +if [ $# -eq 0 ]; then + exit 0 +fi + +source "$HELPERS_DIR/tmux_echo_functions.sh" +source "$HELPERS_DIR/tmux_utils.sh" + +main() { + "$CURRENT_DIR/update_plugin.sh" --tmux-echo "$*" + reload_tmux_environment + end_message +} +main "$*" diff --git a/tmux/.tmux/plugins/tpm/scripts/variables.sh b/tmux/.tmux/plugins/tpm/scripts/variables.sh new file mode 100644 index 0000000..5601a86 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/scripts/variables.sh @@ -0,0 +1,13 @@ +install_key_option="@tpm-install" +default_install_key="I" + +update_key_option="@tpm-update" +default_update_key="U" + +clean_key_option="@tpm-clean" +default_clean_key="M-u" + +SUPPORTED_TMUX_VERSION="1.9" + +DEFAULT_TPM_ENV_VAR_NAME="TMUX_PLUGIN_MANAGER_PATH" +DEFAULT_TPM_PATH="$HOME/.tmux/plugins/" diff --git a/tmux/.tmux/plugins/tpm/tests/expect_failed_plugin_download b/tmux/.tmux/plugins/tpm/tests/expect_failed_plugin_download new file mode 100755 index 0000000..b970477 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/expect_failed_plugin_download @@ -0,0 +1,36 @@ +#!/usr/bin/env expect + +# disables script output +log_user 0 + +spawn tmux + +# Waiting for tmux to attach. If this is not done, next command, `send` will +# not work properly. +sleep 1 + +# this is tmux prefix + I +send "I" + +# cloning might take a while +set timeout 20 + +expect_after { + timeout { exit 1 } +} + +expect { + "Installing \"non-existing-plugin\"" +} + +expect { + "\"non-existing-plugin\" download fail" +} + +expect { + "Done, press ENTER to continue" { + exit 0 + } +} + +exit 1 diff --git a/tmux/.tmux/plugins/tpm/tests/expect_successful_clean_plugins b/tmux/.tmux/plugins/tpm/tests/expect_successful_clean_plugins new file mode 100755 index 0000000..987c49d --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/expect_successful_clean_plugins @@ -0,0 +1,35 @@ +#!/usr/bin/env expect + +# disables script output +log_user 0 + +spawn tmux + +# Waiting for tmux to attach. If this is not done, next command, `send` will +# not work properly. +sleep 1 + +# this is tmux prefix + alt + u +send "u" + +set timeout 5 + +expect_after { + timeout { exit 1 } +} + +expect { + "Removing \"tmux-example-plugin\"" +} + +expect { + "\"tmux-example-plugin\" clean success" +} + +expect { + "Done, press ENTER to continue." { + exit 0 + } +} + +exit 1 diff --git a/tmux/.tmux/plugins/tpm/tests/expect_successful_multiple_plugins_download b/tmux/.tmux/plugins/tpm/tests/expect_successful_multiple_plugins_download new file mode 100755 index 0000000..cc87a26 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/expect_successful_multiple_plugins_download @@ -0,0 +1,44 @@ +#!/usr/bin/env expect + +# disables script output +log_user 0 + +spawn tmux + +# Waiting for tmux to attach. If this is not done, next command, `send` will +# not work properly. +sleep 1 + +# this is tmux prefix + I +send "I" + +# cloning might take a while +set timeout 15 + +expect_after { + timeout { exit 1 } +} + +expect { + "Installing \"tmux-example-plugin\"" +} + +expect { + "\"tmux-example-plugin\" download success" +} + +expect { + "Installing \"tmux-copycat\"" +} + +expect { + "\"tmux-copycat\" download success" +} + +expect { + "Done, press ENTER to continue." { + exit 0 + } +} + +exit 1 diff --git a/tmux/.tmux/plugins/tpm/tests/expect_successful_plugin_download b/tmux/.tmux/plugins/tpm/tests/expect_successful_plugin_download new file mode 100755 index 0000000..388f05d --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/expect_successful_plugin_download @@ -0,0 +1,50 @@ +#!/usr/bin/env expect + +# disables script output +log_user 0 + +spawn tmux + +# Waiting for tmux to attach. If this is not done, next command, `send` will +# not work properly. +sleep 1 + +# this is tmux prefix + I +send "I" + +# cloning might take a while +set timeout 15 + +expect_after { + timeout { exit 1 } +} + +expect { + "Installing \"tmux-example-plugin\"" +} + +expect { + "\"tmux-example-plugin\" download success" +} + +expect { + "Done, press ENTER to continue" { + send "
" + } +} + +sleep 1 +# this is tmux prefix + I +send "I" + +expect { + "Already installed \"tmux-example-plugin\"" +} + +expect { + "Done, press ENTER to continue" { + exit 0 + } +} + +exit 1 diff --git a/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_a_single_plugin b/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_a_single_plugin new file mode 100755 index 0000000..bcd64fe --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_a_single_plugin @@ -0,0 +1,55 @@ +#!/usr/bin/env expect + +# disables script output +log_user 0 + +spawn tmux + +# Waiting for tmux to attach. If this is not done, next command, `send` will +# not work properly. +sleep 1 + +# this is tmux prefix + U +send "U" + +set timeout 15 + +expect_after { + timeout { exit 1 } +} + +expect { + "Installed plugins" +} + +expect { + "tmux-example-plugin" +} + +expect { + "\"all\" - updates all plugins" +} + +expect { + "ENTER - cancels" +} + +# wait for tmux to display prompt before sending characters +sleep 1 +send "tmux-example-plugin\r" + +expect { + "Updating \"tmux-example-plugin\"" +} + +expect { + "\"tmux-example-plugin\" update success" +} + +expect { + "Done, press ENTER to continue." { + exit 0 + } +} + +exit 1 diff --git a/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_all_plugins b/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_all_plugins new file mode 100755 index 0000000..4f3a4a3 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_all_plugins @@ -0,0 +1,59 @@ +#!/usr/bin/env expect + +# disables script output +log_user 0 + +spawn tmux + +# Waiting for tmux to attach. If this is not done, next command, `send` will +# not work properly. +sleep 1 + +# this is tmux prefix + U +send "U" + +set timeout 5 + +expect_after { + timeout { exit 1 } +} + +expect { + "Installed plugins" +} + +expect { + "tmux-example-plugin" +} + +expect { + "\"all\" - updates all plugins" +} + +expect { + "ENTER - cancels" +} + +# wait for tmux to display prompt before sending characters +sleep 1 +send "all\r" + +expect { + "Updating all plugins!" +} + +expect { + "Updating \"tmux-example-plugin\"" +} + +expect { + "\"tmux-example-plugin\" update success" +} + +expect { + "Done, press ENTER to continue." { + exit 0 + } +} + +exit 1 diff --git a/tmux/.tmux/plugins/tpm/tests/helpers/tpm.sh b/tmux/.tmux/plugins/tpm/tests/helpers/tpm.sh new file mode 100644 index 0000000..1594afb --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/helpers/tpm.sh @@ -0,0 +1,13 @@ +check_dir_exists_helper() { + [ -d "$1" ] +} + +# runs the scripts and asserts it has the correct output and exit code +script_run_helper() { + local script="$1" + local expected_output="$2" + local expected_exit_code="${3:-0}" + $script 2>&1 | + grep "$expected_output" >/dev/null 2>&1 && # grep -q flag quits the script early + [ "${PIPESTATUS[0]}" -eq "$expected_exit_code" ] +} diff --git a/tmux/.tmux/plugins/tpm/tests/test_plugin_clean.sh b/tmux/.tmux/plugins/tpm/tests/test_plugin_clean.sh new file mode 100755 index 0000000..d36c468 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/test_plugin_clean.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +TPM_DIR="$PWD" +PLUGINS_DIR="$HOME/.tmux/plugins" + +source "$CURRENT_DIR/helpers/helpers.sh" +source "$CURRENT_DIR/helpers/tpm.sh" + +manually_install_the_plugin() { + rm -rf "$PLUGINS_DIR" + mkdir -p "$PLUGINS_DIR" + cd "$PLUGINS_DIR" + git clone --quiet https://github.com/tmux-plugins/tmux-example-plugin +} + +# TMUX KEY-BINDING TESTS + +test_plugin_uninstallation_via_tmux_key_binding() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + run-shell "$TPM_DIR/tpm" + HERE + + manually_install_the_plugin + + "$CURRENT_DIR/expect_successful_clean_plugins" || + fail_helper "[key-binding] clean fails" + + teardown_helper +} + +# SCRIPT TESTS + +test_plugin_uninstallation_via_script() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + run-shell "$TPM_DIR/tpm" + HERE + + manually_install_the_plugin + + script_run_helper "$TPM_DIR/bin/clean_plugins" '"tmux-example-plugin" clean success' || + fail_helper "[script] plugin cleaning fails" + + teardown_helper +} + +test_unsuccessful_plugin_uninstallation_via_script() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + run-shell "$TPM_DIR/tpm" + HERE + + manually_install_the_plugin + chmod 000 "$PLUGINS_DIR/tmux-example-plugin" # disable directory deletion + + local expected_exit_code=1 + script_run_helper "$TPM_DIR/bin/clean_plugins" '"tmux-example-plugin" clean fail' "$expected_exit_code" || + fail_helper "[script] unsuccessful plugin cleaning doesn't fail" + + chmod 755 "$PLUGINS_DIR/tmux-example-plugin" # enable directory deletion + + teardown_helper +} + +run_tests diff --git a/tmux/.tmux/plugins/tpm/tests/test_plugin_installation.sh b/tmux/.tmux/plugins/tpm/tests/test_plugin_installation.sh new file mode 100755 index 0000000..94fb674 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/test_plugin_installation.sh @@ -0,0 +1,284 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +PLUGINS_DIR="$HOME/.tmux/plugins" +TPM_DIR="$PWD" + +CUSTOM_PLUGINS_DIR="$HOME/foo/plugins" +ADDITIONAL_CONFIG_FILE_1="$HOME/.tmux/additional_config_file_1" +ADDITIONAL_CONFIG_FILE_2="$HOME/.tmux/additional_config_file_2" + +source "$CURRENT_DIR/helpers/helpers.sh" +source "$CURRENT_DIR/helpers/tpm.sh" + +# TMUX KEY-BINDING TESTS + +test_plugin_installation_via_tmux_key_binding() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @plugin "tmux-plugins/tmux-example-plugin" + run-shell "$TPM_DIR/tpm" + HERE + + "$CURRENT_DIR/expect_successful_plugin_download" || + fail_helper "[key-binding] plugin installation fails" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[key-binding] plugin download fails" + + teardown_helper +} + +test_plugin_installation_via_tmux_key_binding_set_option() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set-option -g @plugin "tmux-plugins/tmux-example-plugin" + run-shell "$TPM_DIR/tpm" + HERE + + "$CURRENT_DIR/expect_successful_plugin_download" || + fail_helper "[key-binding][set-option] plugin installation fails" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[key-binding][set-option] plugin download fails" + + teardown_helper +} + +test_plugin_installation_custom_dir_via_tmux_key_binding() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set-environment -g TMUX_PLUGIN_MANAGER_PATH '$CUSTOM_PLUGINS_DIR' + + set -g @plugin "tmux-plugins/tmux-example-plugin" + run-shell "$TPM_DIR/tpm" + HERE + + "$CURRENT_DIR/expect_successful_plugin_download" || + fail_helper "[key-binding][custom dir] plugin installation fails" + + check_dir_exists_helper "$CUSTOM_PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[key-binding][custom dir] plugin download fails" + + teardown_helper + rm -rf "$CUSTOM_PLUGINS_DIR" +} + +test_non_existing_plugin_installation_via_tmux_key_binding() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @plugin "tmux-plugins/non-existing-plugin" + run-shell "$TPM_DIR/tpm" + HERE + + "$CURRENT_DIR/expect_failed_plugin_download" || + fail_helper "[key-binding] non existing plugin installation doesn't fail" + + teardown_helper +} + +test_multiple_plugins_installation_via_tmux_key_binding() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @plugin "tmux-plugins/tmux-example-plugin" + \ \ set -g @plugin 'tmux-plugins/tmux-copycat' + run-shell "$TPM_DIR/tpm" + HERE + + "$CURRENT_DIR/expect_successful_multiple_plugins_download" || + fail_helper "[key-binding] multiple plugins installation fails" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[key-binding] plugin download fails (tmux-example-plugin)" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" || + fail_helper "[key-binding] plugin download fails (tmux-copycat)" + + teardown_helper +} + +test_plugins_installation_from_sourced_file_via_tmux_key_binding() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + source '$ADDITIONAL_CONFIG_FILE_1' + set -g @plugin 'tmux-plugins/tmux-example-plugin' + run-shell "$TPM_DIR/tpm" + HERE + + mkdir ~/.tmux + echo "set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_1" + + "$CURRENT_DIR/expect_successful_multiple_plugins_download" || + fail_helper "[key-binding][sourced file] plugins installation fails" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[key-binding][sourced file] plugin download fails (tmux-example-plugin)" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" || + fail_helper "[key-binding][sourced file] plugin download fails (tmux-copycat)" + + teardown_helper +} + +test_plugins_installation_from_multiple_sourced_files_via_tmux_key_binding() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + \ \ source '$ADDITIONAL_CONFIG_FILE_1' + source-file '$ADDITIONAL_CONFIG_FILE_2' + run-shell "$TPM_DIR/tpm" + HERE + + mkdir ~/.tmux + echo "set -g @plugin 'tmux-plugins/tmux-example-plugin'" > "$ADDITIONAL_CONFIG_FILE_1" + echo " set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_2" + + "$CURRENT_DIR/expect_successful_multiple_plugins_download" || + fail_helper "[key-binding][multiple sourced files] plugins installation fails" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[key-binding][multiple sourced files] plugin download fails (tmux-example-plugin)" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" || + fail_helper "[key-binding][multiple sourced files] plugin download fails (tmux-copycat)" + + teardown_helper +} + +# SCRIPT TESTS + +test_plugin_installation_via_script() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @plugin "tmux-plugins/tmux-example-plugin" + run-shell "$TPM_DIR/tpm" + HERE + + script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' || + fail_helper "[script] plugin installation fails" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[script] plugin download fails" + + script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-example-plugin"' || + fail_helper "[script] plugin already installed message fail" + + teardown_helper +} + +test_plugin_installation_custom_dir_via_script() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set-environment -g TMUX_PLUGIN_MANAGER_PATH '$CUSTOM_PLUGINS_DIR' + + set -g @plugin "tmux-plugins/tmux-example-plugin" + run-shell "$TPM_DIR/tpm" + HERE + + script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' || + fail_helper "[script][custom dir] plugin installation fails" + + check_dir_exists_helper "$CUSTOM_PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[script][custom dir] plugin download fails" + + script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-example-plugin"' || + fail_helper "[script][custom dir] plugin already installed message fail" + + teardown_helper + rm -rf "$CUSTOM_PLUGINS_DIR" +} + +test_non_existing_plugin_installation_via_script() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @plugin "tmux-plugins/non-existing-plugin" + run-shell "$TPM_DIR/tpm" + HERE + + local expected_exit_code=1 + script_run_helper "$TPM_DIR/bin/install_plugins" '"non-existing-plugin" download fail' "$expected_exit_code" || + fail_helper "[script] non existing plugin installation doesn't fail" + + teardown_helper +} + +test_multiple_plugins_installation_via_script() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @plugin "tmux-plugins/tmux-example-plugin" + \ \ set -g @plugin 'tmux-plugins/tmux-copycat' + run-shell "$TPM_DIR/tpm" + HERE + + script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' || + fail_helper "[script] multiple plugins installation fails" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[script] plugin download fails (tmux-example-plugin)" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" || + fail_helper "[script] plugin download fails (tmux-copycat)" + + script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-copycat"' || + fail_helper "[script] multiple plugins already installed message fail" + + teardown_helper +} + +test_plugins_installation_from_sourced_file_via_script() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + source '$ADDITIONAL_CONFIG_FILE_1' + set -g @plugin 'tmux-plugins/tmux-example-plugin' + run-shell "$TPM_DIR/tpm" + HERE + + mkdir ~/.tmux + echo "set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_1" + + script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-copycat" download success' || + fail_helper "[script][sourced file] plugins installation fails" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[script][sourced file] plugin download fails (tmux-example-plugin)" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" || + fail_helper "[script][sourced file] plugin download fails (tmux-copycat)" + + script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-copycat"' || + fail_helper "[script][sourced file] plugins already installed message fail" + + teardown_helper +} + +test_plugins_installation_from_multiple_sourced_files_via_script() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + \ \ source '$ADDITIONAL_CONFIG_FILE_1' + source-file '$ADDITIONAL_CONFIG_FILE_2' + set -g @plugin 'tmux-plugins/tmux-example-plugin' + run-shell "$TPM_DIR/tpm" + HERE + + mkdir ~/.tmux + echo " set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_1" + echo "set -g @plugin 'tmux-plugins/tmux-sensible'" > "$ADDITIONAL_CONFIG_FILE_2" + + script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-sensible" download success' || + fail_helper "[script][multiple sourced files] plugins installation fails" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[script][multiple sourced files] plugin download fails (tmux-example-plugin)" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" || + fail_helper "[script][multiple sourced files] plugin download fails (tmux-copycat)" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-sensible/" || + fail_helper "[script][multiple sourced files] plugin download fails (tmux-sensible)" + + script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-sensible"' || + fail_helper "[script][multiple sourced files] plugins already installed message fail" + + teardown_helper +} + +run_tests diff --git a/tmux/.tmux/plugins/tpm/tests/test_plugin_installation_legacy.sh b/tmux/.tmux/plugins/tpm/tests/test_plugin_installation_legacy.sh new file mode 100755 index 0000000..b1d0cf6 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/test_plugin_installation_legacy.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +PLUGINS_DIR="$HOME/.tmux/plugins" +TPM_DIR="$PWD" + +source "$CURRENT_DIR/helpers/helpers.sh" +source "$CURRENT_DIR/helpers/tpm.sh" + +# TMUX KEY-BINDING TESTS + +test_plugin_installation_via_tmux_key_binding() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @tpm_plugins "tmux-plugins/tmux-example-plugin" + run-shell "$TPM_DIR/tpm" + HERE + + # opens tmux and test it with `expect` + $CURRENT_DIR/expect_successful_plugin_download || + fail_helper "[key-binding] plugin installation fails" + + # check plugin dir exists after download + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[key-binding] plugin download fails" + + teardown_helper +} + +test_legacy_and_new_syntax_for_plugin_installation_work_via_tmux_key_binding() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @tpm_plugins " \ + tmux-plugins/tmux-example-plugin \ + " + set -g @plugin 'tmux-plugins/tmux-copycat' + run-shell "$TPM_DIR/tpm" + HERE + + # opens tmux and test it with `expect` + "$CURRENT_DIR"/expect_successful_multiple_plugins_download || + fail_helper "[key-binding] multiple plugins installation fails" + + # check plugin dir exists after download + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[key-binding] plugin download fails (tmux-example-plugin)" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" || + fail_helper "[key-binding] plugin download fails (tmux-copycat)" + + teardown_helper +} + +# SCRIPT TESTS + +test_plugin_installation_via_script() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @tpm_plugins "tmux-plugins/tmux-example-plugin" + run-shell "$TPM_DIR/tpm" + HERE + + script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' || + fail_helper "[script] plugin installation fails" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[script] plugin download fails" + + script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-example-plugin"' || + fail_helper "[script] plugin already installed message fail" + + teardown_helper +} + +test_legacy_and_new_syntax_for_plugin_installation_work_via_script() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @tpm_plugins " \ + tmux-plugins/tmux-example-plugin \ + " + set -g @plugin 'tmux-plugins/tmux-copycat' + run-shell "$TPM_DIR/tpm" + HERE + + script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' || + fail_helper "[script] multiple plugin installation fails" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" || + fail_helper "[script] plugin download fails (tmux-example-plugin)" + + check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" || + fail_helper "[script] plugin download fails (tmux-copycat)" + + script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-copycat"' || + fail_helper "[script] multiple plugins already installed message fail" + + teardown_helper +} + +run_tests diff --git a/tmux/.tmux/plugins/tpm/tests/test_plugin_sourcing.sh b/tmux/.tmux/plugins/tpm/tests/test_plugin_sourcing.sh new file mode 100755 index 0000000..c06f1fe --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/test_plugin_sourcing.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +TPM_DIR="$PWD" +PLUGINS_DIR="$HOME/.tmux/plugins" + +CUSTOM_PLUGINS_DIR="$HOME/foo/plugins" + +source "$CURRENT_DIR/helpers/helpers.sh" +source "$CURRENT_DIR/helpers/tpm.sh" + +check_binding_defined() { + local binding="$1" + tmux list-keys | grep -q "$binding" +} + +create_test_plugin_helper() { + local plugin_path="$PLUGINS_DIR/tmux_test_plugin/" + rm -rf "$plugin_path" + mkdir -p "$plugin_path" + + while read line; do + echo "$line" >> "$plugin_path/test_plugin.tmux" + done + chmod +x "$plugin_path/test_plugin.tmux" +} + +check_tpm_path() { + local correct_tpm_path="$1" + local tpm_path="$(tmux start-server\; show-environment -g TMUX_PLUGIN_MANAGER_PATH | cut -f2 -d=)" + [ "$correct_tpm_path" == "$tpm_path" ] +} + +test_plugin_sourcing() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @plugin "doesnt_matter/tmux_test_plugin" + run-shell "$TPM_DIR/tpm" + HERE + + # manually creates a local tmux plugin + create_test_plugin_helper <<- HERE + tmux bind-key R run-shell foo_command + HERE + + tmux new-session -d # tmux starts detached + check_binding_defined "R run-shell foo_command" || + fail_helper "Plugin sourcing fails" + + teardown_helper +} + +test_default_tpm_path() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + run-shell "$TPM_DIR/tpm" + HERE + + check_tpm_path "${PLUGINS_DIR}/" || + fail_helper "Default TPM path not correct" + + teardown_helper +} + +test_custom_tpm_path() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set-environment -g TMUX_PLUGIN_MANAGER_PATH '$CUSTOM_PLUGINS_DIR' + run-shell "$TPM_DIR/tpm" + HERE + + check_tpm_path "$CUSTOM_PLUGINS_DIR" || + fail_helper "Custom TPM path not correct" + + teardown_helper +} + +run_tests diff --git a/tmux/.tmux/plugins/tpm/tests/test_plugin_update.sh b/tmux/.tmux/plugins/tpm/tests/test_plugin_update.sh new file mode 100755 index 0000000..4924d16 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tests/test_plugin_update.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +TPM_DIR="$PWD" +PLUGINS_DIR="$HOME/.tmux/plugins" + +source "$CURRENT_DIR/helpers/helpers.sh" +source "$CURRENT_DIR/helpers/tpm.sh" + +manually_install_the_plugin() { + mkdir -p "$PLUGINS_DIR" + cd "$PLUGINS_DIR" + git clone --quiet https://github.com/tmux-plugins/tmux-example-plugin +} + +# TMUX KEY-BINDING TESTS + +test_plugin_update_via_tmux_key_binding() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @plugin "tmux-plugins/tmux-example-plugin" + run-shell "$TPM_DIR/tpm" + HERE + + manually_install_the_plugin + + "$CURRENT_DIR/expect_successful_update_of_all_plugins" || + fail_helper "[key-binding] 'update all plugins' fails" + + "$CURRENT_DIR/expect_successful_update_of_a_single_plugin" || + fail_helper "[key-binding] 'update single plugin' fails" + + teardown_helper +} + +# SCRIPT TESTS + +test_plugin_update_via_script() { + set_tmux_conf_helper <<- HERE + set -g mode-keys vi + set -g @plugin "tmux-plugins/tmux-example-plugin" + run-shell "$TPM_DIR/tpm" + HERE + + manually_install_the_plugin + + local expected_exit_code=1 + script_run_helper "$TPM_DIR/bin/update_plugins" 'usage' "$expected_exit_code" || + fail_helper "[script] running update plugins without args should fail" + + script_run_helper "$TPM_DIR/bin/update_plugins tmux-example-plugin" '"tmux-example-plugin" update success' || + fail_helper "[script] plugin update fails" + + script_run_helper "$TPM_DIR/bin/update_plugins all" '"tmux-example-plugin" update success' || + fail_helper "[script] update all plugins fails" + + teardown_helper +} + +run_tests diff --git a/tmux/.tmux/plugins/tpm/tpm b/tmux/.tmux/plugins/tpm/tpm new file mode 100755 index 0000000..7ad4b99 --- /dev/null +++ b/tmux/.tmux/plugins/tpm/tpm @@ -0,0 +1,81 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +BINDINGS_DIR="$CURRENT_DIR/bindings" +SCRIPTS_DIR="$CURRENT_DIR/scripts" + +source "$SCRIPTS_DIR/variables.sh" + +get_tmux_option() { + local option="$1" + local default_value="$2" + local option_value="$(tmux show-option -gqv "$option")" + if [ -z "$option_value" ]; then + echo "$default_value" + else + echo "$option_value" + fi +} + +tpm_path_set() { + tmux show-environment -g "$DEFAULT_TPM_ENV_VAR_NAME" >/dev/null 2>&1 +} + +# Check if configuration file exists at an XDG-compatible location, if so use +# that directory for TMUX_PLUGIN_MANAGER_PATH. Otherwise use $DEFAULT_TPM_PATH. +set_default_tpm_path() { + local xdg_tmux_path="${XDG_CONFIG_HOME:-$HOME/.config}/tmux" + local tpm_path="$DEFAULT_TPM_PATH" + + if [ -f "$xdg_tmux_path/tmux.conf" ]; then + tpm_path="$xdg_tmux_path/plugins/" + fi + + tmux set-environment -g "$DEFAULT_TPM_ENV_VAR_NAME" "$tpm_path" +} + +# Ensures TMUX_PLUGIN_MANAGER_PATH global env variable is set. +# +# Put this in `.tmux.conf` to override the default: +# `set-environment -g TMUX_PLUGIN_MANAGER_PATH "/some/other/path/"` +set_tpm_path() { + if ! tpm_path_set; then + set_default_tpm_path + fi +} + +# 1. Fetches plugin names from `@plugin` variables +# 2. Creates full plugin path +# 3. Sources all *.tmux files from each of the plugin directories +# - no errors raised if directory does not exist +# Files are sourced as tmux config files, not as shell scripts! +source_plugins() { + "$SCRIPTS_DIR/source_plugins.sh" >/dev/null 2>&1 +} + +# prefix + I - downloads TPM plugins and reloads TMUX environment +# prefix + U - updates a plugin (or all of them) and reloads TMUX environment +# prefix + alt + u - remove unused TPM plugins and reloads TMUX environment +set_tpm_key_bindings() { + local install_key="$(get_tmux_option "$install_key_option" "$default_install_key")" + tmux bind-key "$install_key" run-shell "$BINDINGS_DIR/install_plugins" + + local update_key="$(get_tmux_option "$update_key_option" "$default_update_key")" + tmux bind-key "$update_key" run-shell "$BINDINGS_DIR/update_plugins" + + local clean_key="$(get_tmux_option "$clean_key_option" "$default_clean_key")" + tmux bind-key "$clean_key" run-shell "$BINDINGS_DIR/clean_plugins" +} + +supported_tmux_version_ok() { + "$SCRIPTS_DIR/check_tmux_version.sh" "$SUPPORTED_TMUX_VERSION" +} + +main() { + if supported_tmux_version_ok; then + set_tpm_path + set_tpm_key_bindings + source_plugins + fi +} +main diff --git a/zed/.config/zed/settings.json b/zed/.config/zed/settings.json new file mode 100644 index 0000000..09270d5 --- /dev/null +++ b/zed/.config/zed/settings.json @@ -0,0 +1,57 @@ +{ + "project_panel": { + "dock": "right" + }, + "agent": { + "dock": "left", + "version": "1" + }, + "telemetry": { + "metrics": false, + "diagnostics": false + }, + "vim_mode": true, + "base_keymap": "JetBrains", + "ui_font_size": 14, + "tab_size": 4, + "buffer_font_size": 14, + "ui_font_family": "Agave Nerd Font Mono", + "buffer_font_family": "Agave Nerd Font Mono", + "show_whitespaces": "all", + "theme": { + "mode": "system", + "light": "Gruvbox Light Hard", + "dark": "Gruvbox Dark Soft" + }, + "format_on_save": "on", + "relative_line_numbers": true, + "lsp": { + "deno": { + "settings": { + "deno": { + "enable": true + } + } + } + }, + "languages": { + "TypeScript": { + "language_servers": [ + "deno", + "!typescript-language-server", + "!vtsls", + "!eslint" + ], + "formatter": "language_server" + }, + "TSX": { + "language_servers": [ + "deno", + "!typescript-language-server", + "!vtsls", + "!eslint" + ], + "formatter": "language_server" + } + } +} diff --git a/zsh/.config/zsh/greetings/00_art/another_penguin b/zsh/.config/zsh/greetings/00_art/another_penguin new file mode 100644 index 0000000..00f43e3 --- /dev/null +++ b/zsh/.config/zsh/greetings/00_art/another_penguin @@ -0,0 +1,15 @@ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣖⣫⠵⠔⢿⣿⣿⣿⡄⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⢠⠾⠯⣾⠃⠀⢀⣸⡿⠛⠻⢿⣆⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠆⣀⡀⠹⣶⣀⣨⡏⢀⣀⡀⠈⣿⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⢸⠀⠛⠃⢰⠋⠉⢻⠀⠘⠛⠃⠀⣿⡄⠀⠀ +⠀⠀⠀⠀⠀⢀⣀⣘⡀⠀⠀⠀⠀⠒⠉⠀⠀⠀⢀⣼⡟⠀⠀⠀ +⣠⣶⣶⣾⣿⣿⣿⣿⣯⡶⡀⠀⠀⠀⠀⢀⣀⢴⡻⣗⡄⠀⠀⠀ +⠹⡿⠿⠛⢿⣿⣿⣿⣟⣥⡈⠉⠁⠀⠀⠀⠀⢀⣵⢊⠨⠢⠀⠀ +⠀⠀⠀⠀⠘⠻⠿⠿⠿⠁⠘⠋⠒⠂⠀⠐⠊⠉⠈⠎⣦⡀⠱⡀ +⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠘⠟⢧⣱ +⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠀⢸⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⢸⣇⠀⡀⠀⠀⠀⠀⠀⠀⠀⡰⠁⠀⢺⠆⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠻⣆⠳⢄⣀⠠⠀⠀⠐⡄⡇⠀⣠⡯⠟⠀ +⠀⠀⠀⠀⠀⠀⠀⣤⣎⣟⡖⣺⠗⠉⠉⠉⠉⠉⡖⡶⣟⢢⣐⠶ +⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠁⠒⠒⠒⠒⠒⠂⠉⠉⠉⠁⠀⠀
\ No newline at end of file diff --git a/zsh/.config/zsh/greetings/00_art/butterfly b/zsh/.config/zsh/greetings/00_art/butterfly new file mode 100644 index 0000000..cea5d72 --- /dev/null +++ b/zsh/.config/zsh/greetings/00_art/butterfly @@ -0,0 +1,9 @@ +⠀⠀⠀⠀⊹ +⢶⢻⣑⣒⢤⡀⠀⢄⠀⠀⡠⠀⢀⡤⣆⣊⡿⡷ +⠀⠹⠹⣚⣣⠻⣦⡀⠀⠀⢀⣴⠟⣸⢓⢎⠏⠀ +⠀⠀⢡⣱⣖⣢⡾⢿⣾⣷⡿⢷⣖⣒⣎⡎⠀⠀ +⠀⠀⠀⣠⠓⢬⠅⡺⢻⡟⢗⠨⡥⠚⣄⠀⠀⠀ +⠀⠀⠀⣿⡆⠘⠆⢇⢸⡇⠸⠰⠃⢰⣿⠀⠀⠀ +⠀⠀⠀⠐⡻⣮⣬⠞⠈⠁⠳⣤⣴⢿⠂⠀⠀⠀ +⠀⠀⠀⡜⠀⠁⠉⠀⠀⠀⠀⠈⠈⠀⢣⠀⠀⠀⊹ +⊹
\ No newline at end of file diff --git a/zsh/.config/zsh/greetings/00_art/eebjy b/zsh/.config/zsh/greetings/00_art/eebjy new file mode 100644 index 0000000..6e6bbcf --- /dev/null +++ b/zsh/.config/zsh/greetings/00_art/eebjy @@ -0,0 +1,9 @@ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀ +⠀⠀⠀⠀⢀⡴⣆⠀⠀⠀⠀⠀⣠⡀ ᶻ 𝗓 𐰁 .ᐟ ⣼⣿⡗⠀⠀⠀⠀ +⠀⠀⠀⣠⠟⠀⠘⠷⠶⠶⠶⠾⠉⢳⡄⠀⠀⠀⠀⠀⣧⣿⠀⠀⠀⠀⠀ +⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣤⣤⣤⣤⣤⣿⢿⣄⠀⠀⠀⠀ +⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣧⠀⠀⠀⠀⠀⠀⠙⣷⡴⠶⣦ +⠀⠀⢱⡀⠀⠉⠉⠀⠀⠀⠀⠛⠃⠀⢠⡟⠀⠀⠀⢀⣀⣠⣤⠿⠞⠛⠋ +⣠⠾⠋⠙⣶⣤⣤⣤⣤⣤⣀⣠⣤⣾⣿⠴⠶⠚⠋⠉⠁⠀⠀⠀⠀⠀⠀ +⠛⠒⠛⠉⠉⠀⠀⠀⣴⠟⢃⡴⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠛⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ diff --git a/zsh/.config/zsh/greetings/00_art/heart b/zsh/.config/zsh/greetings/00_art/heart new file mode 100644 index 0000000..3394514 --- /dev/null +++ b/zsh/.config/zsh/greetings/00_art/heart @@ -0,0 +1,8 @@ +. +⠀ ⠀ +⠀˚⠀ ⣴⠟⠉⠉⠛⢦⡀⢀⣴⠛⠉⠈⠙⠻⣄ +⠀⠀⣼⠃⠀⠀⠀⠀⠀⠙⠋⠀⠀⠀⠀⠀⠀⠹⣦ +⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿ +⠀⠀⠿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡆ +⠀⠀⠀⢻⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡼⠃ +⠀⠀⠀⠀⠀⠻⢦⣄⠀⠀⠀⠀⠀⣠⡴⠛ +⠀⠀⠀⠀⠀⠀⠀⠉⠛⠶⣄⠶⠋ ⠀⠀⠀+. *
\ No newline at end of file diff --git a/zsh/.config/zsh/greetings/00_art/penguin b/zsh/.config/zsh/greetings/00_art/penguin new file mode 100644 index 0000000..6389d00 --- /dev/null +++ b/zsh/.config/zsh/greetings/00_art/penguin @@ -0,0 +1,16 @@ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡤⠴⠒⠒⠒⠶⢤⣄⡀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⣠⠞⠁⠀⠀⠀⠀⠀⠀⠀⠈⠙⢦⡀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⡼⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢳⡀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⢸⠁⠀⠀⣠⠖⠛⠛⠲⢤⠀⠀⠀⣰⠚⠛⢷⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⣿⠀⠀⣸⠃⠀⠀⢀⣀⠈⢧⣠⣤⣯⢠⣤⠘⣆⠀⠀⠀ +⠀⠀⠀⠀⠀⣿⠀⠀⡇⠀⠀⠀⠻⠟⠠⣏⣀⣀⣨⡇⠉⢀⣿⠀⠀⠀ +⠀⠀⠀⠀⢀⡟⠀⠀⠹⡄⠀⠀⠀⠀⠀⠉⠑⠚⠉⠀⣠⡞⢿⠀⠀⠀ +⠀⠀⠀⢀⡼⠁⠀⠀⠀⠙⠳⢤⡄⠀⠀⠀⠀⠀⠀⠀⠁⠙⢦⠳⣄⠀ +⠀⠀⢀⡾⠁⠀⠀⠀⠀⠀⠤⣏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠃⠙⡆ +⠀⠀⣼⠁⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⢠⡏⠀⠀⡇ +⠀⠀⣏⠀⠀⠀⠀⠲⣄⡀⠀⠀⠀⠸⡄⠀⠀⠀⠀⠀⠀⢸⠀⢀⡼⠁ +⢀⡴⢿⠀⠀⠀⠀⠀⢸⠟⢦⡀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠘⠗⣿⠁⠀ +⠸⣦⡘⣦⠀⠀⠀⠀⣸⣄⠀⡉⠓⠚⠀⠀⠀⠀⠀⠀⠀⠀⡴⢹⣦⡀ +⠀⠀⠉⠛⠳⢤⣴⠾⠁⠈⠟⠉⣇⠀⠀⠀⠀⠀⠀⠀⣠⠞⠁⣠⠞⠁ +⠀⠀⠀⠀⠀⠀⠙⢧⣀⠀⠀⣠⠏⠀⠀⢀⣀⣠⠴⠛⠓⠚⠋⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠋⠉⠉⠉⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀ diff --git a/zsh/.config/zsh/greetings/00_art/puppy b/zsh/.config/zsh/greetings/00_art/puppy new file mode 100644 index 0000000..c4d7fbb --- /dev/null +++ b/zsh/.config/zsh/greetings/00_art/puppy @@ -0,0 +1,10 @@ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣄⢀⡀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⡿⠀⠀⠀⠀ +⠀⠀⠀⠀⣀⣀⣤⠖⠛⠉⠉⠉⠉⠉⠙⠒⠦⣿⣏⣀⠀⠀⠀⠀ +⠀⠀⣠⠞⠁⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢵⡄⠀⠀ +⠀⢰⣯⠀⠀⢀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⣿⠀⠀ +⠀⠈⣇⢀⢠⠇⠀⣶⡶⠄⠀⠀⠀⢠⣶⡶⠀⠀⣸⣀⣼⠟⠀⠀ +⠀⠀⠙⠛⠾⡆⠀⠙⠛⠃⠀⠀⠀⠀⠙⠋⠀⠀⣹⠟⠁⠀⠀⠀ +⢀⡴⠚⠉⠛⢿⠀⠀⠀⠀⢿⣿⠆⠀⠀⠀⠀⢀⣿⠋⠉⠉⢳⡄ +⢾⡀⡄⠀⣄⡼⠻⢧⠤⣤⠤⠤⣤⣠⣦⣾⠶⠞⢿⣤⡄⣠⣀⡷ +⠈⠙⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠀
\ No newline at end of file diff --git a/zsh/.config/zsh/greetings/00_art/totoro b/zsh/.config/zsh/greetings/00_art/totoro new file mode 100644 index 0000000..9a1ba92 --- /dev/null +++ b/zsh/.config/zsh/greetings/00_art/totoro @@ -0,0 +1,13 @@ +⠀⠀⠀⠀⣶⣄⠀⠀⠀⠀⠀⠀⢀⣶⡆⠀⠀⠀ +⠀⠀⠀⢸⣿⣿⡆⠀⠀⠀⠀⢀⣾⣿⡇⠀⠀⠀ +⠀⠀⠀⠘⣿⣿⣿⠀⠀⠀⠀⢸⣿⣿⡇⠀⠀⠀ +⠀⠀⠀⠀⢿⣿⣿⣤⣤⣤⣤⣼⣿⡿⠃⠀⠀⠀ +⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀ +⠀⠀⢠⣿⡃⣦⢹⣿⣟⣙⣿⣿⠰⡀⣿⣇⠀⠀ +⠠⠬⣿⣿⣷⣶⣿⣿⣿⣿⣿⣿⣷⣾⣿⣿⡭⠤ +⠀⣼⣿⣿⣿⣿⠿⠛⠛⠛⠛⠻⢿⣿⣿⣿⣿⡀ +⢰⣿⣿⣿⠋⠀⠀⠀⢀⣀⠀⠀⠀⠉⢿⣿⣿⣧ +⢸⣿⣿⠃⠜⠛⠂⠀⠋⠉⠃⠐⠛⠻⠄⢿⣿⣿ +⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿ +⠘⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⡏ +⠀⠈⠻⠿⣤⣀⡀⠀⠀⠀⠀⠀⣀⣠⠾⠟⠋⠀
\ No newline at end of file diff --git a/zsh/.config/zsh/greetings/01_prompts/aww_motivation_lost b/zsh/.config/zsh/greetings/01_prompts/aww_motivation_lost new file mode 100644 index 0000000..59aeae6 --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/aww_motivation_lost @@ -0,0 +1 @@ +404: motivation not found~ try again (︶︹︶) diff --git a/zsh/.config/zsh/greetings/01_prompts/bashful b/zsh/.config/zsh/greetings/01_prompts/bashful new file mode 100644 index 0000000..5a9bf7e --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/bashful @@ -0,0 +1 @@ +lil shell says hai~ (,,>﹏<,,) diff --git a/zsh/.config/zsh/greetings/01_prompts/bby b/zsh/.config/zsh/greetings/01_prompts/bby new file mode 100644 index 0000000..b0378bb --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/bby @@ -0,0 +1 @@ +welcome back bby, whatcha codin~? ◝(˶˃ ᵕ ˂˶) ◜ ♡ diff --git a/zsh/.config/zsh/greetings/01_prompts/bot b/zsh/.config/zsh/greetings/01_prompts/bot new file mode 100644 index 0000000..9f1bfe5 --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/bot @@ -0,0 +1 @@ +beep boop i’m ur smol shell bot~ (≧ ◡ ≦) diff --git a/zsh/.config/zsh/greetings/01_prompts/break_stuff b/zsh/.config/zsh/greetings/01_prompts/break_stuff new file mode 100644 index 0000000..38fba6b --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/break_stuff @@ -0,0 +1 @@ +──⋆⋅☆⋅⋆── what are u gonna break today? ──⋆⋅☆⋅⋆── diff --git a/zsh/.config/zsh/greetings/01_prompts/compiling_feelings b/zsh/.config/zsh/greetings/01_prompts/compiling_feelings new file mode 100644 index 0000000..beeb049 --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/compiling_feelings @@ -0,0 +1 @@ +current mood: compiling feelings... (っ´ω `)ノ(╥ ω ╥ ) diff --git a/zsh/.config/zsh/greetings/01_prompts/crashin b/zsh/.config/zsh/greetings/01_prompts/crashin new file mode 100644 index 0000000..78ce202 --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/crashin @@ -0,0 +1 @@ +lowkey bashin’ and highkey crashin~ (∩^o^)⊃━☆゚.*・。゚ diff --git a/zsh/.config/zsh/greetings/01_prompts/desu b/zsh/.config/zsh/greetings/01_prompts/desu new file mode 100644 index 0000000..210ca3c --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/desu @@ -0,0 +1 @@ +terminal-chan desu~ ( ^・ω・^ ) diff --git a/zsh/.config/zsh/greetings/01_prompts/hacker_friend b/zsh/.config/zsh/greetings/01_prompts/hacker_friend new file mode 100644 index 0000000..8daadee --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/hacker_friend @@ -0,0 +1 @@ +hewwwooo hacker friend~ ( ˶ˆᗜ ˆ˵ )͜♡ ready 2 typey type? diff --git a/zsh/.config/zsh/greetings/01_prompts/hai b/zsh/.config/zsh/greetings/01_prompts/hai new file mode 100644 index 0000000..487c866 --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/hai @@ -0,0 +1 @@ +ahh!! it’s you again~ kyaaa~!! (,,> ᴗ <,,) diff --git a/zsh/.config/zsh/greetings/01_prompts/input_output_love b/zsh/.config/zsh/greetings/01_prompts/input_output_love new file mode 100644 index 0000000..9d3964d --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/input_output_love @@ -0,0 +1 @@ +input accepted, output is love (´。• ω •。) ♡` diff --git a/zsh/.config/zsh/greetings/01_prompts/love_letter b/zsh/.config/zsh/greetings/01_prompts/love_letter new file mode 100644 index 0000000..b2556fe --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/love_letter @@ -0,0 +1 @@ +shell prompt... or love letter? (⸝⸝๑﹏๑⸝⸝) diff --git a/zsh/.config/zsh/greetings/01_prompts/online b/zsh/.config/zsh/greetings/01_prompts/online new file mode 100644 index 0000000..0201fde --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/online @@ -0,0 +1 @@ +system online... awaiting ur magic~ ૮ ˶ᵔ ᵕ ᵔ˶ ა diff --git a/zsh/.config/zsh/greetings/01_prompts/production b/zsh/.config/zsh/greetings/01_prompts/production new file mode 100644 index 0000000..4deab12 --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/production @@ -0,0 +1 @@ +plz don't break the server... or do, whatever ( ¬ ⤙ ¬ ) diff --git a/zsh/.config/zsh/greetings/01_prompts/sammich b/zsh/.config/zsh/greetings/01_prompts/sammich new file mode 100644 index 0000000..f22df0a --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/sammich @@ -0,0 +1 @@ +sudo make me a sandwich? (・∀・) 🥪 ✧₊˚ʚ diff --git a/zsh/.config/zsh/greetings/01_prompts/shell_yeah b/zsh/.config/zsh/greetings/01_prompts/shell_yeah new file mode 100644 index 0000000..7826b64 --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/shell_yeah @@ -0,0 +1 @@ +shell yeah!! let’s do some scripts~ (ノ≧ ڡ ≦) diff --git a/zsh/.config/zsh/greetings/01_prompts/time_to_hack b/zsh/.config/zsh/greetings/01_prompts/time_to_hack new file mode 100644 index 0000000..afc0cb6 --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/time_to_hack @@ -0,0 +1 @@ +*clickity clack* time 2 hack~ (。•̀ᴗ-)✧ diff --git a/zsh/.config/zsh/greetings/01_prompts/typing b/zsh/.config/zsh/greetings/01_prompts/typing new file mode 100644 index 0000000..6d4c0d0 --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/typing @@ -0,0 +1 @@ +typing together forever~~ (づ。◕‿‿◕。)づ diff --git a/zsh/.config/zsh/greetings/01_prompts/yeehaw b/zsh/.config/zsh/greetings/01_prompts/yeehaw new file mode 100644 index 0000000..53eb098 --- /dev/null +++ b/zsh/.config/zsh/greetings/01_prompts/yeehaw @@ -0,0 +1 @@ +rootin' and tootin' with sudo~ yeehaw~ (⌒ ▽ ⌒) ☆ diff --git a/zsh/.config/zsh/linux/init.zsh b/zsh/.config/zsh/linux/init.zsh new file mode 100755 index 0000000..49db77e --- /dev/null +++ b/zsh/.config/zsh/linux/init.zsh @@ -0,0 +1,6 @@ +#!/bin/zsh + +#-- <gpg> -- +export PINENTRY_USER_DATA="PINENTRY_USE_QT" +#-- </gpg> -- + diff --git a/zsh/.config/zsh/osx/armin.zsh b/zsh/.config/zsh/osx/armin.zsh new file mode 100755 index 0000000..cc54a2e --- /dev/null +++ b/zsh/.config/zsh/osx/armin.zsh @@ -0,0 +1,3 @@ +#!/bin/zsh + + diff --git a/zsh/.config/zsh/osx/bcd074b37296.zsh b/zsh/.config/zsh/osx/bcd074b37296.zsh new file mode 120000 index 0000000..f99643e --- /dev/null +++ b/zsh/.config/zsh/osx/bcd074b37296.zsh @@ -0,0 +1 @@ +work.zsh
\ No newline at end of file diff --git a/zsh/.config/zsh/osx/init.zsh b/zsh/.config/zsh/osx/init.zsh new file mode 100755 index 0000000..40a3d8d --- /dev/null +++ b/zsh/.config/zsh/osx/init.zsh @@ -0,0 +1,20 @@ +#!/bin/zsh + +#-- <brew> -- +# HOMEBREW_PREFIX, MANPATH, INFOPATH, etc. +eval "$(/opt/homebrew/bin/brew shellenv)" + +# use gnu coreutils +export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH" +#-- </brew> -- + +#-- <gpg> -- +export PINENTRY_USER_DATA="PINENTRY_USE_MAC" +#-- </gpg> -- + +#-- <zsh> -- +# brew install zsh-syntax-highlighting +source $HOMEBREW_PREFIX/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh +# brew install zsh-autosuggestions +source $HOMEBREW_PREFIX/share/zsh-autosuggestions/zsh-autosuggestions.zsh +#-- </zsh> diff --git a/zsh/.config/zsh/osx/work.zsh b/zsh/.config/zsh/osx/work.zsh new file mode 100755 index 0000000..9091c91 --- /dev/null +++ b/zsh/.config/zsh/osx/work.zsh @@ -0,0 +1,32 @@ +#!/bin/zsh + +#-- <amzn> -- +# git authorship +export GIT_AUTHOR_NAME=Elizabeth Hunt +export GIT_AUTHOR_EMAIL=lizhunt@amazon.com +export GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME +export GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL + +# finch +export DOCKER_HOST=unix:///Applications/Finch/lima/data/finch/sock/finch.sock + +# run java repl with class path of package! :D +alias jshell='jshell --class-path "`brazil-path build.classpath`:`brazil-path run.classpath`"' + +# bb ... +alias bb=brazil-build +alias bba='brazil-build apollo-pkg' +alias bre='brazil-runtime-exec' +alias brc='brazil-recursive-cmd' +alias bws='brazil ws' +alias bwsuse='bws use --gitMode -p' +alias bwscreate='bws create -n' +alias brc=brazil-recursive-cmd +alias bbr='brc brazil-build' +alias bball='brc --allPackages' +alias bbb='brc --allPackages brazil-build' +alias bbra='bbr apollo-pkg' +alias bbcr='bb && cr' +alias brazil-recursive-cmd='brazil-recursive-cmd-parallel' +#-- </amzn> -- + diff --git a/zsh/.config/zsh/setup/aliases.zsh b/zsh/.config/zsh/setup/aliases.zsh new file mode 100755 index 0000000..73b09b3 --- /dev/null +++ b/zsh/.config/zsh/setup/aliases.zsh @@ -0,0 +1,27 @@ +#!/bin/sh + +#-- <git> -- +alias gc="git checkout" +alias gcb="git checkout -b" +alias gcm="git commit -m" +alias ga="git add" +alias gaa="git add ." +alias gpl="git pull" +alias gps="git push" +alias gr="git rebase" +alias gss="git status" +alias gsa="git stash" +alias gsr="git stash pop" +alias gl="git log --oneline" +#-- </git> -- + +#-- <misc> -- +alias fuckuctl="journalctl --user -fu" +alias fuckctl="journalctl -fu" + +alias ..="cd .." +#-- </misc> -- + +#-- <neovim> -- +alias vim="nvim" +#-- </neovim> -- diff --git a/zsh/.config/zsh/setup/device.zsh b/zsh/.config/zsh/setup/device.zsh new file mode 100755 index 0000000..d3f8c4b --- /dev/null +++ b/zsh/.config/zsh/setup/device.zsh @@ -0,0 +1,30 @@ +#!/bin/zsh + +source log.sh "setup/device.zsh" + +#-- <os_init> -- +platform="$(platform.sh)" +platform_setup="$ZDOTDIR/$platform" +init_platform="$platform_setup/init.zsh" +if [ ! -d "$platform_setup" ]; then + log ERROR "misconfigured platform $platform: $platform_setup is not a directory" + exit 1 +fi +if [ -e "$init_platform" ]; then + log DEBUG "executing $init_platform" + . "$init_platform" +else + log DEBUG "no platform-specific init for $platform at $init_platform" +fi +#-- </os_init> -- + +#-- <machine_init> -- +machine="$(system_name.sh)" +machine_init="$platform_setup/$machine.zsh" +if [ -e "$machine_init" ]; then + log DEBUG "executing $platform.$machine $machine_init" + . "$machine_init" +else + log WARN "no machine-specific init for $platform.$machine at $machine_init" +fi +#-- </machine_init> -- diff --git a/zsh/.config/zsh/setup/git.zsh b/zsh/.config/zsh/setup/git.zsh new file mode 100755 index 0000000..e88cafc --- /dev/null +++ b/zsh/.config/zsh/setup/git.zsh @@ -0,0 +1,8 @@ +#!/bin/zsh + +#-- <git> -- +export GIT_AUTHOR_NAME=Elizabeth Alexander Hunt +export GIT_AUTHOR_EMAIL=me@liz.coffee +export GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME +export GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL +#-- </git> -- diff --git a/zsh/.config/zsh/setup/gpg.zsh b/zsh/.config/zsh/setup/gpg.zsh new file mode 100755 index 0000000..171b9d8 --- /dev/null +++ b/zsh/.config/zsh/setup/gpg.zsh @@ -0,0 +1,23 @@ +#!/bin/zsh + + +# -- <gpg> -- +KEY_ID="DC4323D1738F27358793D6E87BB52F7036FA7C18" +gpg -k "$KEY_ID" >/dev/null 2>&1 || gpg --import "$HOME/Documents/pubkey" + +cp $HOME/scripts/pinentry.sh /tmp/pinentry + + +export PINENTRY_USER_DATA="${PINENTRY_USER_DATA:-PINENTRY_USE_TTY}" +if [ "$SSH_CLIENT" ]; then + export PINENTRY_USER_DATA=PINENTRY_USE_CURSES + exit 0 +fi + +# yubikey! +unset SSH_AGENT_PID +export GPG_TTY=$(tty) +export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) +gpgconf --launch gpg-agent +gpg-connect-agent updatestartuptty /bye > /dev/null +# -- </gpg> -- diff --git a/zsh/.config/zsh/setup/history.zsh b/zsh/.config/zsh/setup/history.zsh new file mode 100755 index 0000000..ea8ab9c --- /dev/null +++ b/zsh/.config/zsh/setup/history.zsh @@ -0,0 +1,14 @@ +#!/bin/zsh + +HISTSIZE=2000000 +SAVEHIST=$HISTSIZE +: ${HISTFILE=$ZDOTDIR/zsh_history} + +setopt EXTENDED_HISTORY # Write the history file in the ':start:elapsed;command' format. +setopt HIST_EXPIRE_DUPS_FIRST # Expire a duplicate event first when trimming history. +setopt HIST_FIND_NO_DUPS # Do not display a previously found event. +setopt HIST_IGNORE_ALL_DUPS # Delete an old recorded event if a new event is a duplicate. +setopt HIST_IGNORE_DUPS # Do not record an event that was just recorded again. +setopt HIST_IGNORE_SPACE # Do not record an event starting with a space. +setopt HIST_SAVE_NO_DUPS # Do not write a duplicate event to the history file. +setopt SHARE_HISTORY # Share history between all sessions. diff --git a/zsh/.config/zsh/setup/misc.zsh b/zsh/.config/zsh/setup/misc.zsh new file mode 100755 index 0000000..f301dcc --- /dev/null +++ b/zsh/.config/zsh/setup/misc.zsh @@ -0,0 +1,11 @@ +#!/bin/zsh + +backward-kill-dir () { + local WORDCHARS=${WORDCHARS/\/} + zle backward-kill-word + zle -f kill +} +zle -N backward-kill-dir +bindkey '^[^?' backward-kill-dir + +bindkey \^K kill-line diff --git a/zsh/.config/zsh/setup/tools.zsh b/zsh/.config/zsh/setup/tools.zsh new file mode 100755 index 0000000..1fc8844 --- /dev/null +++ b/zsh/.config/zsh/setup/tools.zsh @@ -0,0 +1,15 @@ +#!/bin/zsh + +#-- <mise> -- +eval "$(mise activate zsh)" +#-- </mise> -- + +#-- <zoxide> -- +eval "$(zoxide init --cmd z zsh)" +alias cd="z" +#-- </zoxide> -- + +#-- <starship> -- +eval "$(starship init zsh)" +#-- </starship> -- + diff --git a/zsh/.hushlogin b/zsh/.hushlogin new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/zsh/.hushlogin diff --git a/zsh/.zshrc b/zsh/.zshrc new file mode 100644 index 0000000..a2376b7 --- /dev/null +++ b/zsh/.zshrc @@ -0,0 +1,38 @@ +#!/bin/zsh + +#-- <startup> -- +export XDG_CONFIG_HOME="$HOME/.config" +export ZDOTDIR=${XDG_CONFIG_HOME:-$HOME/.config}/zsh +export PATH=$PATH:$HOME/scripts:$HOME/.local/bin + +source log.sh ".zshrc" +greet.sh +#-- </startup> -- + +#-- <misc> -- +. "$ZDOTDIR/setup/misc.zsh" +#-- </misc> -- + +#-- <common_aliases> -- +. "$ZDOTDIR/setup/aliases.zsh" +#-- </common_aliases> -- + +#-- <shell_opts> -- +. "$ZDOTDIR/setup/history.zsh" +#-- </shell_opts> -- + +#-- <misc> -- +. "$ZDOTDIR/setup/git.zsh" +#-- </misc> -- + +#-- <device> -- +. "$ZDOTDIR/setup/device.zsh" +#-- </device> -- + +#-- <tools> -- +. "$ZDOTDIR/setup/tools.zsh" +#-- </tools> -- + +#-- <gpg> -- +. "$ZDOTDIR/setup/gpg.zsh" +#-- </gpg> -- |