chezmoi v2: omz + p10k + fzf + vi-mode zsh, tmux, per-account gitconfig (#612)

Rewrote the Aug-1 sandbox-era source into a full workstation setup for
both ultix-streaming accounts: oh-my-zsh with autosuggestions/
syntax-highlighting/completions + powerlevel10k (pinned externals),
fzf wiring, vi mode, tmux conf, aliases under ~/.config/zsh, gitconfig
template that keeps hooksPath/tea for reachableceo only.

Detail + verification: https://projects.knownelement.com/issues/612#note-3335
This commit is contained in:
2026-09-01 11:40:44 -05:00
parent 4d6b2262c9
commit b28f38d4c0
10 changed files with 260 additions and 165 deletions
+37
View File
@@ -0,0 +1,37 @@
# oh-my-zsh + custom plugins/themes, fetched at apply time.
# Tag archives = pinned; branch archives re-check per refreshPeriod.
# NOTE: no "exact" on .oh-my-zsh so custom/ additions survive refresh.
[".oh-my-zsh"]
type = "archive"
url = "https://github.com/ohmyzsh/ohmyzsh/archive/refs/heads/master.tar.gz"
stripComponents = 1
refreshPeriod = "720h"
[".oh-my-zsh/custom/plugins/zsh-autosuggestions"]
type = "archive"
url = "https://github.com/zsh-users/zsh-autosuggestions/archive/refs/tags/v0.7.1.tar.gz"
stripComponents = 1
exact = true
refreshPeriod = "720h"
[".oh-my-zsh/custom/plugins/zsh-syntax-highlighting"]
type = "archive"
url = "https://github.com/zsh-users/zsh-syntax-highlighting/archive/refs/heads/master.tar.gz"
stripComponents = 1
exact = true
refreshPeriod = "720h"
[".oh-my-zsh/custom/plugins/zsh-completions"]
type = "archive"
url = "https://github.com/zsh-users/zsh-completions/archive/refs/heads/master.tar.gz"
stripComponents = 1
exact = true
refreshPeriod = "720h"
[".oh-my-zsh/custom/themes/powerlevel10k"]
type = "archive"
url = "https://github.com/romkatv/powerlevel10k/archive/refs/heads/master.tar.gz"
stripComponents = 1
exact = true
refreshPeriod = "720h"
+1
View File
@@ -0,0 +1 @@
.crush/
+37
View File
@@ -0,0 +1,37 @@
# dotfiles
Chezmoi-managed dotfiles for the ultix-streaming (VM 5111) human
accounts: `reachableceo` and `reachableceo-offstage`.
- Redmine work item: https://projects.knownelement.com/issues/612
- Discourse doc (design + rationale):
https://community.turnsys.com/t/314
## What's managed
- `~/.zshrc` — oh-my-zsh + powerlevel10k + autosuggestions /
syntax-highlighting / completions, vi mode, fzf, history prefs
- `~/.config/zsh/` — aliases.sh, variables.sh (personal snippets)
- `~/.p10k.zsh` — lean theme, compatible glyphs (run `p10k configure`
on a nerd-font terminal to upgrade)
- `~/.tmux.conf` — Ctrl-a prefix, mouse, vi copy mode
- `~/.vimrc`, `~/.gitconfig` (template: hooksPath + tea helper render
only for `reachableceo`)
- `~/.config/crush/crush.json`
oh-my-zsh, plugins, and powerlevel10k come from pinned archives via
`.chezmoiexternal.toml` (chezmoi fetches them at apply time).
## Usage
chezmoi apply # apply changes (source: ~/projects/dotfiles)
chezmoi edit <file> # edit a managed file in the source
chezmoi re-add # refresh source from live state
Edit source -> `chezmoi apply` -> commit -> push.
`reachableceo-offstage` applies from a local clone (no gitea creds on
that account); refresh it as root:
sudo cp -r ~reachableceo/projects/dotfiles ~reachableceo-offstage/projects/
sudo chown -R reachableceo-offstage:reachableceo-offstage ~reachableceo-offstage/projects/dotfiles
+9 -17
View File
@@ -1,22 +1,14 @@
[user] [user]
email = reachableceo@turnsys.com name = reachableceo
name = Charles N Wyble email = charles@turnsys.com
[filter "lfs"] {{ if eq .chezmoi.username "reachableceo" -}}
clean = git-lfs clean -- %f [credential "https://git.knownelement.com"]
smudge = git-lfs smudge -- %f helper =
process = git-lfs filter-process helper = !tea login helper
required = true [core]
[credential "https://reachableceo.com"] hooksPath = /home/reachableceo/projects/ukrrs/TSYSGroupAIOS/hooks/global
provider = generic {{- end }}
[credential "https://handbook.turnsys.com"]
provider = generic
[credential "https://shopbook.startinglineproductions.com"]
provider = generic
[alias] [alias]
lg1 = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all lg1 = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1" lg = !"git lg1"
[http]
sslVerify = false
[oh-my-zsh]
hide-status = 1
+17
View File
@@ -0,0 +1,17 @@
# p10k — lean, compatible glyphs (no nerd font required on fresh hosts).
# Run `p10k configure` on a nerd-font terminal for the full treatment;
# it will rewrite this file.
typeset -g POWERLEVEL9K_MODE=compatible
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir vcs)
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time background_jobs time)
typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=false
typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=3
typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique
typeset -g POWERLEVEL9K_VCS_SHORTEN_STRATEGY=truncate_to_unique
typeset -g POWERLEVEL9K_VCS_SHORTEN_MAX_LENGTH=40
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3
typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M}'
typeset -g POWERLEVEL9K_STATUS_VERBOSE=false
+33
View File
@@ -0,0 +1,33 @@
# ~/.tmux.conf — chezmoi-managed. Ctrl-a prefix, mouse, vi copy mode.
unbind C-b
set -g prefix C-a
bind C-a send-prefix
set -g mouse on
set -g history-limit 100000
set -g default-terminal "tmux-256color"
set -ga terminal-overrides ",xterm-256color:RGB"
set -sg escape-time 10
set -g focus-events on
set -g base-index 1
setw -g pane-base-index 1
set -g renumber-windows on
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
setw -g mode-keys vi
bind -T copy-mode-vi v send -X begin-selection
bind -T copy-mode-vi y send -X copy-selection-and-cancel
set -g status-style "bg=default,fg=default"
set -g status-left "#[fg=cyan,bold][#S] "
set -g status-right "#[fg=cyan]%H %Y-%m-%d %H:%M "
set -g status-right-length 50
+82 -99
View File
@@ -1,132 +1,115 @@
#CNW Customized zshrc # CNW zshrc — chezmoi-managed (dotfiles repo, Redmine #612)
# Home base: ultix-streaming (VM 5111). Minimal interactive footprint
# Last updated 2025-01-14 # anywhere else; heavy lifting happens in containers.
#
# This is running on ultix-sandbox. That is my peramment home/base of operations. # Layers: oh-my-zsh + powerlevel10k, fzf, vi mode, ~/.config/zsh/* snippets.
# I try to minimize interactive shell use on other systems and do everything via gitops or termix
# This files merges :
# - my own creature comforts/wants
# along with stuff from
# - oh-my-zsh installer
# - powerline
# - powerlevl10k
# Oh-my-zsh
#####################################################################
# oh-my-zsh
#####################################################################
export ZSH="$HOME/.oh-my-zsh" export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="robbyrussell" ZSH_THEME="powerlevel10k/powerlevel10k"
# externals in .chezmoiexternal.toml own updates
zstyle ':omz:update' mode disabled
ENABLE_CORRECTION="true" ENABLE_CORRECTION="true"
DISABLE_UNTRACKED_FILES_DIRTY="true" DISABLE_UNTRACKED_FILES_DIRTY="true"
HIST_STAMPS="yyyy-mm-dd" HIST_STAMPS="yyyy-mm-dd"
plugins=(git)
plugins=(
git
sudo
z
extract
copypath
colored-man-pages
command-not-found
zsh-completions
zsh-autosuggestions
zsh-syntax-highlighting
)
source $ZSH/oh-my-zsh.sh source $ZSH/oh-my-zsh.sh
# powerlevel10k (run `p10k configure` any time for the fancy wizard)
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
#####################################################################
###################################################################################################################################
# CNW configuration from here
###################################################################################################################################
#############################
#############################
# Creature comforts # Creature comforts
############################# #####################################################################
#############################
######### # vi mode, 24x7 — this isn't a holiday inn
#VIM MODE bindkey -v
######### export KEYTIMEOUT=1
#vi 24x7 yo, this isn't a holiday inn (ti was last night, it isn't now)
bindkey -v # vi key bindings
set -o vi set -o vi
export EDITOR='vim'
export VISUAL='vim'
export PAGER='less'
export LESS='-R'
if [[ -n $SSH_CONNECTION ]]; then # Debian's fd-find ships fdfind; make it fd
export EDITOR='vim' command -v fdfind >/dev/null 2>&1 && alias fd='fdfind'
else # Debian's bat ships batcat
export EDITOR='vim' command -v batcat >/dev/null 2>&1 && alias bat='batcat'
fi
################################### #####################################################################
################################### # History
# History configurations #####################################################################
###################################
###################################
HISTFILE=~/.zsh_history HISTFILE=~/.zsh_history
HISTSIZE=10000 HISTSIZE=10000
SAVEHIST=50000000 #Number of history entries to save to disk SAVEHIST=50000
HIST_STAMPS="mm/dd/yyyy" setopt hist_expire_dups_first
setopt hist_expire_dups_first # delete duplicates first when HISTFILE size exceeds HISTSIZE setopt hist_ignore_dups
setopt hist_ignore_dups # ignore duplicated commands history list setopt hist_verify
HISTDUP=erase #Erase duplicates in the history file setopt appendhistory
setopt hist_verify # show command with history expansion to user before running it setopt incappendhistory
setopt appendhistory #Append history to the history file (no overwriting) HISTDUP=erase
setopt incappendhistory #Immediately append to the history file, not just when a term is killed alias history="history 0"
alias history="history 0" # force zsh to show the complete history # DO NOT share history across terminals
#DO NOT Share history across terminals
setopt no_share_history setopt no_share_history
unsetopt sharehistory unsetopt sharehistory
TIMEFMT=$'\nreal\t%E\nuser\t%U\nsys\t%S\ncpu\t%P' # configure `time` format TIMEFMT=$'\nreal\t%E\nuser\t%U\nsys\t%S\ncpu\t%P'
#####################################################################
# fzf (Debian package paths)
#####################################################################
################################### if [[ -r /usr/share/doc/fzf/examples/key-bindings.zsh ]]; then
################################### source /usr/share/doc/fzf/examples/key-bindings.zsh
# SSH related things fi
################################### if [[ -r /usr/share/doc/fzf/examples/completion.zsh ]]; then
################################### source /usr/share/doc/fzf/examples/completion.zsh
fi
export FZF_DEFAULT_COMMAND='fdfind --type f --hidden --follow --exclude .git 2>/dev/null || rg --files --hidden --glob "!.git" 2>/dev/null'
command -v fdfind >/dev/null 2>&1 && _fzf_compgen_path() { fdfind --hidden --follow --exclude .git . "$1" 2>/dev/null; }
###################### #####################################################################
# Bitwarden SSH Agent # SSH agent — bitwarden agent socket if present (path per-host)
###################### #####################################################################
export SSH_AUTH_SOCK=/home/charles/.bitwarden-ssh-agent.sock if [[ -S "$HOME/.bitwarden-ssh-agent.sock" ]]; then
export SSH_AUTH_SOCK="$HOME/.bitwarden-ssh-agent.sock"
fi
#####################################################################
# Paths and loaders (conditional — hosts without these skip)
#####################################################################
################################### [[ -r "$HOME/.cargo/env" ]] && . "$HOME/.cargo/env"
###################################
# Paths and loaders
###################################
###################################
#######
# Rust
#######
. "$HOME/.cargo/env"
#######
# MISE
#######
if command -v mise &> /dev/null; then if command -v mise &> /dev/null; then
eval "$(mise activate zsh)" eval "$(mise activate zsh)"
fi fi
#####################################################################
# Personal snippets (also chezmoi-managed)
#####################################################################
################################### [[ -r "$HOME/.config/zsh/variables.sh" ]] && source "$HOME/.config/zsh/variables.sh"
################################### [[ -r "$HOME/.config/zsh/aliases.sh" ]] && source "$HOME/.config/zsh/aliases.sh"
#Aliases...
###################################
###################################
source ~/Projects/ReachableCEO/dotfiles/zsh-configs/reachableceo-zshrc-aliases.sh
+8 -5
View File
@@ -1,8 +1,11 @@
{ {
"$schema": "https://charm.land/crush.json", "hooks": {
"options": { "PreToolUse": [
"attribution": { {
"trailer_style": "none" "matcher": "^(bash|edit|write|multiedit|lsp_replace_symbol|lsp_rename)$",
} "command": "/home/reachableceo/projects/ukrrs/TSYSGroupAIOS/hooks/global/ticket-gate.sh",
"timeout": 5
}
]
} }
} }
@@ -1,4 +1,6 @@
###################################
# ~/.config/zsh/aliases.sh — chezmoi-managed
###################################
################################### ###################################
#Marp #Marp
@@ -17,7 +19,6 @@ alias marp-serve='docker run --rm --init -v $PWD:/home/marp/app -e LANG=$LANG -p
alias cloudron='mise exec node@22 -- cloudron login' alias cloudron='mise exec node@22 -- cloudron login'
################################################### ###################################################
# SSH shortcuts # SSH shortcuts
################################################### ###################################################
@@ -30,52 +31,33 @@ alias hearth-bds='ssh charles@hearth-bds.thefnf.net'
alias hearth-uds='ssh charles@hearth-uds.thefnf.net' alias hearth-uds='ssh charles@hearth-uds.thefnf.net'
##################################################### #####################################################
#PFV HOSTS ##################################################### #PFV HOSTS
#####################################################
#Bare metal systems (in band access) - Production #Bare metal systems (in band access) - Production
#Upstairs, production #Upstairs, production
alias ausprod-core-ap01='telnet ausprod-core-ap01.turnsys.net' alias ausprod-core-ap01='telnet ausprod-core-ap01.turnsys.net'
alias ausprod-core-sw01='telnet ausprod-core-sw01.turnsys.net' alias ausprod-core-sw01='telnet ausprod-core-sw01.turnsys.net'
#alias netbox='ssh -i $PATH_TO_KEY $LABUSER@netbox.dev.thefnf.net' #gns3 with ios/juniper/comware/extreme os/tinycore/openflow (ALL THE NETWORK THINGS)
#alias cudasys='ssh -i $PATH_TO_KEY $LABUSER@cudasys.dev.thefnf.net' #cuda awesomeness
########################################################### ###########################################################
#Inband access (ssh/telnet) # # Project context aliases (StartProject.sh when present)
###########################################################
#alias rr-con-sw4='ssh $RRLABUSER:7003@ausprod.consrv.turnsys.net'
#alias rr-con-r7='ssh $RRLABUSER:7021@ausprod-consrv.turnsys.net'
#TBDalias rr-con-r8='ssh $RRLABUSER:7021@ausprod-consrv.turnsys.net'
#TBDalias rr-con-r10='ssh $RRLABUSER:7021@ausprod-consrv.turnsys.net'
########################################################### ###########################################################
alias context-docs-techops='StartProject.sh $HOME/code/techops/docs-techops'
alias context-notes-public='StartProject.sh $HOME/notes-public'
alias context-docs-subo='StartProject.sh $HOME/code/RD/docs-suborbital'
alias context-docs-rr='StartProject.sh $HOME/code/RD/docs-rackrental'
alias context-dotfiles='StartProject.sh $HOME/projects/dotfiles'
alias context-tsys-dev='StartProject.sh $HOME/code/techops/tsys-dev'
########################################################### alias context-rd-MorseFlyer='StartProject.sh $HOME/RD/Morse/Internal/'
# Project context aliases
###########################################################
### Documentaton alias context-services-bizops='StartProject.sh $HOME/code/techops/ITBackOfficeFLOStack'
alias context-docs-techops='StartProject.sh ~/charles/code/techops/docs-techops'
alias context-notes-public='StartProject.sh ~/charles/notes-public'
alias context-docs-subo='StartProject.sh ~/charles/code/RD/docs-suborbital'
alias context-docs-rr='StartProject.sh ~/charles/code/RD/docs-rackrental'
### Configs
alias context-dotfiles='StartProject.sh ~/charles/dotfiles-git'
alias context-tsys-dev='StartProject.sh ~/charles/code/techops/tsys-dev'
### Code - internal
alias context-rd-MorseFlyer='StartProject.sh ~/charles/RD/Morse/Internal/'
### Code - BizOps/TechOps
alias context-services-bizops='StartProject.sh ~/charles/code/techops/ITBackOfficeFLOStack'
############################################################## ##############################################################
#Docker / k8s aliases, cause i'm a docker/kubefarm fanboi now #Docker / k8s aliases, cause i'm a docker/kubefarm fanboi now
############################################################## ##############################################################
## Most docker/k8s use is via vscode now, but somtimes you wanna drop to a shell and do some stuff...
alias dc='docker-compose' alias dc='docker-compose'
alias dcu='docker compose up' alias dcu='docker compose up'
alias dcd='docker compose down' alias dcd='docker compose down'
@@ -97,7 +79,6 @@ alias k0-dqu-gp='export KUBECONFIG=~/.kube/custom-contexts/context-dqu-config.ym
alias k0-prod-gn='export KUBECONFIG=~/.kube/custom-contexts/context-prod-config.yml ; kgn' alias k0-prod-gn='export KUBECONFIG=~/.kube/custom-contexts/context-prod-config.yml ; kgn'
alias k0-prod-gp='export KUBECONFIG=~/.kube/custom-contexts/context-prod-config.yml ; kgp' alias k0-prod-gp='export KUBECONFIG=~/.kube/custom-contexts/context-prod-config.yml ; kgp'
############################################################# #############################################################
# Command aliases... # Command aliases...
############################################################# #############################################################
@@ -110,14 +91,22 @@ alias vi='vim'
alias id0='sudo -i' alias id0='sudo -i'
alias ls='ls --color' alias ls='ls --color=auto'
alias grep='rg --color auto' alias grep='grep --color=auto'
alias wget='wget --no-check-certificate'
alias curl='curl --insecure'
alias cls='clear ; ls' alias cls='clear ; ls'
# eza comforts (ll/la/tree-ish) when present
if command -v eza >/dev/null 2>&1; then
alias ll='eza -l --git --group-directories-first'
alias la='eza -la --git --group-directories-first'
alias lt='eza --tree --level=2 --group-directories-first'
fi
# ripgrep
alias rgi='rg -i'
#Git / git stuff #Git / git stuff
alias gup='git pull' alias gup='git pull'
alias lpom='git add -A :/ ; git commit -va' alias lpom='git add -A :/ ; git commit -va'
alias gpom=' git push --tags origin master' alias gpom='git push --tags origin master'
alias tesla='gup;lpom;gpom' alias tesla='gup;lpom;gpom'
@@ -1,3 +1,7 @@
###################################
# ~/.config/zsh/variables.sh — chezmoi-managed
###################################
##################################################### #####################################################
#Personal host variables #Personal host variables
##################################################### #####################################################
@@ -10,5 +14,4 @@ PERSONAL_OOB_USER="root"
PERSONAL_INBAND_USER="root" PERSONAL_INBAND_USER="root"
##################################################### #####################################################
export ATUIN_SYNC_ADDRESS=http://charlesdevserver.knel.net:2003
export LANG=en_US.UTF-8 export LANG=en_US.UTF-8