diff --git a/etc/tmux-my/tmux-my.extra.conf b/etc/tmux-my/tmux-my.extra.conf new file mode 100644 index 0000000..beffd38 --- /dev/null +++ b/etc/tmux-my/tmux-my.extra.conf @@ -0,0 +1,2 @@ +set -g default-terminal $ZSH_TMUX_TERM +source $HOME/.tmux.conf diff --git a/etc/tmux-my/tmux-my.only.conf b/etc/tmux-my/tmux-my.only.conf new file mode 100644 index 0000000..0734df3 --- /dev/null +++ b/etc/tmux-my/tmux-my.only.conf @@ -0,0 +1 @@ +set -g default-terminal $ZSH_TMUX_TERM diff --git a/etc/tmux-my/tmux-my.plugin.zsh b/etc/tmux-my/tmux-my.plugin.zsh new file mode 100644 index 0000000..788d883 --- /dev/null +++ b/etc/tmux-my/tmux-my.plugin.zsh @@ -0,0 +1,106 @@ +# +# Aliases +# + +# Do not run in Docker container +which apt >/dev/null 2>&1 && return + +alias ta='tmux attach -t' +alias tad='tmux attach -d -t' +alias ts='tmux new-session -s' +alias tl='tmux list-sessions' +alias tksv='tmux kill-server' +alias tkss='tmux kill-session -t' + +# Only run if tmux is actually installed +if which tmux &> /dev/null + then + # Configuration variables + # + # Automatically start tmux + [[ -n "$ZSH_TMUX_AUTOSTART" ]] || ZSH_TMUX_AUTOSTART=false + # Only autostart once. If set to false, tmux will attempt to + # autostart every time your zsh configs are reloaded. + [[ -n "$ZSH_TMUX_AUTOSTART_ONCE" ]] || ZSH_TMUX_AUTOSTART_ONCE=true + # Automatically connect to a previous session if it exists + [[ -n "$ZSH_TMUX_AUTOCONNECT" ]] || ZSH_TMUX_AUTOCONNECT=true + # Automatically close the terminal when tmux exits + [[ -n "$ZSH_TMUX_AUTOQUIT" ]] || ZSH_TMUX_AUTOQUIT=$ZSH_TMUX_AUTOSTART + # Set term to screen or screen-256color based on current terminal support + [[ -n "$ZSH_TMUX_FIXTERM" ]] || ZSH_TMUX_FIXTERM=true + # Set '-CC' option for iTerm2 tmux integration + [[ -n "$ZSH_TMUX_ITERM2" ]] || ZSH_TMUX_ITERM2=false + # The TERM to use for non-256 color terminals. + # Tmux states this should be screen, but you may need to change it on + # systems without the proper terminfo + [[ -n "$ZSH_TMUX_FIXTERM_WITHOUT_256COLOR" ]] || ZSH_TMUX_FIXTERM_WITHOUT_256COLOR="screen" + # The TERM to use for 256 color terminals. + # Tmux states this should be screen-256color, but you may need to change it on + # systems without the proper terminfo + [[ -n "$ZSH_TMUX_FIXTERM_WITH_256COLOR" ]] || ZSH_TMUX_FIXTERM_WITH_256COLOR="screen-256color" + + + # Get the absolute path to the current directory + local zsh_tmux_plugin_path="$(cd "$(dirname "$0")" && pwd)" + + # Determine if the terminal supports 256 colors + if [[ `tput colors` == "256" ]] + then + export ZSH_TMUX_TERM=$ZSH_TMUX_FIXTERM_WITH_256COLOR + else + export ZSH_TMUX_TERM=$ZSH_TMUX_FIXTERM_WITHOUT_256COLOR + fi + + # Set the correct local config file to use. + if [[ "$ZSH_TMUX_ITERM2" == "false" ]] && [[ -f $HOME/.tmux.conf || -h $HOME/.tmux.conf ]] + then + #use this when they have a ~/.tmux.conf + export _ZSH_TMUX_FIXED_CONFIG="$zsh_tmux_plugin_path/tmux-my.extra.conf" + else + #use this when they don't have a ~/.tmux.conf + export _ZSH_TMUX_FIXED_CONFIG="$zsh_tmux_plugin_path/tmux-my.only.conf" + fi + + # Wrapper function for tmux. + function _zsh_tmux_plugin_run() + { + # We have other arguments, just run them + if [[ -n "$@" ]] + then + \tmux $@ + # Try to connect to an existing session. + elif [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] + then + SESSION=$(\tmux ls | grep -v attached | tail -n 1 | cut -d ':' -f 1) + \tmux `[[ "$ZSH_TMUX_ITERM2" == "true" ]] \ + && echo '-CC '` attach-session -t ${SESSION} \ + || \tmux `[[ "$ZSH_TMUX_ITERM2" == "true" ]] \ + && echo '-CC '` `[[ "$ZSH_TMUX_FIXTERM" == "true" ]] \ + && echo '-f '$_ZSH_TMUX_FIXED_CONFIG` new-session + [[ "$ZSH_TMUX_AUTOQUIT" == "true" ]] && exit + # Just run tmux, fixing the TERM variable if requested. + else + \tmux `[[ "$ZSH_TMUX_ITERM2" == "true" ]] && echo '-CC '` `[[ "$ZSH_TMUX_FIXTERM" == "true" ]] && echo '-f '$_ZSH_TMUX_FIXED_CONFIG` + [[ "$ZSH_TMUX_AUTOQUIT" == "true" ]] && exit + fi + } + + # Use the completions for tmux for our function + compdef _tmux _zsh_tmux_plugin_run + + # Alias tmux to our wrapper function. + alias tmux=_zsh_tmux_plugin_run + + # Autostart if not already in tmux and enabled. + if [[ ! -n "$TMUX" && "$ZSH_TMUX_AUTOSTART" == "true" ]] + then + # Actually don't autostart if we already did and multiple autostarts are disabled. + if [[ "$ZSH_TMUX_AUTOSTART_ONCE" == "false" || "$ZSH_TMUX_AUTOSTARTED" != "true" ]] + then + export ZSH_TMUX_AUTOSTARTED=true + _zsh_tmux_plugin_run + fi + fi +else + print "zsh tmux plugin: tmux not found. Please install tmux before using this plugin." +fi diff --git a/home-manager.nix b/home-manager.nix index 198c172..00ef474 100644 --- a/home-manager.nix +++ b/home-manager.nix @@ -20,11 +20,51 @@ in { key = "0x1525585D1B43C62A"; }; }; + + zsh = { + enable = true; + + oh-my-zsh = { + enable = true; + theme = "gentoo"; + plugins = [ "git" "cp" "tmux-my" ]; + custom = "$HOME/.oh-my-zsh-custom"; + }; + + sessionVariables = { + LC_ALL = "en_US.utf8"; + LIBVIRT_DEFAULT_URI = "qemu:///system"; + GOPATH = "\${HOME}"; + PATH = "\${PATH}:\${HOME}/bin"; + + GPG_TTY = "$(tty)"; + SSH_AUTH_SOCK = "$(gpgconf --list-dirs agent-ssh-socket)"; + + ZSH_TMUX_AUTOSTART = "true"; + ZSH_TMUX_AUTOCONNECT = "true"; + }; + + shellAliases = { + mutt = "neomutt"; + vim = "emacs -nw"; + emacs = "emacs -nw"; + clipimage = "xclip -selection clipboard -target image/png -out > out.png"; + }; + + initExtra = '' + gpgconf --launch gpg-agent + which apt >/dev/null 2>&1 && plugins=("\$\{(@)plugins:#tmux-my\}") + ''; + }; }; home.file = { ".emacs.d/init.el".source = ./etc/emacs.el; ".xmonad/xmonad.hs".source = ./etc/xmonad.hs; + + ".oh-my-zsh-custom/plugins/tmux-my/tmux-my.extra.conf".source = ./etc/tmux-my/tmux-my.extra.conf; + ".oh-my-zsh-custom/plugins/tmux-my/tmux-my.only.conf".source = ./etc/tmux-my/tmux-my.only.conf; + ".oh-my-zsh-custom/plugins/tmux-my/tmux-my.plugin.zsh".source = ./etc/tmux-my/tmux-my.plugin.zsh; }; xsession.enable = true;