diff --git a/LICENSE b/LICENSE index 6c9eef8..abba155 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) . All rights reserved. +Copyright (c) 2022 Luke Tidd. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/bashrc b/bashrc new file mode 100644 index 0000000..b6795f9 --- /dev/null +++ b/bashrc @@ -0,0 +1,119 @@ +# If not running interactively, don't do anything +[[ -z "$PS1" ]] && return +[[ $- == *i* ]] && stty -ixon + +#### +# settings +set -o vi +shopt -s checkwinsize # update the values of LINES and COLUMNS. +shopt -s nullglob +bind 'set enable-bracketed-paste off' +LANG="en_US.UTF-8" +LC_COLLATE="en_US.UTF-8" +LC_CTYPE="en_US.UTF-8" +LC_MESSAGES="en_US.UTF-8" +LC_MONETARY="en_US.UTF-8" +LC_NUMERIC="en_US.UTF-8" +LC_TIME="en_US.UTF-8" +LC_ALL= +GDK_BACKEND=wayland + +#### +# paths +function in_path() { + new_path="$1" + a=0 + while true; do + a=$((a+1)) + current="$(cut -d: -f"${a}" <<< "$PATH")" + if [[ -z "$current" ]]; then + return 1 + fi + if [[ "$new_path" == "$current" ]]; then + return 0 + fi + done +} +unset additional_paths +declare -a additional_paths +additional_paths=( + "${HOME}/bin" + "${HOME}/bin2" + "${HOME}/go/bin" + "${HOME}/local/bin" + "${HOME}/.cargo/bin" + "${HOME}/git/cr/depot_tools" + "/usr/local/go/bin/" + ) +for path in "${additional_paths[@]}"; do + in_path "$path" || PATH="${path}:${PATH}" +done +unset additional_paths +unset in_path + +#### +# sources +unset sources +declare -a sources +sources=( + "${HOME}/.bash_aliases" + "${HOME}/.bash_functions" + "${HOME}/.bash_functions2" + "${HOME}/.cargo/env" + "${KITTY_INSTALLATION_DIR}/shell-integration/bash/kitty.bash" +) + +for source in "${sources[@]}"; do + if [[ -r "${source}" ]]; then + . "${source}" + fi +done +unset sources + +if [[ -d "${HOME}/.config/aliases" ]]; then + readarray -d '' bash_sources < <(find "${HOME}/.config/aliases" -type f | sort -V | tr '\n' '\0') + for source in "${bash_sources[@]}"; do + . "$source" + done +fi + +#### +# env +export HISTCONTROL=ignoredups +export HISTCONTROL=ignoreboth +export PS1='$ ' +export VISUAL=vim +export EDITOR="$VISUAL" +export SYSTEMD_PAGER="cat" +export GIT_PAGER="cat" +export XDG_CONFIG_HOME="${HOME}/.config" +export XDG_CURRENT_DESKTOP=sway +export MOZ_ENABLE_WAYLAND=1 + +case "$TERM" in + screen-256color) export PS1='\[\033[1;35m\]\d \t ${debian_chroot:+($debian_chroot)}\[\033[0;55m\]\H\[\033[00m\]:\[\033[01;55m\]\w\[\033[00m\]\n\$ ' && alias ls='ls --color=auto';; +esac + +############################## +# ssh auth sock +auth_sock_dir="${HOME}/.config/ssh" +auth_sock_log="/tmp/ssh_auth_sock" +if [[ ! -d "$auth_sock_dir" ]]; then + mkdir -p "$auth_sock_dir" +fi +ssh_auth_link="${auth_sock_dir}/ssh_auth_sock" +pgrep ssh-agent &>/dev/null +if [[ "$?" == "1" ]]; then + eval "$(ssh-agent &>"$auth_sock_log")" + if [[ -L "$ssh_auth_link" ]]; then + rm "$ssh_auth_link" + fi + if [[ -z "$SSH_AUTH_SOCK" ]]; then + printf 'Something went wrong with ssh-agent:\n' >&2 + cat "$auth_sock_log" >&2 + else + ln -s "$SSH_AUTH_SOCK" "$ssh_auth_link" + fi +else + [[ -L "${ssh_auth_link}" ]] && [[ -e "${ssh_auth_link}" ]] && export SSH_AUTH_SOCK="$ssh_auth_link" +fi diff --git a/tmux_control b/tmux_control new file mode 100755 index 0000000..bdf0e8d --- /dev/null +++ b/tmux_control @@ -0,0 +1,128 @@ +#!/usr/bin/env bash + +function link_or_rm() { + local env="$1" + local tmp="$2" + if [[ -z "${env}" ]]; then + # No auth sock; remove symlink, if any. + rm -f -- "${tmp}" + elif [[ "${env}" != "${tmp}" ]]; then + # Construct expected symlink to point to auth sock. + ln -snf -- "${env}" "${tmp}" + fi +} + +# Get invocation, stx or mtx +zero="$0" +invocation=$(basename "$zero") + +case "$invocation" in + tmux_control) + declare -a tmux_links + tmux_links=( stx mtx sx mx tls ) + for link in "${tmux_links[@]}"; do + if [[ ! -h "${HOME}/bin/${link}" ]]; then + ln -s "${HOME}/bin/tmux_control" "${HOME}/bin/${link}" + fi + done + echo 'stx or sx for inner sessions; mtx or mx for outer sessions, tls to list all sessions' >&2 + exit 1 + ;; + sx) + socket="tmux_${USER}_stx" + tmux -L "${socket}" "$@" + exit $? + ;; + mx) + socket="tmux_${USER}_mtx" + tmux -L "${socket}" "$@" + exit $? + ;; + tls) + declare -a sockets + readarray -d '' sockets < <(find "/tmp/tmux-$(id -u)" -maxdepth 1 -type s -print0) + for socket in ${sockets[*]}; do + printf '%s\n' "$socket" + tmux -L "${socket}" list-sessions | sed 's/^/ /' + done + exit 0 +esac + +socket="tmux_${USER}_${invocation}" + +style="inner" +if [[ "${invocation}" == mtx ]]; then + style="outer" +fi + +config="${HOME}/.tmux.conf_${style}" + +session_name="default" +if [[ -n $1 ]]; then + session_name="$1" +fi + +if [[ "$1" == "test" ]]; then + echo "invocation: ${invocation}" + echo "config: ${config}" + echo "session: ${session_name}" + exit 0 +fi + +if [[ ! -f "${config}" ]]; then + echo "Didn't find ${config}" >&2 + exit 1 +fi + +# Make the temp directory if it doesn't exist +home_sock_folder="${HOME}/.tmp" +if ! [ -d "${home_sock_folder}" ]; then + mkdir -m 700 "${home_sock_folder}" +fi + +# Symlinks to sockets that might change out from under tmux +if [[ -z "${TMUX}" ]] || [[ "$style" == "inner" && "$TMUX" =~ mtx ]]; then + ssh_auth_sock_symlink="${home_sock_folder}/ssh_auth_sock" + fwd_ssh_sock_symlink="${home_sock_folder}/fwd_ssh_auth_sock" + sway_sock_symlink="${home_sock_folder}/sway_sock" + i3_sock_symlink="${home_sock_folder}/i3_sock" + link_or_rm "${SSH_AUTH_SOCK}" "${ssh_auth_sock_symlink}" + link_or_rm "${FWD_SSH_AUTH_SOCK}" "${fwd_ssh_sock_symlink}" + # SWAYSOCK == I3SOCK, probably some Xwayland compatability thing + link_or_rm "${SWAYSOCK}" "${sway_sock_symlink}" + link_or_rm "${SWAYSOCK}" "${i3_sock_symlink}" + + # See if there are any sessions on this socket + echo running: tmux -L "${socket}" list-sessions + tmux -L "${socket}" list-sessions + echo results: $? + if [[ $? != 0 ]]; then + # No tmux session @ $socket + exec env \ + I3SOCK="${i3_sock_symlink}" \ + SWAYSOCK="${sway_sock_symlink}" \ + SSH_AUTH_SOCK="${ssh_auth_sock_symlink}" \ + FWD_SSH_AUTH_SOCK="${f}" \ + tmux -f "${config}" -L "${socket}" ${args} new-session -s "${session_name}" + + elif tmux -L "${socket}" list-sessions 2>/dev/null | grep "^${session_name}:" &>/dev/null; then + # A named session exists + exec env \ + I3SOCK="${i3_sock_symlink}" \ + SWAYSOCK="${sway_sock_symlink}" \ + SSH_AUTH_SOCK="${ssh_auth_sock_symlink}" \ + FWD_SSH_AUTH_SOCK="${f}" \ + tmux -f "${config}" -L "${socket}" ${args} attach -t "${session_name}" + else + # Some session lives at that socket but it's a different name than is given + exec env \ + I3SOCK="${i3_sock_symlink}" \ + SWAYSOCK="${sway_sock_symlink}" \ + SSH_AUTH_SOCK="${ssh_auth_sock_symlink}" \ + FWD_SSH_AUTH_SOCK="${f}" \ + tmux -f "${config}" -L "${socket}" ${args} new-session -s "${session_name}" + fi +else + echo "Already in a tmux session. Giving up." + exit 1 +fi