Compare commits
1 Commits
main
...
generic-gi
Author | SHA1 | Date | |
---|---|---|---|
9618713542 |
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,4 +1,2 @@
|
|||||||
# Ignore all plugin files in subdirectories
|
# Ignore all plugin files in subdirectories
|
||||||
zsh-*/
|
*/
|
||||||
local
|
|
||||||
zsh*.local
|
|
||||||
|
@ -36,6 +36,8 @@ commands:
|
|||||||
[ -f $PWD/.enter ] && _autoenv_authorized $PWD/.enter yes
|
[ -f $PWD/.enter ] && _autoenv_authorized $PWD/.enter yes
|
||||||
# If exit script exists, authorize it.
|
# If exit script exists, authorize it.
|
||||||
[ -f $PWD/.exit ] && _autoenv_authorized $PWD/.exit yes
|
[ -f $PWD/.exit ] && _autoenv_authorized $PWD/.exit yes
|
||||||
|
# Edit the autoenv.
|
||||||
|
autoenv edit
|
||||||
# Enter the autoenv.
|
# Enter the autoenv.
|
||||||
_autoenv_enter $PWD
|
_autoenv_enter $PWD
|
||||||
;;
|
;;
|
||||||
@ -44,6 +46,8 @@ commands:
|
|||||||
if ! [ -f $PWD/.enter ] || ! [ -f $PWD/.exit ]; then
|
if ! [ -f $PWD/.enter ] || ! [ -f $PWD/.exit ]; then
|
||||||
echo '.enter or .exit not found'; return 1
|
echo '.enter or .exit not found'; return 1
|
||||||
fi
|
fi
|
||||||
|
# If vim exists, edit enter and exit scripts.
|
||||||
|
if which vim &> /dev/null; then
|
||||||
# Exit the autoenv before editing.
|
# Exit the autoenv before editing.
|
||||||
_autoenv_exit $PWD
|
_autoenv_exit $PWD
|
||||||
if $EDITOR -p $PWD/.enter $PWD/.exit; then
|
if $EDITOR -p $PWD/.enter $PWD/.exit; then
|
||||||
@ -54,6 +58,9 @@ commands:
|
|||||||
fi
|
fi
|
||||||
# Enter the autoenv.
|
# Enter the autoenv.
|
||||||
_autoenv_enter $PWD
|
_autoenv_enter $PWD
|
||||||
|
else
|
||||||
|
echo 'vim not found'; return 1
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
deinit) # Remove .enter and .exit scripts in current directory.
|
deinit) # Remove .enter and .exit scripts in current directory.
|
||||||
@ -137,22 +144,16 @@ zmodload -F zsh/stat b:zstat
|
|||||||
|
|
||||||
# Check if the given file is authorized, if not prompt the user to authorize,
|
# Check if the given file is authorized, if not prompt the user to authorize,
|
||||||
# ignore, or view the file. Authorized files and their modified times are
|
# ignore, or view the file. Authorized files and their modified times are
|
||||||
# stored in the $XDG_STATE_HOME/autoenv/authorized file to make authorization
|
# stored in the ~/.cache/autoenv/authorized file to make authorization
|
||||||
# persistent.
|
# persistent.
|
||||||
_autoenv_authorized() {
|
_autoenv_authorized() {
|
||||||
local file=$1 yes=$2
|
local file=$1 yes=$2
|
||||||
# If autoenv state directory does not exist, create it.
|
# If autoenv cache directory does not exist, create it.
|
||||||
! [ -d ${XDG_STATE_HOME:-$HOME/.local/state}/autoenv ] && \
|
! [ -d ~/.cache/autoenv ] && mkdir -p ~/.cache/autoenv
|
||||||
mkdir -p ${XDG_STATE_HOME:-$HOME/.local/state}/autoenv
|
|
||||||
# Migrate from cache to state directory
|
|
||||||
[ -f $HOME/.cache/autoenv/authorized ] && \
|
|
||||||
mv $HOME/.cache/autoenv/authorized \
|
|
||||||
${XDG_STATE_HOME:-$HOME/.local/state}/autoenv/authorized
|
|
||||||
# If the authorized file does not exist, create it.
|
# If the authorized file does not exist, create it.
|
||||||
! [ -f ${XDG_STATE_HOME:-$HOME/.local/state}/autoenv/authorized ] && \
|
! [ -f ~/.cache/autoenv/authorized ] && touch ~/.cache/autoenv/authorized
|
||||||
touch ${XDG_STATE_HOME:-$HOME/.local/state}/autoenv/authorized
|
|
||||||
# Load the authorized file into a map of authorized key value pairs.
|
# Load the authorized file into a map of authorized key value pairs.
|
||||||
typeset -A authorized=(`cat ${XDG_STATE_HOME:-$HOME/.local/state}/autoenv/authorized`)
|
typeset -A authorized=(`cat ~/.cache/autoenv/authorized`)
|
||||||
# If the file has been removed, return.
|
# If the file has been removed, return.
|
||||||
! [ -f $file ] && return 1
|
! [ -f $file ] && return 1
|
||||||
# If the given file has been authorized, i.e. the modified time matches that
|
# If the given file has been authorized, i.e. the modified time matches that
|
||||||
@ -174,7 +175,7 @@ _autoenv_authorized() {
|
|||||||
# Add file to the authorized map.
|
# Add file to the authorized map.
|
||||||
authorized[$file]=$modified_time
|
authorized[$file]=$modified_time
|
||||||
# Store authorized map in authorized file.
|
# Store authorized map in authorized file.
|
||||||
echo ${(kv)authorized} > ${XDG_STATE_HOME:-$HOME/.local/state}/autoenv/authorized
|
echo ${(kv)authorized} > ~/.cache/autoenv/authorized
|
||||||
}
|
}
|
||||||
|
|
||||||
# Source an enter script and add its directory to the global entered
|
# Source an enter script and add its directory to the global entered
|
||||||
|
@ -7,6 +7,7 @@ alias build="build-dir --build"
|
|||||||
# Detect installed debugger and set the `debug` alias to debug a program with
|
# Detect installed debugger and set the `debug` alias to debug a program with
|
||||||
# command line arguments.
|
# command line arguments.
|
||||||
if [ `uname` = Linux ]; then
|
if [ `uname` = Linux ]; then
|
||||||
|
if [[ "`vim --version|head -1|cut -c 19-21`" =~ "^8\.[123456789]$" ]]; then
|
||||||
autoload -U regexp-replace
|
autoload -U regexp-replace
|
||||||
function vimdebug() {
|
function vimdebug() {
|
||||||
# For each item in $* replace * and \* and then replace \ with \\
|
# For each item in $* replace * and \* and then replace \ with \\
|
||||||
@ -15,21 +16,22 @@ if [ `uname` = Linux ]; then
|
|||||||
regexp-replace arg '\*' '\\*'
|
regexp-replace arg '\*' '\\*'
|
||||||
args+=($arg)
|
args+=($arg)
|
||||||
done
|
done
|
||||||
nvim "+packadd termdebug" "+TermdebugCommand $args"
|
vim "+packadd termdebug" "+TermdebugCommand $args"
|
||||||
}
|
}
|
||||||
if command -v nvim &> /dev/null; then
|
alias debug='vimdebug'
|
||||||
alias debug=vimdebug
|
elif which cgdb &> /dev/null; then
|
||||||
elif command -v gdb &> /dev/null; then
|
alias debug='cgdb --args'
|
||||||
|
elif which gdb &> /dev/null; then
|
||||||
alias debug='gdb --args'
|
alias debug='gdb --args'
|
||||||
fi
|
fi
|
||||||
elif [ `uname` = Darwin ]; then
|
elif [ `uname` = Darwin ]; then
|
||||||
command -v lldb &> /dev/null && \
|
which lldb &> /dev/null && \
|
||||||
alias debug='lldb --'
|
alias debug='lldb --'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Interactively choose a `~build` directory for `build` to build.
|
# Interactively choose a `~build` directory for `build` to build.
|
||||||
build-dir() {
|
build-dir() {
|
||||||
local usage='usage: build-dir [-h] [-s] [--build] [<directory>]'
|
local usage='usage: build-dir [-h] [--build] [<directory>]'
|
||||||
local -a help show do_build
|
local -a help show do_build
|
||||||
zparseopts -D h=help -help=help s=show -show=show -build=do_build
|
zparseopts -D h=help -help=help s=show -show=show -build=do_build
|
||||||
if [[ -n $help ]]; then
|
if [[ -n $help ]]; then
|
||||||
@ -62,7 +64,7 @@ EOF
|
|||||||
local local_build_dir
|
local local_build_dir
|
||||||
if [[ ${#*} -gt 1 ]]; then
|
if [[ ${#*} -gt 1 ]]; then
|
||||||
echo $usage
|
echo $usage
|
||||||
error "unexpected positional arguments: ${*[2,${#*}]}"; return 1
|
error "unexpected position arguments: ${*[2,${#*}]}"; return 1
|
||||||
elif [[ ${#*} -eq 1 ]]; then
|
elif [[ ${#*} -eq 1 ]]; then
|
||||||
if [[ ! -d ${*[1]} ]]; then
|
if [[ ! -d ${*[1]} ]]; then
|
||||||
warning "directory not found: ${*[1]}"
|
warning "directory not found: ${*[1]}"
|
||||||
@ -84,23 +86,69 @@ EOF
|
|||||||
integer index=0
|
integer index=0
|
||||||
if [[ ${#local_build_dirs} -eq 0 ]]; then
|
if [[ ${#local_build_dirs} -eq 0 ]]; then
|
||||||
error "no build directories found"; return 1
|
error "no build directories found"; return 1
|
||||||
elif [[ ${#local_build_dirs} -eq 1 ]]; then
|
|
||||||
local_build_dir=${local_build_dirs[1]}
|
|
||||||
elif [[ ${#local_build_dirs} -gt 1 ]]; then
|
elif [[ ${#local_build_dirs} -gt 1 ]]; then
|
||||||
# Use fzf to select a build directory
|
zmodload zsh/curses && {
|
||||||
local max=$(( $( tput lines ) / 2 ))
|
# Get the size of the terminal
|
||||||
local best=$(( ${#local_build_dirs} + 4 ))
|
local size=`stty size`
|
||||||
local_build_dir=$(
|
integer height=${size% *}
|
||||||
printf '%s\n' "${local_build_dirs[@]}" |
|
integer width=${size#* }
|
||||||
fzf --layout=reverse --tac --info=hidden --border=rounded \
|
|
||||||
--cycle --height=$(( $best < $max ? $best : $max ))
|
# Create the window and hide the cursor
|
||||||
)
|
zcurses init
|
||||||
if [[ $? -ne 0 ]]; then
|
zcurses addwin build-dir $height $width 0 0
|
||||||
return 1
|
|
||||||
fi
|
# Hide the cursor for zcurses, trap SIGINT to ensure cleanup in
|
||||||
|
# always-list occurs below
|
||||||
|
tput civis; trap 'return 130' INT
|
||||||
|
|
||||||
|
# Enter display loop
|
||||||
|
local key keypad
|
||||||
|
while (( 1 )); do
|
||||||
|
zcurses clear build-dir
|
||||||
|
|
||||||
|
# Add the prompt text
|
||||||
|
zcurses move build-dir 1 1
|
||||||
|
zcurses string build-dir 'Select a build directory:'
|
||||||
|
|
||||||
|
# Add the selections text
|
||||||
|
for (( i = 0; i < ${#local_build_dirs}; i++ )); do
|
||||||
|
integer line=$i+3
|
||||||
|
zcurses move build-dir $line 1
|
||||||
|
[[ $index -eq $i ]] &&
|
||||||
|
zcurses string build-dir "* " ||
|
||||||
|
zcurses string build-dir " "
|
||||||
|
zcurses string build-dir ${local_build_dirs[$i+1]}
|
||||||
|
done
|
||||||
|
|
||||||
|
# Display the text the and wait for input
|
||||||
|
zcurses refresh build-dir
|
||||||
|
zcurses input build-dir key keypad
|
||||||
|
|
||||||
|
# Handle user input
|
||||||
|
case $key in
|
||||||
|
(UP|k|$'\C-P')
|
||||||
|
[[ $index -gt 0 ]] && index=$index-1 ;;
|
||||||
|
(DOWN|j|$'\C-N')
|
||||||
|
[[ $index -lt ${#local_build_dirs}-1 ]] && index=$index+1 ;;
|
||||||
|
(ENTER|$'\n')
|
||||||
|
break ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
} always {
|
||||||
|
# Restore the cursor and cleanup zcurses
|
||||||
|
tput cvvis; tput cnorm
|
||||||
|
zcurses delwin build-dir
|
||||||
|
zcurses end
|
||||||
|
}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# On success setup the build directory for use
|
||||||
|
if [[ $? -eq 0 ]]; then
|
||||||
|
# Set the build directory from selection if empty
|
||||||
|
[[ -z $local_build_dir ]] && \
|
||||||
|
local_build_dir=${local_build_dirs[$index+1]}
|
||||||
|
|
||||||
# If `build.ninja` exists in alias `ninja`, return.
|
# If `build.ninja` exists in alias `ninja`, return.
|
||||||
local build
|
local build
|
||||||
[ -f $local_build_dir/build.ninja ] && \
|
[ -f $local_build_dir/build.ninja ] && \
|
||||||
@ -125,17 +173,12 @@ EOF
|
|||||||
alias build="$build"
|
alias build="$build"
|
||||||
hash -d build=$local_build_dir
|
hash -d build=$local_build_dir
|
||||||
export build_dir=$local_build_dir
|
export build_dir=$local_build_dir
|
||||||
export BUILD_DIR=$PWD/$local_build_dir
|
|
||||||
echo "$build_dir"
|
|
||||||
|
|
||||||
# If `--build` is specified then evaluate the command.
|
# If `--build` is specified then evaluate the command.
|
||||||
if [[ -n $do_build ]]; then
|
if [[ -n $do_build ]]; then
|
||||||
eval build
|
eval build
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
# Bind C-B to fuzzy find & complete cmake variables.
|
|
||||||
zle -N .build-var
|
|
||||||
bindkey '^B' .build-var
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Build then run a target residing in `~build/bin`.
|
# Build then run a target residing in `~build/bin`.
|
||||||
@ -149,22 +192,3 @@ build-debug() {
|
|||||||
local target=$1; shift 1
|
local target=$1; shift 1
|
||||||
eval build $target && debug ~build/bin/$target "$@"
|
eval build $target && debug ~build/bin/$target "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Fuzzy find CMake variables, select one to set the variable via a command.
|
|
||||||
.build-var() {
|
|
||||||
local var=$(
|
|
||||||
cat $build_dir/CMakeCache.txt |
|
|
||||||
grep --color=never -Ex '^\w+:\w+=.*$' |
|
|
||||||
fzf --layout=reverse --info=hidden --border=rounded \
|
|
||||||
--cycle --height=50%
|
|
||||||
)
|
|
||||||
if [[ -n "$var" ]]; then
|
|
||||||
if [[ "$BUFFER" = "cmake"* ]]; then
|
|
||||||
BUFFER="$BUFFER-D$var"
|
|
||||||
else
|
|
||||||
BUFFER="cmake -B\$build_dir -D$var"
|
|
||||||
fi
|
|
||||||
zle end-of-line
|
|
||||||
fi
|
|
||||||
zle reset-prompt
|
|
||||||
}
|
|
||||||
|
23
git-prompt.c
23
git-prompt.c
@ -21,6 +21,11 @@
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define color8(CODE) "\e[3" #CODE "m"
|
||||||
|
#define color256(CODE) "\e[38;5;" #CODE "m"
|
||||||
|
#define bold "\e[1m"
|
||||||
|
#define reset "\e[0m"
|
||||||
|
|
||||||
typedef struct process {
|
typedef struct process {
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
FILE* out;
|
FILE* out;
|
||||||
@ -56,9 +61,7 @@ int process_close(process_t process) {
|
|||||||
|
|
||||||
char* trim(char* str) {
|
char* trim(char* str) {
|
||||||
char* end;
|
char* end;
|
||||||
while (isspace((unsigned char)*str)) {
|
while (isspace((unsigned char)*str)) str++;
|
||||||
str++;
|
|
||||||
}
|
|
||||||
if (*str == 0) {
|
if (*str == 0) {
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
@ -106,7 +109,7 @@ int main() {
|
|||||||
}
|
}
|
||||||
char* branch = trim(branch_buf);
|
char* branch = trim(branch_buf);
|
||||||
char prompt[1024] = {};
|
char prompt[1024] = {};
|
||||||
append(prompt, 3, " %{%F{66}%}", branch, "%{%f%}");
|
append(prompt, 3, " " color256(66), branch, reset);
|
||||||
|
|
||||||
// get the upstream remote if one exists
|
// get the upstream remote if one exists
|
||||||
char command[1024] = {};
|
char command[1024] = {};
|
||||||
@ -180,22 +183,22 @@ int main() {
|
|||||||
if (indexed || modified || deleted || unmerged || untracked) { // modified
|
if (indexed || modified || deleted || unmerged || untracked) { // modified
|
||||||
char int_buf[32];
|
char int_buf[32];
|
||||||
if (indexed) {
|
if (indexed) {
|
||||||
append(prompt, 3, "%{%F{2}%}*", inttostr(int_buf, indexed), "%{%f%}");
|
append(prompt, 3, color8(2) "*", inttostr(int_buf, indexed), reset);
|
||||||
}
|
}
|
||||||
if (modified) {
|
if (modified) {
|
||||||
append(prompt, 3, "%{%F{1}%}+", inttostr(int_buf, modified), "%{%f%}");
|
append(prompt, 3, color8(1) "+", inttostr(int_buf, modified), reset);
|
||||||
}
|
}
|
||||||
if (deleted) {
|
if (deleted) {
|
||||||
append(prompt, 3, "%{%F{1}%}-", inttostr(int_buf, deleted), "%{%f%}");
|
append(prompt, 3, color8(1) "-", inttostr(int_buf, deleted), reset);
|
||||||
}
|
}
|
||||||
if (unmerged) {
|
if (unmerged) {
|
||||||
append(prompt, 3, "%{%B%F{1}%}×", inttostr(int_buf, unmerged), "%{%f%b%}");
|
append(prompt, 3, bold color8(1) "×", inttostr(int_buf, unmerged), reset);
|
||||||
}
|
}
|
||||||
if (untracked) {
|
if (untracked) {
|
||||||
append(prompt, 1, "%{%F{1}%}…%{%f%}");
|
append(prompt, 1, color8(1) "…" reset);
|
||||||
}
|
}
|
||||||
} else { // clean
|
} else { // clean
|
||||||
append(prompt, 1, "%{%B%F{2}%}✓%{%f%b%}");
|
append(prompt, 1, bold color8(2) "✓" reset);
|
||||||
}
|
}
|
||||||
|
|
||||||
// print the prompt
|
// print the prompt
|
||||||
|
92
install.zsh
92
install.zsh
@ -1,92 +0,0 @@
|
|||||||
#!/usr/bin/env zsh
|
|
||||||
|
|
||||||
error() {
|
|
||||||
echo "error: $*"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
directories=(
|
|
||||||
~/.cache/zsh
|
|
||||||
~/.local/bin
|
|
||||||
~/.local/share/zsh/plugins
|
|
||||||
~/.local/share/zsh/site-functions
|
|
||||||
)
|
|
||||||
|
|
||||||
for directory in $directories; do
|
|
||||||
mkdir -p $directory
|
|
||||||
done
|
|
||||||
|
|
||||||
plugins=(
|
|
||||||
zsh-users/zsh-autosuggestions
|
|
||||||
zsh-users/zsh-history-substring-search
|
|
||||||
zsh-users/zsh-syntax-highlighting
|
|
||||||
zsh-users/zsh-completions
|
|
||||||
)
|
|
||||||
|
|
||||||
for plugin in $plugins; do
|
|
||||||
plugin_name=${plugin/*\//}
|
|
||||||
plugin_directory=~/.local/share/zsh/plugins/$plugin_name
|
|
||||||
if [ -d $plugin_directory ]; then
|
|
||||||
if ! git -C $plugin_directory diff-index --quiet HEAD --; then
|
|
||||||
error $plugin_directory contains unstaged changes
|
|
||||||
fi
|
|
||||||
pull=`git -C $plugin_directory pull`
|
|
||||||
if [ "$pull" != "Already up to date." ] && \
|
|
||||||
[ "$pull" != "Already up-to-date." ]; then
|
|
||||||
echo changed pulled $plugin_directory
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
git clone https://github.com/$plugin.git $plugin_directory > /dev/null
|
|
||||||
echo changed cloned $plugin_directory
|
|
||||||
fi
|
|
||||||
old_plugin_directory=~/.config/zsh/$plugin_name
|
|
||||||
if [ -d $old_plugin_directory ]; then
|
|
||||||
rm -rf $old_plugin_directory
|
|
||||||
echo changed removed $old_plugin_directory
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
declare -A symlinks
|
|
||||||
symlinks=(
|
|
||||||
~/.config/zsh/zlogin ~/.zlogin
|
|
||||||
~/.config/zsh/zlogout ~/.zlogout
|
|
||||||
~/.config/zsh/zprofile ~/.zprofile
|
|
||||||
~/.config/zsh/zshenv ~/.zshenv
|
|
||||||
~/.config/zsh/zshrc ~/.zshrc
|
|
||||||
~/.config/zsh/prompt_fresh_setup
|
|
||||||
~/.local/share/zsh/site-functions/prompt_fresh_setup
|
|
||||||
~/.config/zsh/cmake-uninstall ~/.local/bin/cmake-uninstall
|
|
||||||
~/.config/zsh/$ ~/.local/bin/$
|
|
||||||
~/.config/zsh/url/url ~/.local/bin/url
|
|
||||||
)
|
|
||||||
|
|
||||||
for completion in ~/.config/zsh/**/_*; do
|
|
||||||
filename=`basename $completion`
|
|
||||||
symlinks[$completion]=~/.local/share/zsh/site-functions/$filename
|
|
||||||
done
|
|
||||||
|
|
||||||
completions=( ~/.local/share/zsh/plugins/zsh-completions/src/* )
|
|
||||||
for completion in $completions; do
|
|
||||||
filename=`basename $completion`
|
|
||||||
name=${filename:1}
|
|
||||||
if command -v $name > /dev/null; then
|
|
||||||
symlinks[$completion]=~/.local/share/zsh/site-functions/$filename
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
for source in ${(k)symlinks}; do
|
|
||||||
dest=$symlinks[$source]
|
|
||||||
if [ -L $dest ]; then
|
|
||||||
target=`readlink $dest`
|
|
||||||
if [ "$target" != "$source" ]; then
|
|
||||||
rm $dest
|
|
||||||
ln -s $source $dest
|
|
||||||
echo changed replace incorrect symlink $dest
|
|
||||||
fi
|
|
||||||
elif [ -f $dest ]; then
|
|
||||||
error symlink failed $dest exists but is a regular file
|
|
||||||
else
|
|
||||||
ln -s $source $dest
|
|
||||||
echo changed created symlink $dest
|
|
||||||
fi
|
|
||||||
done
|
|
@ -2,7 +2,7 @@ layout() {
|
|||||||
if [[ "$1" == "" ]]; then
|
if [[ "$1" == "" ]]; then
|
||||||
echo "usage: layout <layout> [name]"
|
echo "usage: layout <layout> [name]"
|
||||||
else
|
else
|
||||||
~/.local/share/tmux/layouts/$1
|
tmux source-file ~/.local/share/tmux/layouts/$1
|
||||||
if [[ "$2" != "" ]]; then
|
if [[ "$2" != "" ]]; then
|
||||||
tmux rename-window $2
|
tmux rename-window $2
|
||||||
fi
|
fi
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
#!/usr/bin/env zsh
|
|
||||||
|
|
||||||
# Loop over available completions and add existing commands to array.
|
|
||||||
local -a completions
|
|
||||||
completions=(~/.config/zsh/zsh-completions/src/*)
|
|
||||||
local -a command_list
|
|
||||||
for completion in $completions; do
|
|
||||||
local filename=$(basename $completion)
|
|
||||||
local name=${filename:1}
|
|
||||||
if command -v $name &> /dev/null; then
|
|
||||||
command_list+=($name)
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Print JSON array of commands Ansible can consume.
|
|
||||||
echo '['
|
|
||||||
local length=${#command_list[@]}
|
|
||||||
for (( i = 1; i < $length; i++ )); do
|
|
||||||
echo " \"${command_list[$i]}\","
|
|
||||||
done
|
|
||||||
echo " \"${command_list[-1]}\""
|
|
||||||
echo ']'
|
|
@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
for d in /sys/kernel/iommu_groups/*/devices/*; do
|
|
||||||
n=${d#*/iommu_groups/*}; n=${n%%/*}
|
|
||||||
printf '%s ' "$n"
|
|
||||||
lspci -nns "${d##*/}"
|
|
||||||
done
|
|
@ -44,32 +44,25 @@ prompt_fresh_setup() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
local userhost=$USER
|
local userhost=$USER
|
||||||
if [ "$SSH_CONNECTION" != "" ] || [ "$container" != "" ]; then
|
if [ "$SSH_CONNECTION" != "" ] || [ "$DISTROBOX_ENTER_PATH" != "" ]; then
|
||||||
local user="$user@%{%F{244}%}%M%{%f%}"
|
local user="$user@%{%F{244}%}%M%{%f%}"
|
||||||
local userhost="$userhost@`hostname`"
|
local userhost="$userhost@`hostname`"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PS1="$user "
|
PS1="«$user» "
|
||||||
PS2="${(l:${#userhost}:: :)} "
|
PS2="«${(l:${#userhost}:: :)}» "
|
||||||
|
|
||||||
prompt_opts=(percent sp subst)
|
prompt_opts=(percent sp subst)
|
||||||
}
|
}
|
||||||
|
|
||||||
prompt_cleanup() {
|
prompt_cleanup() {
|
||||||
[ -f ${XDG_CACHE_HOME:-$HOME/.cache}/zsh/git-prompt ] && \
|
[ -f ~/.cache/zsh/git-prompt ] && rm ~/.cache/zsh/git-prompt
|
||||||
rm ${XDG_CACHE_HOME:-$HOME/.cache}/zsh/git-prompt
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fresh_line_one() {
|
fresh_line_one() {
|
||||||
# First get the last commands exit code before doing anything
|
# First get the last commands exit code before doing anything
|
||||||
local exit_code=$?
|
local exit_code=$?
|
||||||
|
|
||||||
# Clean up if fresh is no longer the current prompt theme
|
|
||||||
if [[ "`prompt -c | tail -1 | xargs`" != "fresh"* ]]; then
|
|
||||||
add-zsh-hook -d precmd fresh_line_one
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Construct the time and directory portions of the prompt
|
# Construct the time and directory portions of the prompt
|
||||||
local time_stamp="%{%F{244}%}%D{%H:%M:%S}%{%f%}"
|
local time_stamp="%{%F{244}%}%D{%H:%M:%S}%{%f%}"
|
||||||
[[ -n $SANDBOX_HOME ]] && \
|
[[ -n $SANDBOX_HOME ]] && \
|
||||||
@ -77,7 +70,7 @@ fresh_line_one() {
|
|||||||
local directory="%{%F{37}%}%~%{%f%}"
|
local directory="%{%F{37}%}%~%{%f%}"
|
||||||
|
|
||||||
# Check we are in a git repository
|
# Check we are in a git repository
|
||||||
local git=`${XDG_CACHE_HOME:-$HOME/.cache}/zsh/git-prompt`
|
local git=`~/.cache/zsh/git-prompt`
|
||||||
|
|
||||||
# If the last command failed, display its error code at the right
|
# If the last command failed, display its error code at the right
|
||||||
if [[ $exit_code -ne 0 ]]; then
|
if [[ $exit_code -ne 0 ]]; then
|
||||||
@ -179,12 +172,10 @@ fresh_almostontop_preexec() {
|
|||||||
fresh_compile_git_prompt() {
|
fresh_compile_git_prompt() {
|
||||||
# Compile a simple C program which parses the output of `git status
|
# Compile a simple C program which parses the output of `git status
|
||||||
# --procelain` to greatly decrease the time taken to draw the prompt
|
# --procelain` to greatly decrease the time taken to draw the prompt
|
||||||
[ ! -d ${XDG_CACHE_HOME:-$HOME/.cache}/zsh ] && \
|
[ ! -d ~/.cache/zsh ] && mkdir -p ~/.cache/zsh
|
||||||
mkdir -p ${XDG_CACHE_HOME:-$HOME/.cache}/zsh
|
if [ ! -f ~/.cache/zsh/git-prompt ]; then
|
||||||
if [ ! -f ${XDG_CACHE_HOME:-$HOME/.cache}/zsh/git-prompt ]; then
|
|
||||||
cc -std=gnu99 -O3 -DNDEBUG -Wno-unused-result \
|
cc -std=gnu99 -O3 -DNDEBUG -Wno-unused-result \
|
||||||
${XDG_CONFIG_HOME:-$HOME/.config}/zsh/git-prompt.c \
|
~/.config/zsh/git-prompt.c -o ~/.cache/zsh/git-prompt
|
||||||
-o ${XDG_CACHE_HOME:-$HOME/.cache}/zsh/git-prompt
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo "git-prompt was not compiled, is a C99 toolchain installed?"
|
echo "git-prompt was not compiled, is a C99 toolchain installed?"
|
||||||
fi
|
fi
|
||||||
|
@ -36,7 +36,7 @@ usage: sandbox [-h] {create,rename,destroy,enable,disable,list} ..
|
|||||||
if [ "$git" = true ]; then
|
if [ "$git" = true ]; then
|
||||||
local repo=$arg
|
local repo=$arg
|
||||||
git=false
|
git=false
|
||||||
elif [[ -z "$name" ]]; then
|
elif [[ -n "$name" ]]; then
|
||||||
error "invalid argument $arg\n$usage" && return 1
|
error "invalid argument $arg\n$usage" && return 1
|
||||||
else
|
else
|
||||||
local name=$arg
|
local name=$arg
|
||||||
@ -44,11 +44,14 @@ usage: sandbox [-h] {create,rename,destroy,enable,disable,list} ..
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
unset git
|
unset git
|
||||||
|
|
||||||
[[ -z "$name" ]] && \
|
[[ -z "$name" ]] && \
|
||||||
error "missing argument <name>\n$usage" && return 1
|
error "missing argument <name>\n$usage" && return 1
|
||||||
|
|
||||||
local sandbox=$SANDBOX_ROOT/$name
|
local sandbox=$SANDBOX_ROOT/$name
|
||||||
[[ -d "$sandbox" ]] && \
|
[[ -d "$sandbox" ]] && \
|
||||||
error "sandbox already exists $name" && return 1
|
error "sandbox already exists $name" && return 1
|
||||||
|
|
||||||
if [[ -n "$repo" ]]; then
|
if [[ -n "$repo" ]]; then
|
||||||
mkdir -p $SANDBOX_ROOT &> /dev/null
|
mkdir -p $SANDBOX_ROOT &> /dev/null
|
||||||
git clone $repo $sandbox
|
git clone $repo $sandbox
|
||||||
@ -58,49 +61,55 @@ usage: sandbox [-h] {create,rename,destroy,enable,disable,list} ..
|
|||||||
cd $sandbox
|
cd $sandbox
|
||||||
git init &> /dev/null
|
git init &> /dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "SANDBOX_HOME=\$(dirname -- "\$0:a")" >> $sandbox/.enter
|
echo "SANDBOX_HOME=\$(dirname -- "\$0:a")" >> $sandbox/.enter
|
||||||
echo "SANDBOX_NAME=$name" >> $sandbox/.enter
|
echo "SANDBOX_NAME=$name" >> $sandbox/.enter
|
||||||
_autoenv_authorized $sandbox/.enter yes
|
_autoenv_authorized $sandbox/.enter yes
|
||||||
|
|
||||||
echo "unset SANDBOX_NAME" >> $sandbox/.exit
|
echo "unset SANDBOX_NAME" >> $sandbox/.exit
|
||||||
echo "unset SANDBOX_HOME" >> $sandbox/.exit
|
echo "unset SANDBOX_HOME" >> $sandbox/.exit
|
||||||
_autoenv_authorized $sandbox/.exit yes
|
_autoenv_authorized $sandbox/.exit yes
|
||||||
|
|
||||||
_autoenv_enter $sandbox
|
_autoenv_enter $sandbox
|
||||||
;;
|
;;
|
||||||
|
|
||||||
rename)
|
rename)
|
||||||
local old_name=$1 new_name=$2
|
local old_name=$1 new_name=$2
|
||||||
[[ -z "$old_name" ]] && \
|
[[ -z "$old_name" ]] && \
|
||||||
error "missing argument <old-name>\n$usage" && return 1
|
error "missing argument <old-name>\n$usage" && return 1
|
||||||
[[ -z "$new_name" ]] && \
|
[[ -z "$new_name" ]] && \
|
||||||
error "missing argument <new-name>\n$usage" && return 1
|
error "missing argument <new-name>\n$usage" && return 1
|
||||||
|
|
||||||
local old=$SANDBOX_ROOT/$old_name new=$SANDBOX_ROOT/$new_name
|
local old=$SANDBOX_ROOT/$old_name new=$SANDBOX_ROOT/$new_name
|
||||||
[[ ! -d "$old" ]] && \
|
[[ ! -d "$old" ]] && \
|
||||||
error "sandbox does not exist $old_name" && return 1
|
error "sandbox does not exist $old_name" && return 1
|
||||||
[[ -d "$new" ]] && \
|
[[ -d "$new" ]] && \
|
||||||
error "sandbox already exists $new_name" && return 1
|
error "sandbox already exists $new_name" && return 1
|
||||||
|
|
||||||
[[ "$PWD" = "$old"* ]] && _autoenv_exit $PWD
|
[[ "$PWD" = "$old"* ]] && _autoenv_exit $PWD
|
||||||
|
|
||||||
mv $old $new
|
mv $old $new
|
||||||
sed -i "s/$old_name/$new_name/g" $new/.enter
|
sed -i "s/$old_name/$new_name/g" $new/.enter
|
||||||
_autoenv_authorized $new/.enter yes
|
_autoenv_authorized $new/.enter yes
|
||||||
_autoenv_authorized $new/.exit yes
|
_autoenv_authorized $new/.exit yes
|
||||||
|
|
||||||
[[ "$PWD" = "$old"* ]] && cd $new
|
[[ "$PWD" = "$old"* ]] && cd $new
|
||||||
;;
|
;;
|
||||||
|
|
||||||
destroy)
|
destroy)
|
||||||
local name=$1
|
local name=$1
|
||||||
[[ -z "$name" ]] && \
|
[[ -z "$name" ]] && \
|
||||||
error "missing argument <name>\n$usage" && return 1
|
error "missing argument <name>\n$usage" && return 1
|
||||||
|
|
||||||
local sandbox=$SANDBOX_ROOT/$name
|
local sandbox=$SANDBOX_ROOT/$name
|
||||||
[[ ! -d $sandbox ]] && \
|
[[ ! -d $sandbox ]] && \
|
||||||
error "sandbox does not exist $name" && return 1
|
error "sandbox does not exist $name" && return 1
|
||||||
|
|
||||||
[[ "$PWD" = "$sandbox"* ]] && cd ~
|
[[ "$PWD" = "$sandbox"* ]] && cd ~
|
||||||
|
|
||||||
rm -rf $sandbox
|
rm -rf $sandbox
|
||||||
;;
|
;;
|
||||||
|
|
||||||
list)
|
list)
|
||||||
ls -1 $SANDBOX_ROOT | less -F -K -R -X
|
ls -1 $SANDBOX_ROOT | less -F -K -R -X
|
||||||
;;
|
;;
|
||||||
|
|
||||||
enable)
|
enable)
|
||||||
local name=$1
|
local name=$1
|
||||||
[[ -z "$name" ]] && \
|
[[ -z "$name" ]] && \
|
||||||
@ -109,19 +118,16 @@ usage: sandbox [-h] {create,rename,destroy,enable,disable,list} ..
|
|||||||
local sandbox=$SANDBOX_ROOT/$name
|
local sandbox=$SANDBOX_ROOT/$name
|
||||||
[[ ! -d $sandbox ]] && \
|
[[ ! -d $sandbox ]] && \
|
||||||
error "sandbox does not exist $name" && return 1
|
error "sandbox does not exist $name" && return 1
|
||||||
|
|
||||||
export SANDBOX_RETURN=$PWD
|
export SANDBOX_RETURN=$PWD
|
||||||
cd $sandbox
|
cd $sandbox
|
||||||
;;
|
;;
|
||||||
|
|
||||||
disable)
|
disable)
|
||||||
[[ -z "$SANDBOX_RETURN" ]] && \
|
[[ -z "$SANDBOX_RETURN" ]] && \
|
||||||
error "sandbox is not currently active" && return 1
|
error "sandbox is not currently active" && return 1
|
||||||
|
|
||||||
cd $SANDBOX_RETURN
|
cd $SANDBOX_RETURN
|
||||||
unset SANDBOX_RETURN
|
unset SANDBOX_RETURN
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*)
|
|
||||||
error "invalid sandbox command: $cmd" && return 1
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
#compdef session
|
|
||||||
|
|
||||||
__session_sessions() {
|
|
||||||
list() {
|
|
||||||
for item in $HOME/.local/share/tmux/layouts/session-*; do
|
|
||||||
item=${item#$HOME/.local/share/tmux/layouts/}
|
|
||||||
echo ${item#session-}
|
|
||||||
done
|
|
||||||
}
|
|
||||||
local -a sessions
|
|
||||||
sessions=(${(fo)"$(list)"})
|
|
||||||
_describe 'session' sessions
|
|
||||||
}
|
|
||||||
|
|
||||||
__session_hosts() {
|
|
||||||
list() {
|
|
||||||
declare -A hosts
|
|
||||||
if [ -f ~/.config/session ]; then
|
|
||||||
source ~/.config/session
|
|
||||||
for key val in "${(@kv)hosts}"; do
|
|
||||||
echo $key
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
local -a hosts
|
|
||||||
hosts=(${(fo)"$(list)"})
|
|
||||||
_describe 'host' hosts
|
|
||||||
}
|
|
||||||
|
|
||||||
_arguments \
|
|
||||||
':session:__session_sessions' \
|
|
||||||
':host:__session_hosts'
|
|
@ -1,33 +0,0 @@
|
|||||||
session() {
|
|
||||||
if [[ "$1" == "" ]]; then
|
|
||||||
echo "usage: session <name> [<host>]"
|
|
||||||
else
|
|
||||||
local name=$1
|
|
||||||
local host=$2
|
|
||||||
if [[ "$3" != "" ]]; then
|
|
||||||
echo "$fg[red]error:$reset_color invalid argument: $3"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
declare -A hosts
|
|
||||||
if [ -f ~/.config/session ]; then
|
|
||||||
source ~/.config/session
|
|
||||||
fi
|
|
||||||
local url=$hosts[$host]
|
|
||||||
host=${url:-$host}
|
|
||||||
if [[ "$TMUX" == "" ]]; then
|
|
||||||
local cmd="tmux new-session -As $name"
|
|
||||||
if [[ "$host" != "" ]]; then
|
|
||||||
cmd="ssh $host -t $cmd"
|
|
||||||
fi
|
|
||||||
eval $cmd
|
|
||||||
else
|
|
||||||
if [[ "$host" != "" ]]; then
|
|
||||||
echo "$fg[red]error:$reset_color <host> not allowed inside tmux session"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
tmux list-sessions | grep "$name:" &> /dev/null || \
|
|
||||||
tmux new-session -Ads $name -c $HOME
|
|
||||||
tmux switch-client -t $name
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
99
tasks.yaml
Normal file
99
tasks.yaml
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
---
|
||||||
|
- name: zsh install packages
|
||||||
|
become: '{{package_become}}'
|
||||||
|
package:
|
||||||
|
name: zsh
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: zsh install Debian packages
|
||||||
|
when: ansible_os_family == "Debian"
|
||||||
|
become: true
|
||||||
|
apt:
|
||||||
|
name:
|
||||||
|
- pinentry-curses
|
||||||
|
- silversearcher-ag
|
||||||
|
- unzip
|
||||||
|
- zsh-doc
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: zsh install macOS packages
|
||||||
|
when: ansible_os_family == "Darwin"
|
||||||
|
become: false
|
||||||
|
homebrew:
|
||||||
|
name: the_silver_searcher
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: zsh clone plugin repos
|
||||||
|
git:
|
||||||
|
repo: '{{item.repo}}'
|
||||||
|
dest: '{{item.dest}}'
|
||||||
|
with_items:
|
||||||
|
- repo: https://github.com/zsh-users/zsh-autosuggestions.git
|
||||||
|
dest: ~/.config/zsh/zsh-autosuggestions
|
||||||
|
- repo: https://github.com/zsh-users/zsh-history-substring-search.git
|
||||||
|
dest: ~/.config/zsh/zsh-history-substring-search
|
||||||
|
- repo: https://github.com/zsh-users/zsh-syntax-highlighting.git
|
||||||
|
dest: ~/.config/zsh/zsh-syntax-highlighting
|
||||||
|
- repo: https://github.com/zsh-users/zsh-completions.git
|
||||||
|
dest: ~/.config/zsh/zsh-completions
|
||||||
|
- repo: https://github.com/junegunn/fzf.git
|
||||||
|
dest: ~/.config/zsh/fzf
|
||||||
|
|
||||||
|
- name: zsh install fzf binaries
|
||||||
|
command:
|
||||||
|
cmd: ~/.config/zsh/fzf/install --bin
|
||||||
|
creates: ~/.config/zsh/fzf/bin/fzf
|
||||||
|
|
||||||
|
- name: zsh create directories
|
||||||
|
file:
|
||||||
|
state: directory
|
||||||
|
dest: '{{item}}'
|
||||||
|
with_items:
|
||||||
|
- ~/.local/bin
|
||||||
|
- ~/.local/share/zsh/site-functions
|
||||||
|
|
||||||
|
- name: zsh create symbolic links
|
||||||
|
file:
|
||||||
|
state: link
|
||||||
|
src: '{{item.src}}'
|
||||||
|
dest: '{{item.dest}}'
|
||||||
|
with_items:
|
||||||
|
- src: ~/.config/zsh/zlogin
|
||||||
|
dest: ~/.zlogin
|
||||||
|
- src: ~/.config/zsh/zlogout
|
||||||
|
dest: ~/.zlogout
|
||||||
|
- src: ~/.config/zsh/zprofile
|
||||||
|
dest: ~/.zprofile
|
||||||
|
- src: ~/.config/zsh/zshenv
|
||||||
|
dest: ~/.zshenv
|
||||||
|
- src: ~/.config/zsh/zshrc
|
||||||
|
dest: ~/.zshrc
|
||||||
|
- src: ~/.config/zsh/prompt_fresh_setup
|
||||||
|
dest: ~/.local/share/zsh/site-functions/prompt_fresh_setup
|
||||||
|
- src: ~/.config/zsh/build/_build-dir
|
||||||
|
dest: ~/.local/share/zsh/site-functions/_build-dir
|
||||||
|
- src: ~/.config/zsh/sandbox/_sandbox
|
||||||
|
dest: ~/.local/share/zsh/site-functions/_sandbox
|
||||||
|
- src: ~/.config/zsh/layout/_layout
|
||||||
|
dest: ~/.local/share/zsh/site-functions/_layout
|
||||||
|
- src: ~/.config/zsh/notes/_note
|
||||||
|
dest: ~/.local/share/zsh/site-functions/_note
|
||||||
|
- src: ~/.config/zsh/fzf/bin/fzf
|
||||||
|
dest: ~/.local/bin/fzf
|
||||||
|
- src: ~/.config/zsh/fzf/bin/fzf-tmux
|
||||||
|
dest: ~/.local/bin/fzf-tmux
|
||||||
|
- src: ~/.config/zsh/cmake-uninstall
|
||||||
|
dest: ~/.local/bin/cmake-uninstall
|
||||||
|
- src: ~/.config/zsh/$
|
||||||
|
dest: ~/.local/bin/$
|
||||||
|
|
||||||
|
- name: zsh get absolute path
|
||||||
|
shell: command -v zsh
|
||||||
|
register: zsh
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: zsh set default shell
|
||||||
|
user:
|
||||||
|
name: '{{lookup("env", "USER")}}'
|
||||||
|
shell: '{{zsh.stdout}}'
|
||||||
|
become: true
|
19
update-completion-links.zsh
Executable file
19
update-completion-links.zsh
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
# Check if third party completions are present.
|
||||||
|
local zsh_completions=~/.config/zsh/zsh-completions
|
||||||
|
[ ! -d $zsh_completions ] && return 0
|
||||||
|
|
||||||
|
# Loop over all completions.
|
||||||
|
for completion in $zsh_completions/src/_*; do
|
||||||
|
local name=`basename $completion`
|
||||||
|
local symlink=~/.local/share/zsh/site-functions/$name
|
||||||
|
# Remove existing completion file if it exists.
|
||||||
|
[ -f $symlink ] && rm $symlink
|
||||||
|
# Check if the command exists on the PATH.
|
||||||
|
if command -v ${name:1} &> /dev/null; then
|
||||||
|
# Symlink the completion for the existing command.
|
||||||
|
[ `uname` = Darwin ] && \
|
||||||
|
ln -s $completion $symlink || ln -sr $completion $symlink
|
||||||
|
fi
|
||||||
|
done
|
22
url/_url
22
url/_url
@ -1,22 +0,0 @@
|
|||||||
#compdef url
|
|
||||||
|
|
||||||
_url() {
|
|
||||||
local ret=1 context curcontext="$curcontext" state line
|
|
||||||
typeset -A opt_args
|
|
||||||
|
|
||||||
_arguments -C -w -s \
|
|
||||||
'(-h --help)'{-h,--help}'[show this help message and exit]' \
|
|
||||||
'1: :->command'
|
|
||||||
|
|
||||||
case $state in
|
|
||||||
(command)
|
|
||||||
declare -a commands
|
|
||||||
local commands=(
|
|
||||||
encode:'encode unencoded text'
|
|
||||||
decode:'decode encoded text'
|
|
||||||
)
|
|
||||||
_describe -t commands command commands && ret=0 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
return ret
|
|
||||||
}
|
|
27
url/url
27
url/url
@ -1,27 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
"""URL encode or decode text."""
|
|
||||||
|
|
||||||
from argparse import ArgumentParser
|
|
||||||
from urllib import parse
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
cli = ArgumentParser(description=__doc__)
|
|
||||||
cli.add_argument('command',
|
|
||||||
choices=['encode', 'decode'],
|
|
||||||
help='type of processing to perform on text')
|
|
||||||
cli.add_argument('text',
|
|
||||||
nargs='?',
|
|
||||||
help='optional text read from stdin when omitted')
|
|
||||||
args = cli.parse_args()
|
|
||||||
print({
|
|
||||||
'encode': parse.quote_plus,
|
|
||||||
'decode': parse.unquote_plus,
|
|
||||||
}[args.command](args.text if args.text else input()))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
try:
|
|
||||||
main()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
exit(130)
|
|
@ -26,86 +26,18 @@ fi
|
|||||||
|
|
||||||
# Passthrough an escape sequences tmux doesn't know about.
|
# Passthrough an escape sequences tmux doesn't know about.
|
||||||
tmux-dcs-passthrough() {
|
tmux-dcs-passthrough() {
|
||||||
local escape_sequence=$1
|
|
||||||
if [ -n "$TMUX" ]; then
|
if [ -n "$TMUX" ]; then
|
||||||
# Replace single \x1b or \033 with two, this is required for tmux to
|
printf "\x1bPtmux;\x1b$1\x1b\\"
|
||||||
# properly pass-through the escape sequence.
|
|
||||||
escape_sequence=${escape_sequence//\\x1b/\\x1b\\x1b}
|
|
||||||
escape_sequence=${escape_sequence//\\033/\\x1b\\x1b}
|
|
||||||
printf '\x1bPtmux;\x1b'"$escape_sequence"'\x1b\\'
|
|
||||||
else
|
else
|
||||||
printf "$escape_sequence"
|
printf "$1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# OSC 9 - Post a notification - supported by iTerm2, kitty, WezTerm, others?
|
# OSC 9 - Post a notification - supported by iTerm2, maybe others?
|
||||||
notify() {
|
notify() {
|
||||||
tmux-dcs-passthrough '\x1b]9;'"$*"'\x7'
|
tmux-dcs-passthrough "\x1b]9;$*\x7"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Send a desktop notification when long running commands complete.
|
|
||||||
notify_command_threshold=60
|
|
||||||
notify_ignore_list=(
|
|
||||||
bash
|
|
||||||
bat
|
|
||||||
btop
|
|
||||||
cat
|
|
||||||
cmatrix
|
|
||||||
fg
|
|
||||||
gh
|
|
||||||
git
|
|
||||||
glab
|
|
||||||
htop
|
|
||||||
ipython
|
|
||||||
man
|
|
||||||
nvim
|
|
||||||
ping
|
|
||||||
podman
|
|
||||||
python
|
|
||||||
session
|
|
||||||
slides
|
|
||||||
ssh
|
|
||||||
sudo
|
|
||||||
sudoedit
|
|
||||||
tmux
|
|
||||||
top
|
|
||||||
vi
|
|
||||||
vim
|
|
||||||
watch
|
|
||||||
zsh
|
|
||||||
)
|
|
||||||
|
|
||||||
notify-ignore() {
|
|
||||||
for ignore in $notify_ignore_list; do
|
|
||||||
if [[ "$1" = "$ignore"* ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
notify-preexec() {
|
|
||||||
if notify-ignore $1; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
notify_command_start=`date +%s`
|
|
||||||
notify_command=$1
|
|
||||||
}
|
|
||||||
add-zsh-hook preexec notify-preexec
|
|
||||||
|
|
||||||
notify-precmd() {
|
|
||||||
if ! [[ -z $notify_command_start ]]; then
|
|
||||||
local notify_command_end=`date +%s`
|
|
||||||
local notify_command_time=$(($notify_command_end - $notify_command_start))
|
|
||||||
if [[ $notify_command_time -gt $notify_command_threshold ]]; then
|
|
||||||
notify "completed: $notify_command"
|
|
||||||
fi
|
|
||||||
unset notify_command
|
|
||||||
unset notify_command_start
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
add-zsh-hook precmd notify-precmd
|
|
||||||
|
|
||||||
# Detect the type and extract an archive file.
|
# Detect the type and extract an archive file.
|
||||||
extract() {
|
extract() {
|
||||||
if [ -f $1 ]; then
|
if [ -f $1 ]; then
|
||||||
@ -170,26 +102,3 @@ if which docker-machine &> /dev/null; then
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ls-iommu() {
|
|
||||||
$HOME/.config/zsh/ls-iommu.sh | sort -n
|
|
||||||
}
|
|
||||||
|
|
||||||
# Fuzzy history search with fzf
|
|
||||||
function .fzf-history-search() {
|
|
||||||
local selected
|
|
||||||
selected=$(
|
|
||||||
cat $HISTFILE | # get entire history
|
|
||||||
sed 's/ *[0-9]* *//' | # remove cruft
|
|
||||||
awk '!seen[$0]++' | # remove duplicates
|
|
||||||
fzf --layout=reverse --tac --cycle --info=hidden \
|
|
||||||
--border=rounded --height=50%
|
|
||||||
)
|
|
||||||
if [[ -n "$selected" ]]; then
|
|
||||||
BUFFER="$selected"
|
|
||||||
zle end-of-line
|
|
||||||
fi
|
|
||||||
zle reset-prompt
|
|
||||||
}
|
|
||||||
zle -N .fzf-history-search
|
|
||||||
bindkey '^R' .fzf-history-search
|
|
||||||
|
69
zshenv
69
zshenv
@ -2,24 +2,12 @@
|
|||||||
# contain commands that produce output or assume the shell is attached to a
|
# contain commands that produce output or assume the shell is attached to a
|
||||||
# tty. This file will always be sourced.
|
# tty. This file will always be sourced.
|
||||||
|
|
||||||
[ -f ~/.config/zsh/zshenv.local ] && source ~/.config/zsh/zshenv.local
|
|
||||||
|
|
||||||
# Ensure cache and state directories exist
|
|
||||||
[ ! -d -${XDG_CACHE_HOME:-$HOME/.cache}/zsh ] && \
|
|
||||||
mkdir -p ${XDG_CACHE_HOME:-$HOME/.cache}/zsh
|
|
||||||
[ ! -d -${XDG_STATE_HOME:-$HOME/.local/state}/zsh ] && \
|
|
||||||
mkdir -p ${XDG_STATE_HOME:-$HOME/.local/state}/zsh
|
|
||||||
|
|
||||||
# Enable saving command history to file
|
# Enable saving command history to file
|
||||||
HISTFILE=${XDG_STATE_HOME:-$HOME/.local/state}/zsh/histfile
|
[ ! -d $HOME/.cache/zsh ] && mkdir -p $HOME/.cache/zsh
|
||||||
|
HISTFILE=$HOME/.cache/zsh/histfile
|
||||||
HISTSIZE=20000
|
HISTSIZE=20000
|
||||||
SAVEHIST=20000
|
SAVEHIST=20000
|
||||||
|
|
||||||
# Migrate histfile from cache to state directory
|
|
||||||
! [ -f $HISTFILE ] && [ -f $HOME/.cache/zsh/histfile ] && \
|
|
||||||
mv $HOME/.cache/zsh/histfile \
|
|
||||||
${XDG_STATE_HOME:-$HOME/.local/state}/zsh/histfile
|
|
||||||
|
|
||||||
# Remove vi mode switch delay
|
# Remove vi mode switch delay
|
||||||
KEYTIMEOUT=1
|
KEYTIMEOUT=1
|
||||||
|
|
||||||
@ -34,17 +22,10 @@ INFOPATH=$HOME/.local/share/info:$INFOPATH
|
|||||||
|
|
||||||
# Add ccache compiler aliases to PATH and use XDG base dir paths
|
# Add ccache compiler aliases to PATH and use XDG base dir paths
|
||||||
if [ `uname` = Darwin ]; then
|
if [ `uname` = Darwin ]; then
|
||||||
if [ `uname -m` = arm64 ]; then
|
[ -d /usr/local/opt/python/libexec/bin ] && \
|
||||||
homebrew_root=/opt/homebrew
|
PATH=/usr/local/opt/python/libexec/bin:$PATH
|
||||||
[ -d /opt/homebrew/bin ] && \
|
[ -f /usr/local/bin/ccache ] && \
|
||||||
PATH=$homebrew_root/bin:$PATH
|
PATH=/usr/local/opt/ccache/libexec:$PATH
|
||||||
else
|
|
||||||
homebrew_root=/usr/local
|
|
||||||
fi
|
|
||||||
[ -d $homebrew_root/opt/python/libexec/bin ] && \
|
|
||||||
PATH=$homebrew_root/opt/python/libexec/bin:$PATH
|
|
||||||
[ -f $homebrew_root/bin/ccache ] && \
|
|
||||||
PATH=$homebrew_root/opt/ccache/libexec:$PATH
|
|
||||||
elif [ -f /usr/bin/ccache ]; then
|
elif [ -f /usr/bin/ccache ]; then
|
||||||
if [ -d /usr/lib/ccache/bin ]; then
|
if [ -d /usr/lib/ccache/bin ]; then
|
||||||
PATH=/usr/lib/ccache/bin:$PATH
|
PATH=/usr/lib/ccache/bin:$PATH
|
||||||
@ -52,14 +33,12 @@ elif [ -f /usr/bin/ccache ]; then
|
|||||||
PATH=/usr/lib/ccache:$PATH
|
PATH=/usr/lib/ccache:$PATH
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
export CCACHE_CONFIGPATH=${XDG_CONFIG_HOME:-$HOME/.config}/ccache
|
export CCACHE_CONFIGPATH=$HOME/.config/ccache
|
||||||
export CCACHE_DIR=${XDG_CACHE_HOME:-$HOME/.cache}/ccache
|
export CCACHE_DIR=$HOME/.cache/ccache
|
||||||
|
|
||||||
# Add default CMake options
|
# Add default CMake generator
|
||||||
command -v ninja &> /dev/null && \
|
command -v ninja &> /dev/null && \
|
||||||
export CMAKE_GENERATOR=Ninja
|
export CMAKE_GENERATOR=Ninja
|
||||||
export CMAKE_EXPORT_COMPILE_COMMANDS=ON
|
|
||||||
export CMAKE_COLOR_DIAGNOSTICS=ON
|
|
||||||
|
|
||||||
# Remove duplicates from environment variables
|
# Remove duplicates from environment variables
|
||||||
typeset -U fpath
|
typeset -U fpath
|
||||||
@ -70,21 +49,11 @@ typeset -U INFOPATH; export INFOPATH
|
|||||||
# Set default editor.
|
# Set default editor.
|
||||||
if command -v nvim &> /dev/null; then
|
if command -v nvim &> /dev/null; then
|
||||||
export EDITOR=`command -v nvim`
|
export EDITOR=`command -v nvim`
|
||||||
# Also use nvim for man pages
|
|
||||||
export MANPAGER='nvim +Man!'
|
|
||||||
elif command -v vim &> /dev/null; then
|
elif command -v vim &> /dev/null; then
|
||||||
export EDITOR=`command -v vim`
|
export EDITOR=`command -v vim`
|
||||||
fi
|
fi
|
||||||
export GIT_EDITOR=$EDITOR
|
export GIT_EDITOR=$EDITOR
|
||||||
|
|
||||||
if command -v fzf &> /dev/null; then
|
|
||||||
export FZF_DEFAULT_OPTS='--no-bold
|
|
||||||
--color=fg:#c5c9c5,fg+:#c5c9c5,bg:#000000,bg+:#393836
|
|
||||||
--color=hl:#8ea4a2,hl+:#8ea4a2,info:#afaf87,marker:#C8C093
|
|
||||||
--color=prompt:#C8C093,spinner:#8992a7,pointer:#FF9E3B,header:#87afaf
|
|
||||||
--color=gutter:#000000,border:#54546D,label:#aeaeae,query:#c5c9c5'
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Use ~/.local for pip installs on macOS
|
# Use ~/.local for pip installs on macOS
|
||||||
[ "`uname`" = "Darwin" ] && export PYTHONUSERBASE=$HOME/.local
|
[ "`uname`" = "Darwin" ] && export PYTHONUSERBASE=$HOME/.local
|
||||||
|
|
||||||
@ -116,27 +85,21 @@ command -v pinentry-curses &> /dev/null && \
|
|||||||
export LPASS_PINENTRY=pinentry-curses
|
export LPASS_PINENTRY=pinentry-curses
|
||||||
|
|
||||||
# Teach these some XDG Base Directory Spec manners
|
# Teach these some XDG Base Directory Spec manners
|
||||||
export IPYTHONDIR=${XDG_CONFIG_HOME:-$HOME/.config}/ipython
|
export IPYTHONDIR=$HOME/.config/ipython
|
||||||
command -v cargo &> /dev/null && \
|
command -v cargo &> /dev/null && \
|
||||||
export CARGO_HOME=$HOME/.local/share/cargo
|
export CARGO_HOME=$HOME/.local/share/cargo
|
||||||
if command -v ccache &> /dev/null; then
|
if command -v ccache &> /dev/null; then
|
||||||
export CCACHE_CONFIGPATH=${XDG_CONFIG_HOME:-$HOME/.config}/ccache.conf
|
export CCACHE_CONFIGPATH=$HOME/.config/ccache.conf
|
||||||
export CCACHE_DIR=${XDG_CACHE_HOME:-$HOME/.cache}/ccache
|
export CCACHE_DIR=$HOME/.cache/ccache
|
||||||
fi
|
fi
|
||||||
command -v conan &> /dev/null && \
|
command -v conan &> /dev/null && \
|
||||||
export CONAN_USER_HOME=$HOME/.local/share/conan
|
export CONAN_USER_HOME=$HOME/.local/share/conan
|
||||||
command -v docker &> /dev/null && \
|
command -v docker &> /dev/null && \
|
||||||
export DOCKER_CONFIG=$HOME/.local/share/docker
|
export DOCKER_CONFIG=$HOME/.local/share/docker
|
||||||
export GTK_RC_FILES=${XDG_CONFIG_HOME:-$HOME/.config}/gtk/gtkrc
|
export GTK_RC_FILES=$HOME/.config/gtk/gtkrc
|
||||||
export GTK2_RC_FILES=${XDG_CONFIG_HOME:-$HOME/.config}/gtk-2.0/gtkrc
|
export GTK2_RC_FILES=$HOME/.config/gtk-2.0/gtkrc
|
||||||
export PYLINTHOME=${XDG_CACHE_HOME:-$HOME/.cache}/pylint
|
export PYLINTHOME=$HOME/.cache/pylint
|
||||||
command -v rustup &> /dev/null && \
|
command -v rustup &> /dev/null && \
|
||||||
export RUSTUP_HOME=$HOME/.local/share/rustup
|
export RUSTUP_HOME=$HOME/.local/share/rustup
|
||||||
[ -f ${XDG_CONFIG_HOME:-$HOME/.config}/wget/rc ] && \
|
export WGETRC=$HOME/.config/wget/rc
|
||||||
export WGETRC=${XDG_CONFIG_HOME:-$HOME/.config}/wget/rc
|
|
||||||
# TODO: terminfo
|
# TODO: terminfo
|
||||||
export GOBIN=$HOME/.local/bin
|
|
||||||
export GOPATH=$HOME/.local/share/go
|
|
||||||
export GOCACHE=${XDG_CACHE_HOME:-$HOME/.cache}/go/build
|
|
||||||
export GOMODCACHE=${XDG_CACHE_HOME:-$HOME/.cache}/go/pkg/mod
|
|
||||||
export GOTMPDIR=${XDG_CACHE_HOME:-$HOME/.cache}/go/tmp
|
|
||||||
|
61
zshrc
61
zshrc
@ -3,12 +3,8 @@
|
|||||||
|
|
||||||
# Load plugin scripts
|
# Load plugin scripts
|
||||||
source-plugin() {
|
source-plugin() {
|
||||||
local shared_plugin=${XDG_DATA_HOME:-$HOME/.local/share}/zsh/plugins/$1/$1.plugin.zsh
|
if [ -d ~/.config/zsh/$1 ]; then
|
||||||
local local_plugin=${XDG_CONFIG_HOME:-$HOME/.config}/zsh/$1/$1.plugin.zsh
|
source ~/.config/zsh/$1/$1.plugin.zsh
|
||||||
if [ -f $shared_plugin ]; then
|
|
||||||
source $shared_plugin
|
|
||||||
elif [ -f $local_plugin ]; then
|
|
||||||
source $local_plugin
|
|
||||||
else
|
else
|
||||||
echo "zsh plugin not found: $1"
|
echo "zsh plugin not found: $1"
|
||||||
fi
|
fi
|
||||||
@ -26,8 +22,6 @@ HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND=
|
|||||||
|
|
||||||
# Command syntax highlighting
|
# Command syntax highlighting
|
||||||
source-plugin zsh-syntax-highlighting
|
source-plugin zsh-syntax-highlighting
|
||||||
(( ${+ZSH_HIGHLIGHT_STYLES} )) || typeset -A ZSH_HIGHLIGHT_STYLES
|
|
||||||
ZSH_HIGHLIGHT_STYLES[precommand]=fg=green
|
|
||||||
|
|
||||||
# Build system helper commands
|
# Build system helper commands
|
||||||
source-plugin build
|
source-plugin build
|
||||||
@ -41,9 +35,6 @@ source-plugin utilities
|
|||||||
# Automatically source .enter and .exit scripts on cd
|
# Automatically source .enter and .exit scripts on cd
|
||||||
source-plugin autoenv
|
source-plugin autoenv
|
||||||
|
|
||||||
# Session manager
|
|
||||||
source-plugin session
|
|
||||||
|
|
||||||
# Layout tmux window commands
|
# Layout tmux window commands
|
||||||
[ "$TMUX" != "" ] && source-plugin layout
|
[ "$TMUX" != "" ] && source-plugin layout
|
||||||
|
|
||||||
@ -76,7 +67,7 @@ setopt completeinword
|
|||||||
|
|
||||||
# Initialize completions
|
# Initialize completions
|
||||||
autoload -U compinit
|
autoload -U compinit
|
||||||
compinit -d ${XDG_CACHE_HOME:-$HOME/.cache}/zsh/compdump
|
compinit -d ~/.cache/zsh/compdump
|
||||||
|
|
||||||
# Add pip to the old completion engine if present
|
# Add pip to the old completion engine if present
|
||||||
if command -v pip &> /dev/null; then
|
if command -v pip &> /dev/null; then
|
||||||
@ -129,6 +120,9 @@ bindkey -M vicmd 'j' history-substring-search-down
|
|||||||
bindkey -r '^[h'
|
bindkey -r '^[h'
|
||||||
bindkey -M vicmd 'K' run-help
|
bindkey -M vicmd 'K' run-help
|
||||||
|
|
||||||
|
# Disable Ex mode with ':'
|
||||||
|
bindkey -rM vicmd ':'
|
||||||
|
|
||||||
# Enable '<Shirt><Tab>' reverse order completions
|
# Enable '<Shirt><Tab>' reverse order completions
|
||||||
bindkey '^[[Z' reverse-menu-complete
|
bindkey '^[[Z' reverse-menu-complete
|
||||||
|
|
||||||
@ -178,33 +172,12 @@ if [[ ! -z "$cursor_block" && ! -z "$cursor_line" ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Frequntly used directories
|
# Frequntly used directories
|
||||||
function frequent-directory() {
|
function frequent-directory() { export $1; hash -d $1 }
|
||||||
if [ -d "$2" ]; then
|
frequent-directory Projects="$HOME/Projects"
|
||||||
# Replace - with _ in environment variable name.
|
frequent-directory Sandbox="$HOME/Sandbox"
|
||||||
local name=${1//-/_}
|
|
||||||
local value=$2
|
|
||||||
export $name=$value
|
|
||||||
hash -d $1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
frequent-directory Desktop "$HOME/Desktop"
|
|
||||||
frequent-directory Documents "$HOME/Documents"
|
|
||||||
frequent-directory Downloads "$HOME/Downloads"
|
|
||||||
frequent-directory Projects "$HOME/Projects"
|
|
||||||
frequent-directory Sandbox "$HOME/Sandbox"
|
|
||||||
frequent-directory cache "${XDG_CACHE_HOME:-$HOME/.cache}"
|
|
||||||
frequent-directory config "${XDG_CONFIG_HOME:-$HOME/.config}"
|
|
||||||
frequent-directory local "$HOME/.local"
|
|
||||||
|
|
||||||
# Load work related config
|
# Load work related config
|
||||||
[ -f ${XDG_CONFIG_HOME:-$HOME/.config}/work/zshrc ] && \
|
[ -f ~/.config/work/zshrc ] && source ~/.config/work/zshrc
|
||||||
source ${XDG_CONFIG_HOME:-$HOME/.config}/work/zshrc
|
|
||||||
[ -f ${XDG_CONFIG_HOME:-$HOME/.config}/private/zshrc ] && \
|
|
||||||
source ${XDG_CONFIG_HOME:-$HOME/.config}/private/zshrc
|
|
||||||
[ -f ${XDG_CONFIG_HOME:-$HOME/.config}/zsh/local ] && \
|
|
||||||
source ${XDG_CONFIG_HOME:-$HOME/.config}/zsh/local
|
|
||||||
[ -f ${XDG_CONFIG_HOME:-$HOME/.config}/zsh/zshrc.local ] && \
|
|
||||||
source ${XDG_CONFIG_HOME:-$HOME/.config}/zsh/zshrc.local
|
|
||||||
|
|
||||||
# Aliases
|
# Aliases
|
||||||
alias grep='grep --color=always'
|
alias grep='grep --color=always'
|
||||||
@ -230,17 +203,3 @@ case `uname` in
|
|||||||
alias debug='lldb --'
|
alias debug='lldb --'
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
command -v wol > /dev/null && \
|
|
||||||
alias wakeonlan='wol'
|
|
||||||
|
|
||||||
# Append any aliases to notify_ignore_list if they contain any ignore commands
|
|
||||||
# NOTE: Keep this at the end of ~/.zshrc so all aliases are processed
|
|
||||||
for name in ${(k)aliases}; do
|
|
||||||
cmd=${${${$(alias $name)#${name}=}#\'}#\"}
|
|
||||||
for ignore in $notify_ignore_list; do
|
|
||||||
if [[ "$cmd" = "$ignore"* ]]; then
|
|
||||||
notify_ignore_list+=( $name )
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user