Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d0316e45b5 | |||
| 526ad252b0 | |||
| 5bed5f7746 | |||
| 59a5c0bbf8 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -126,4 +126,4 @@
|
||||
# http://gitfu.wordpress.com/2008/04/20/git-rerere-rereremember-what-you-did-last-time/
|
||||
enabled = true
|
||||
[include]
|
||||
path = .gitconfig.user
|
||||
path = ~/.gitconfig.user
|
||||
|
||||
+74
-14
@@ -30,7 +30,11 @@ PERSONAL_FILES=(
|
||||
.zprofile .zshenv .zshrc
|
||||
)
|
||||
|
||||
# Directories deployed wholesale to $HOME/<dir>/.
|
||||
# Directories whose contents are merged into $HOME/<dir>/, file by file. Files
|
||||
# the repo provides replace conflicting on-disk versions (with the displaced
|
||||
# version preserved in $BACKUP_DIR); files outside the repo's tree are left
|
||||
# untouched. This deliberately avoids wholesale-replacing $HOME/.local etc.,
|
||||
# which would sweep away unrelated user data (fonts, app state, ...).
|
||||
PERSONAL_DIRS=(
|
||||
.fonts .irssi .nano .themes .local .mplayer
|
||||
)
|
||||
@@ -83,31 +87,80 @@ else
|
||||
fi
|
||||
|
||||
# 3. Deploy personal dotfiles
|
||||
backup_one() {
|
||||
local src_name="$1"
|
||||
local dst="$HOME/$src_name"
|
||||
|
||||
# Move $HOME/<rel> aside into $BACKUP_DIR, preserving its sub-path.
|
||||
backup_one_path() {
|
||||
local rel="$1"
|
||||
local dst="$HOME/$rel"
|
||||
if [ -e "$dst" ] || [ -L "$dst" ]; then
|
||||
mkdir -p "$BACKUP_DIR/$(dirname "$src_name")"
|
||||
mv "$dst" "$BACKUP_DIR/$src_name"
|
||||
mkdir -p "$BACKUP_DIR/$(dirname "$rel")"
|
||||
mv "$dst" "$BACKUP_DIR/$rel"
|
||||
fi
|
||||
}
|
||||
|
||||
deploy_one() {
|
||||
local name="$1"
|
||||
local src="$YADR_DIR/$name"
|
||||
local dst="$HOME/$name"
|
||||
# Returns 0 iff $1 and $2 are equivalent (same symlink target, or identical
|
||||
# regular-file content). Used to make re-runs idempotent: unchanged files get
|
||||
# skipped instead of needlessly backed up.
|
||||
paths_equivalent() {
|
||||
local a="$1" b="$2"
|
||||
if [ -L "$a" ] && [ -L "$b" ]; then
|
||||
[ "$(readlink "$a")" = "$(readlink "$b")" ]
|
||||
elif [ -L "$a" ] || [ -L "$b" ]; then
|
||||
return 1
|
||||
elif [ -f "$a" ] && [ -f "$b" ]; then
|
||||
cmp -s "$a" "$b"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Deploy one file or symlink at $YADR_DIR/<rel> to $HOME/<rel>. If a different
|
||||
# file/symlink is already at the destination, it's moved into $BACKUP_DIR first.
|
||||
deploy_file() {
|
||||
local rel="$1"
|
||||
local src="$YADR_DIR/$rel"
|
||||
local dst="$HOME/$rel"
|
||||
if [ ! -e "$src" ] && [ ! -L "$src" ]; then
|
||||
return
|
||||
fi
|
||||
backup_one "$name"
|
||||
if paths_equivalent "$src" "$dst"; then
|
||||
return
|
||||
fi
|
||||
backup_one_path "$rel"
|
||||
mkdir -p "$(dirname "$dst")"
|
||||
cp -a "$src" "$dst"
|
||||
info "$name"
|
||||
info "$rel"
|
||||
}
|
||||
|
||||
# Deploy a directory by walking its tree and deploying each file/symlink in
|
||||
# turn. Directories get mkdir'd; existing entries inside $HOME/<rel> that the
|
||||
# repo doesn't know about are left alone. This is the merge semantics that
|
||||
# protects e.g. $HOME/.local/share/fonts from being clobbered when the repo
|
||||
# only tracks $HOME/.local/bin.
|
||||
deploy_dir() {
|
||||
local rel="$1"
|
||||
local src="$YADR_DIR/$rel"
|
||||
if [ ! -d "$src" ] || [ -L "$src" ]; then
|
||||
return
|
||||
fi
|
||||
mkdir -p "$HOME/$rel"
|
||||
local sub sub_rel src_path
|
||||
while IFS= read -r -d '' sub; do
|
||||
sub="${sub#./}"
|
||||
[ "$sub" = "." ] && continue
|
||||
sub_rel="$rel/$sub"
|
||||
src_path="$YADR_DIR/$sub_rel"
|
||||
if [ -d "$src_path" ] && [ ! -L "$src_path" ]; then
|
||||
mkdir -p "$HOME/$sub_rel"
|
||||
continue
|
||||
fi
|
||||
deploy_file "$sub_rel"
|
||||
done < <(cd "$src" && find . -mindepth 1 -print0)
|
||||
}
|
||||
|
||||
log "Deploying personal dotfiles"
|
||||
for f in "${PERSONAL_FILES[@]}"; do deploy_one "$f"; done
|
||||
for d in "${PERSONAL_DIRS[@]}"; do deploy_one "$d"; done
|
||||
for f in "${PERSONAL_FILES[@]}"; do deploy_file "$f"; done
|
||||
for d in "${PERSONAL_DIRS[@]}"; do deploy_dir "$d"; done
|
||||
|
||||
# .local/bin/claude is a relative symlink to ../share/claude/versions/...
|
||||
# If that target isn't present on this machine, remove the dangling link so
|
||||
@@ -137,6 +190,13 @@ if [ -d "$HOME/.local/bin" ]; then
|
||||
find "$HOME/.local/bin" -maxdepth 1 -type f -exec chmod +x {} \; 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# 5. Refresh font cache so newly-deployed .fonts/ and .local/share/fonts/
|
||||
# entries are visible to apps without a logout/login.
|
||||
if have fc-cache; then
|
||||
log "Refreshing font cache"
|
||||
fc-cache -f >/dev/null 2>&1 || warn "fc-cache returned non-zero; continuing"
|
||||
fi
|
||||
|
||||
echo
|
||||
log "Done."
|
||||
if [ -d "$BACKUP_DIR" ]; then
|
||||
|
||||
-102
@@ -1,102 +0,0 @@
|
||||
# Ring the bell if any background window rang a bell
|
||||
set -g bell-action any
|
||||
|
||||
# Default termtype. If the rcfile sets $TERM, that overrides this value.
|
||||
set -g default-terminal screen-256color
|
||||
|
||||
# Keep your finger on ctrl, or don't
|
||||
bind-key ^D detach-client
|
||||
|
||||
# Create splits and vertical splits
|
||||
bind-key v split-window -h -p 50 -c "#{pane_current_path}"
|
||||
bind-key ^V split-window -h -p 50 -c "#{pane_current_path}"
|
||||
bind-key s split-window -p 50 -c "#{pane_current_path}"
|
||||
bind-key ^S split-window -p 50 -c "#{pane_current_path}"
|
||||
|
||||
# Pane resize in all four directions using vi bindings.
|
||||
# Can use these raw but I map them to shift-ctrl-<h,j,k,l> in iTerm.
|
||||
bind -r H resize-pane -L 5
|
||||
bind -r J resize-pane -D 5
|
||||
bind -r K resize-pane -U 5
|
||||
bind -r L resize-pane -R 5
|
||||
|
||||
# Smart pane switching with awareness of Vim splits.
|
||||
# See: https://github.com/christoomey/vim-tmux-navigator
|
||||
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
|
||||
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
|
||||
bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
|
||||
bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
|
||||
bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
|
||||
bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
|
||||
|
||||
tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
|
||||
if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
|
||||
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'"
|
||||
if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
|
||||
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'"
|
||||
|
||||
bind-key -T copy-mode-vi 'C-h' select-pane -L
|
||||
bind-key -T copy-mode-vi 'C-j' select-pane -D
|
||||
bind-key -T copy-mode-vi 'C-k' select-pane -U
|
||||
bind-key -T copy-mode-vi 'C-l' select-pane -R
|
||||
bind-key -T copy-mode-vi 'C-\' select-pane -l
|
||||
|
||||
# Use vi keybindings for tmux commandline input.
|
||||
# Note that to get command mode you need to hit ESC twice...
|
||||
set -g status-keys vi
|
||||
|
||||
# Use vi keybindings in copy and choice modes
|
||||
setw -g mode-keys vi
|
||||
|
||||
# easily toggle synchronization (mnemonic: e is for echo)
|
||||
# sends input to all panes in a given window.
|
||||
bind e setw synchronize-panes on
|
||||
bind E setw synchronize-panes off
|
||||
|
||||
# set first window to index 1 (not 0) to map more to the keyboard layout...
|
||||
set-option -g base-index 1
|
||||
set-window-option -g pane-base-index 1
|
||||
set-window-option -g mouse on
|
||||
|
||||
# color scheme (styled as vim-powerline)
|
||||
set -g status-left-length 52
|
||||
set -g status-right-length 451
|
||||
set -g status-style fg=white,bg=colour234
|
||||
set -g pane-border-style fg=colour245
|
||||
set -g pane-active-border-style fg=colour39
|
||||
set -g message-style fg=colour16,bg=colour221,bold
|
||||
set -g status-left '#[fg=colour235,bg=colour252,bold] ❐ #S #[fg=colour252,bg=colour238,nobold]⮀#[fg=colour245,bg=colour238,bold] #(whoami) #[fg=colour238,bg=colour234,nobold]⮀'
|
||||
set -g window-status-format '#[fg=colour235,bg=colour252,bold] #I #(pwd="#{pane_current_path}"; echo ${pwd####*/}) #W '
|
||||
set -g window-status-current-format '#[fg=colour234,bg=colour39]⮀#[fg=black,bg=colour39,noreverse,bold] #{?window_zoomed_flag,#[fg=colour228],} #I #(pwd="#{pane_current_path}"; echo ${pwd####*/}) #W #[fg=colour39,bg=colour234,nobold]⮀'
|
||||
set-option -g status-interval 2
|
||||
|
||||
# Patch for OS X pbpaste and pbcopy under tmux.
|
||||
set-option -g default-command "which reattach-to-user-namespace > /dev/null && reattach-to-user-namespace -l $SHELL || $SHELL"
|
||||
|
||||
# Screen like binding
|
||||
unbind C-b
|
||||
set -g prefix C-a
|
||||
bind a send-prefix
|
||||
|
||||
# No escape time for vi mode
|
||||
set -sg escape-time 0
|
||||
|
||||
# Screen like binding for last window
|
||||
unbind l
|
||||
bind C-a last-window
|
||||
|
||||
# Bigger history
|
||||
set -g history-limit 10000
|
||||
|
||||
# New windows/pane in $PWD
|
||||
bind c new-window -c "#{pane_current_path}"
|
||||
|
||||
# Fix key bindings broken in tmux 2.1
|
||||
set -g assume-paste-time 0
|
||||
|
||||
# force a reload of the config file
|
||||
unbind r
|
||||
bind r source-file ~/.tmux.conf \; display "Reloaded!"
|
||||
|
||||
# Local config
|
||||
if-shell "[ -f ~/.tmux.conf.user ]" 'source ~/.tmux.conf.user'
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../.tmux.conf
|
||||
@@ -1,3 +1,4 @@
|
||||
source $HOME/.zprezto/runcoms/zshrc
|
||||
|
||||
for config_file ($HOME/.yadr/zsh/*.zsh) source $config_file
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
|
||||
Reference in New Issue
Block a user