Commit Diff


commit - d14c9a0db672cd5c36115dc99313cb011929dbb4
commit + 24d85999d2fc8915aad15646326da25605ea3bee
blob - 42305fe90d50f021c9cf3b13443db25b478c1d1e
blob + 66dfff5b8f9a7347aeaf4ac06c595779ecc09fce
--- hosts/void/default.nix
+++ hosts/void/default.nix
@@ -174,6 +174,7 @@
       ugrep
       teip
       remind
+      zmx
     ];
 
     lsp = [
@@ -194,6 +195,7 @@
     lisp = [
       haunt
       gnu-shepherd
+      roswell
     ];
 
     lua = lib.concatLists [
blob - e49f7d0640ae9968947d4d5f725bc4aae227528c
blob + bf938e6ac21d43a61ba6ca00fdeb182a0e54b5db
Binary files hosts/work/default.nix and hosts/work/default.nix differ
blob - /dev/null
blob + eb3da54739097f6f57c3cc2580a50f7e52308d57 (mode 644)
--- /dev/null
+++ modules/mixins/dotfiles/config/bash/rc/zmx
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+if command -v zmx >/dev/null 2>&1; then
+	eval "$(zmx completions bash)"
+fi
blob - 4f269c8e6f4e31f84838071ab458104cb7dc1414
blob + cd9f31609dbd41cfdba9fd5488948d47e179fb97
--- modules/mixins/dotfiles/config/shell/rc/prompt-functions
+++ modules/mixins/dotfiles/config/shell/rc/prompt-functions
@@ -64,6 +64,11 @@ _prompt_host() {
 	_seg "$C_3" "$_HOSTNAME"
 }
 
+_prompt_zmx() {
+	[ -n "${ZMX_SESSION-}" ] || return
+	_seg "$C_6" "[$ZMX_SESSION]"
+}
+
 _prompt_takeover() {
 	owner=$(stat -c %U . 2>/dev/null) || return
 	if [ "$owner" = "$_UID_USER" ]; then
@@ -92,6 +97,7 @@ _get_ps1() {
 	host=$(_prompt_host)
 	take=$(_prompt_takeover)
 	nix=$(_prompt_nix)
+	zmx=$(_prompt_zmx)
 
 	l1="$_CORNER_TL$pwd"
 	if [ -n "$git" ]; then
@@ -105,6 +111,9 @@ _get_ps1() {
 	if [ -n "$host" ]; then
 		l2="$l2$sep$host"
 	fi
+	if [ -n "$zmx" ]; then
+		l2="$l2$sep$zmx"
+	fi
 	if [ -n "$take" ]; then
 		l2="$l2$sep$take"
 	fi
blob - /dev/null
blob + f6133448b065644915b0936535b3e7177a72db09 (mode 644)
--- /dev/null
+++ modules/mixins/dotfiles/config/shell/rc/zmx
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+alias zmls='zmx list'
+
+zx() {
+	if [ -n "${ZMX_SESSION-}" ]; then
+		printf 'already in zmx session %s; detach with ctrl+\\ first\n' \
+			"$ZMX_SESSION" >&2
+		return 1
+	fi
+
+	if [ $# -gt 0 ]; then
+		zmx attach "$1"
+		return
+	fi
+
+	tab=$(printf '\t')
+	sessions=$(zmx list 2>/dev/null | awk -v FS="$tab" '{
+		delete f
+		for (i = 1; i <= NF; i++) {
+			sub(/^[[:space:]]+/, "", $i)
+			key = substr($i, 1, index($i, "=") - 1)
+			f[key] = substr($i, index($i, "=") + 1)
+		}
+		printf "%-20s clients:%-2s %s\n", f["name"], f["clients"], f["start_dir"]
+	}')
+
+	result=$(printf '%s' "$sessions" | fzf --exact --print-query \
+		--preview 'zmx history {1} | tail -n 500' \
+		--preview-window 'right:60%')
+	fzf_exit=$?
+	[ $fzf_exit -eq 130 ] && return
+
+	selection=$(printf '%s' "$result" | tail -1)
+	[ -z "$selection" ] && return
+	session=${selection%% *}
+
+	zmx attach "$session"
+}
blob - /dev/null
blob + 4ea6306a04bc9a831e81ea0364d1381494b68499 (mode 644)
--- /dev/null
+++ modules/mixins/dotfiles/config/zsh/rc/zmx
@@ -0,0 +1,11 @@
+#!/bin/zsh
+
+if (( $+commands[zmx] )); then
+	eval "$(zmx completions zsh)"
+fi
+
+_zmx_title() {
+	[[ -n $ZMX_SESSION ]] || return
+	printf '\033]2;%s\007' "$ZMX_SESSION"
+}
+precmd_functions+=(_zmx_title)