diff --git a/zsh/11-autocomplete.zsh b/zsh/11-autocomplete.zsh index 991193f..95c4eab 100644 --- a/zsh/11-autocomplete.zsh +++ b/zsh/11-autocomplete.zsh @@ -4,8 +4,18 @@ if [ "${OS}" = "Darwin" ] && [ "${OS_ARCH}" = "arm64" ]; then export fpath=(${fpath} /opt/homebrew/share/zsh/site-functions) fi +# The same goes for Homebrew on Linux. +# Yes, /home/linuxbrew is universal for every standard brew install on Linux. +if [ "${OS}" = "Linux" ] && [ -d "/home/linuxbrew/.linuxbrew/share/zsh/site-functions" ]; then + export fpath=(${fpath} /home/linuxbrew/.linuxbrew/share/zsh/site-functions) +fi + autoload -Uz compinit compinit zstyle ':completion:*' menu select=2 zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' + +if [ "${LIMA_DOCKER}" = "1" ]; then + compdef docker-amd64=docker +fi diff --git a/zsh/30-keys.zsh b/zsh/30-keys.zsh index c2430e7..73e6a8f 100644 --- a/zsh/30-keys.zsh +++ b/zsh/30-keys.zsh @@ -22,26 +22,30 @@ select-word-style bash bindkey '\ew' kill-region # [Esc-w] - Kill from the cursor to the mark bindkey -s '\el' 'ls\n' # [Esc-l] - run command: ls -bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backward incrementally for a specified string. The string may begin with ^ to anchor the search to the beginning of the line. -if [[ "${terminfo[kpp]}" != "" ]]; then - bindkey "${terminfo[kpp]}" up-line-or-history # [PageUp] - Up a line of history -fi -if [[ "${terminfo[knp]}" != "" ]]; then - bindkey "${terminfo[knp]}" down-line-or-history # [PageDown] - Down a line of history -fi -if [[ "${terminfo[kcuu1]}" != "" ]]; then - bindkey "${terminfo[kcuu1]}" up-line-or-search # start typing + [Up-Arrow] - fuzzy find history forward -fi -if [[ "${terminfo[kcud1]}" != "" ]]; then - bindkey "${terminfo[kcud1]}" down-line-or-search # start typing + [Down-Arrow] - fuzzy find history backward +# Search history bindings. They apply if atuin is not installed. +if [[ ! -x $(command -v atuin) ]]; then + bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backward incrementally for a specified string. The string may begin with ^ to anchor the search to the beginning of the line. + if [[ "${terminfo[kpp]}" != "" ]]; then + bindkey "${terminfo[kpp]}" up-line-or-history # [PageUp] - Up a line of history + fi + if [[ "${terminfo[knp]}" != "" ]]; then + bindkey "${terminfo[knp]}" down-line-or-history # [PageDown] - Down a line of history + fi + + if [[ "${terminfo[kcuu1]}" != "" ]]; then + bindkey "${terminfo[kcuu1]}" up-line-or-search # start typing + [Up-Arrow] - fuzzy find history forward + fi + if [[ "${terminfo[kcud1]}" != "" ]]; then + bindkey "${terminfo[kcud1]}" down-line-or-search # start typing + [Down-Arrow] - fuzzy find history backward + fi fi if [[ "${terminfo[khome]}" != "" ]]; then - bindkey "${terminfo[khome]}" beginning-of-line # [Home] - Go to beginning of line + bindkey "${terminfo[khome]}" beginning-of-line # [Home] - Go to beginning of line fi if [[ "${terminfo[kend]}" != "" ]]; then - bindkey "${terminfo[kend]}" end-of-line # [End] - Go to end of line + bindkey "${terminfo[kend]}" end-of-line # [End] - Go to end of line fi bindkey ' ' magic-space # [Space] - do history expansion @@ -50,16 +54,16 @@ bindkey '^[[1;5C' forward-word # [Ctrl-RightArrow] - move bindkey '^[[1;5D' backward-word # [Ctrl-LeftArrow] - move backward one word if [[ "${terminfo[kcbt]}" != "" ]]; then - bindkey "${terminfo[kcbt]}" reverse-menu-complete # [Shift-Tab] - move through the completion menu backwards + bindkey "${terminfo[kcbt]}" reverse-menu-complete # [Shift-Tab] - move through the completion menu backwards fi bindkey '^?' backward-delete-char # [Backspace] - delete backward if [[ "${terminfo[kdch1]}" != "" ]]; then - bindkey "${terminfo[kdch1]}" delete-char # [Delete] - delete forward + bindkey "${terminfo[kdch1]}" delete-char # [Delete] - delete forward else - bindkey "^[[3~" delete-char - bindkey "^[3;5~" delete-char - bindkey "\e[3~" delete-char + bindkey "^[[3~" delete-char + bindkey "^[3;5~" delete-char + bindkey "\e[3~" delete-char fi case "${TERM}" in diff --git a/zsh/aliases/00-default.conf b/zsh/aliases/00-default.conf index 52ba135..e189c97 100644 --- a/zsh/aliases/00-default.conf +++ b/zsh/aliases/00-default.conf @@ -6,4 +6,4 @@ alias ls="ls --color" alias sl="ls --color" # Git. -alias got="git" \ No newline at end of file +alias got="git" diff --git a/zsh/apps/atuin.app.zsh b/zsh/apps/atuin.app.zsh new file mode 100644 index 0000000..78d60fe --- /dev/null +++ b/zsh/apps/atuin.app.zsh @@ -0,0 +1,5 @@ +atuin_init() { + eval "$(atuin init zsh)" +} + +atuin_init diff --git a/zsh/apps/bazzite-cli.app.zsh b/zsh/apps/bazzite-cli.app.zsh new file mode 100644 index 0000000..52b5cf6 --- /dev/null +++ b/zsh/apps/bazzite-cli.app.zsh @@ -0,0 +1,9 @@ +function bazzite-cli() { + # Those two are conflicting with Bazzite CLI aliases. + unalias ls + unalias sl + + source /usr/share/bazzite-cli/bling.sh +} + +bazzite-cli diff --git a/zsh/apps/lima-docker.app.zsh b/zsh/apps/lima-docker.app.zsh new file mode 100644 index 0000000..dcadcb4 --- /dev/null +++ b/zsh/apps/lima-docker.app.zsh @@ -0,0 +1,66 @@ +# Functions for docker in Lima for macOS. +# Requires lima, docker, docker-compose and docker-credentials-helper to be installed. + +if [ "${OS/Darwin}" != "${OS}" ]; then + LIMA_DOCKER=1 + + # Candidates cobra offers for the last argument, one per line, without the directive line or descriptions + function _docker_complete() { + local -a out=("${(@f)$(command docker __complete "$@" 2>/dev/null)}") + print -rl -- "${(@)${(@)out:#:*}%%$'\t'*}" + } + + function _docker_with_platform() { + local platform=$1 extra=$2 + shift 2 + local -a args=("$@") + + # Completion requests and explicitly pinned platforms pass through untouched + if [[ $1 == __complete* ]] || (( ${args[(I)(--platform|--platform=*)]} )); then + command docker "$@" + return + fi + + # Walk the command path; stop at the first command that accepts --platform + local -i i pos=0 + local -a cmds flags + for (( i = 1; i <= $#args; i++ )); do + [[ ${args[i]} == -* ]] && continue + + cmds=("${(@f)$(_docker_complete "${(@)args[1,i-1]}" "")}") + if (( ! ${cmds[(Ie)${args[i]}]} )); then + # Not a command: either the previous option's value, or we've left the command path + (( i > 1 )) && [[ ${args[i-1]} == -* && ${args[i-1]} != *=* ]] && continue + break + fi + + flags=("${(@f)$(_docker_complete "${(@)args[1,i]}" -)}") + if (( ${flags[(Ie)--platform]} )); then + pos=$i + break + fi + done + + if (( pos )); then + local -a inject=(--platform=$platform) + local f name + for f in ${=extra}; do + name=${f%%=*} + # Only if this command accepts it and the user didn't pass it already + (( ${flags[(Ie)$name]} && ! ${args[(I)$name(|=*)]} )) && inject+=("$f") + done + args=("${(@)args[1,pos]}" $inject "${(@)args[pos+1,-1]}") + print -u2 $'\e[34m-> docker '"${(j: :)${(@q-)args}}"$'\e[0m' + fi + + command docker "${args[@]}" + } + + function docker() { + _docker_with_platform "linux/arm64/v8" "" "$@" + } + + function docker-amd64() { + _docker_with_platform "linux/amd64" "--device=lima-vm.io/rosetta=cached" "$@" + } +fi diff --git a/zsh/defaults/02-apps.conf b/zsh/defaults/02-apps.conf index 16b28dc..8147afb 100644 --- a/zsh/defaults/02-apps.conf +++ b/zsh/defaults/02-apps.conf @@ -1,2 +1,2 @@ # Apps list to enable. -ENABLED_APPS=("showcolors") +ENABLED_APPS=("gitinfo" "showcolors")