From 3d6a64111c1d8f70f0c8a07bc1e80e5a24539868 Mon Sep 17 00:00:00 2001 From: EeeeKa Date: Tue, 28 Sep 2021 12:27:41 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=2028.09.2021?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tmux/tmux.conf | 1 + zsh/lib/completion.zsh | 7 +- zsh/oh-my-zsh.sh | 2 +- zsh/plugins/archlinux/README.md | 4 - zsh/plugins/archlinux/archlinux.plugin.zsh | 4 - zsh/plugins/django/README.md | 38 +--- zsh/plugins/django/django.plugin.zsh | 3 + zsh/plugins/jsontools/README.md | 47 ++++- zsh/plugins/jsontools/jsontools.plugin.zsh | 139 ++++++++++--- zsh/plugins/vi-mode/README.md | 20 +- .../vim-interaction.plugin.zsh | 48 +++-- zsh/templates/zshrc.zsh-template | 5 +- zsh/tools/install.sh | 193 +++++++++++++----- zsh/tools/upgrade.sh | 17 +- 14 files changed, 370 insertions(+), 158 deletions(-) diff --git a/tmux/tmux.conf b/tmux/tmux.conf index 2e3b8d4..aa1b106 100644 --- a/tmux/tmux.conf +++ b/tmux/tmux.conf @@ -361,3 +361,4 @@ run '~/.dots/tmux/plugins/tmux-yank/yank.tmux' run '~/.dots/tmux/plugins/tmux-ressurect/resurrect.tmux' run '~/.dots/tmux/plugins/tmux-continuum/continuum.tmux' + diff --git a/zsh/lib/completion.zsh b/zsh/lib/completion.zsh index ebaab08..2c56954 100644 --- a/zsh/lib/completion.zsh +++ b/zsh/lib/completion.zsh @@ -58,9 +58,12 @@ zstyle ':completion:*:*:*:users' ignored-patterns \ # ... unless we really want to. zstyle '*' single-ignored show -if [[ $COMPLETION_WAITING_DOTS = true ]]; then +if [[ ${COMPLETION_WAITING_DOTS:-false} != false ]]; then expand-or-complete-with-dots() { - print -Pn "%F{red}…%f" + # use $COMPLETION_WAITING_DOTS either as toggle or as the sequence to show + [[ $COMPLETION_WAITING_DOTS = true ]] && COMPLETION_WAITING_DOTS="%F{red}…%f" + # turn off line wrapping and print prompt-expanded "dot" sequence + printf '\e[?7l%s\e[?7h' "${(%)COMPLETION_WAITING_DOTS}" zle expand-or-complete zle redisplay } diff --git a/zsh/oh-my-zsh.sh b/zsh/oh-my-zsh.sh index 83c8f80..545d980 100644 --- a/zsh/oh-my-zsh.sh +++ b/zsh/oh-my-zsh.sh @@ -14,7 +14,7 @@ fi # Create cache and completions dir and add to $fpath mkdir -p "$ZSH_CACHE_DIR/completions" -(( ${fpath[(Ie)$ZSH_CACHE_DIR/completions]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath) +(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath) # Check for updates on initial load... if [ "$DISABLE_AUTO_UPDATE" != "true" ]; then diff --git a/zsh/plugins/archlinux/README.md b/zsh/plugins/archlinux/README.md index d4706e2..d6b41ee 100644 --- a/zsh/plugins/archlinux/README.md +++ b/zsh/plugins/archlinux/README.md @@ -143,8 +143,6 @@ upgrades were available. Use `pacman -Que` instead. | yaupd | `yaourt -Sy` | Update and refresh local package, ABS and AUR databases | | yaupg | `yaourt -Syua` | Sync with repositories before upgrading all packages (from AUR too) | | yasu | `yaourt -Syua --no-confirm` | Same as `yaupg`, but without confirmation | -| yaclun | `yaourt -Yc` | Remove unneeded installed packages | -| yaclf | `yaourt -Scc` | Remove cache directories | | upgrade[²](#f2) | `yaourt -Syu` | Sync with repositories before upgrading packages | #### Yay[¹](#f1) @@ -167,8 +165,6 @@ upgrades were available. Use `pacman -Que` instead. | yaupd | `yay -Sy` | Update and refresh local package, ABS and AUR databases | | yaupg | `yay -Syu` | Sync with repositories before upgrading packages | | yasu | `yay -Syu --no-confirm` | Same as `yaupg`, but without confirmation | -| yaclun | `yay -Yc` | Remove unneeded installed packages | -| yaclf | `yay -Scc` | Remove cache directories | | upgrade[²](#f2) | `yay -Syu` | Sync with repositories before upgrading packages | --- diff --git a/zsh/plugins/archlinux/archlinux.plugin.zsh b/zsh/plugins/archlinux/archlinux.plugin.zsh index d34a4cd..c94fb8f 100644 --- a/zsh/plugins/archlinux/archlinux.plugin.zsh +++ b/zsh/plugins/archlinux/archlinux.plugin.zsh @@ -170,8 +170,6 @@ if (( $+commands[yaourt] )); then alias yainsd='yaourt -S --asdeps' alias yamir='yaourt -Syy' alias yaupd="yaourt -Sy" - alias yaclun='yaourt -Yc' - alias yaclf='yaourt -Scc' alias upgrade='yaourt -Syu' fi @@ -192,8 +190,6 @@ if (( $+commands[yay] )); then alias yainsd='yay -S --asdeps' alias yamir='yay -Syy' alias yaupd="yay -Sy" - alias yaclun='yay -Yc' - alias yaclf='yay -Scc' alias upgrade='yay -Syu' fi diff --git a/zsh/plugins/django/README.md b/zsh/plugins/django/README.md index 1740e55..cfab439 100644 --- a/zsh/plugins/django/README.md +++ b/zsh/plugins/django/README.md @@ -1,36 +1,12 @@ # Django plugin -This plugin adds completion and hints for the [Django Project](https://www.djangoproject.com/) `manage.py` commands -and options. +This plugin adds completion for the [Django Project](https://www.djangoproject.com/) commands +(`manage.py`, `django-admin`, ...). -To use it, add `django` to the plugins array in your zshrc file: +## Deprecation (2021-09-22) -```zsh -plugins=(... django) -``` +The plugin used to provide completion for `./manage.py` and `django-admin`, but Zsh already provides +a better, more extensive completion for those, so this plugin is no longer needed. -## Usage - -```zsh -$> python manage.py (press here) -``` - -Would result in: - -```zsh -cleanup -- remove old data from the database -compilemessages -- compile .po files to .mo for use with gettext -createcachetable -- creates table for SQL cache backend -createsuperuser -- create a superuser -dbshell -- run command-line client for the current database -diffsettings -- display differences between the current settings and Django defaults -dumpdata -- output contents of database as a fixture -flush -- execute 'sqlflush' on the current database -inspectdb -- output Django model module for tables in database -loaddata -- install the named fixture(s) in the database -makemessages -- pull out all strings marked for translation -reset -- executes 'sqlreset' for the given app(s) -runfcgi -- run this project as a fastcgi -runserver -- start a lightweight web server for development -... -``` +Right now a warning message is shown, but in the near future the plugin will stop working altogether. +So you can remove it from your plugins and you'll automatically start using Zsh's django completion. diff --git a/zsh/plugins/django/django.plugin.zsh b/zsh/plugins/django/django.plugin.zsh index c2d00c1..a07a308 100644 --- a/zsh/plugins/django/django.plugin.zsh +++ b/zsh/plugins/django/django.plugin.zsh @@ -402,3 +402,6 @@ compdef _managepy django compdef _managepy django-admin compdef _managepy django-admin.py compdef _managepy django-manage + +print -P "%F{yellow}The django plugin is deprecated in favor of Zsh's Django completion. +%BPlease remove it from your plugins to stop using it.%b%f" diff --git a/zsh/plugins/jsontools/README.md b/zsh/plugins/jsontools/README.md index 1fa2b8e..6a27400 100644 --- a/zsh/plugins/jsontools/README.md +++ b/zsh/plugins/jsontools/README.md @@ -17,32 +17,63 @@ Usage is simple... just take your json data and pipe it into the appropriate jso - `urlencode_json`: returns a url encoded string for the given json. - `urldecode_json`: returns decoded json for the given url encoded string. +### Supports NDJSON (Newline Delimited JSON) + +The plugin also supports [NDJSON](http://ndjson.org/) input, which means all functions +have an alternative function that reads and processes the input line by line. These +functions have the same name except using `ndjson` instead of `json`: + +> `pp_ndjson`, `is_ndjson`, `urlencode_ndjson`, `urldecode_ndjson`. + ### Examples - **pp_json**: -```sh +```console # curl json data and pretty print the results curl https://coderwall.com/bobwilliams.json | pp_json ``` - **is_json**: -```sh -# Validate if file's content conforms to a valid JSON schema -less data.json | is_json +```console +# validate if file's content conforms to a valid JSON schema +$ is_json < data.json +true +# shows true / false and returns the proper exit code +$ echo $? +0 ``` - **urlencode_json**: -```sh +```console # json data directly from the command line -echo '{"b":2, "a":1}' | urlencode_json +$ echo '{"b":2, "a":1}' | urlencode_json +%7B%22b%22:2,%20%22a%22:1%7D ``` - **urldecode_json**: -```sh +```console # url encoded string to decode -echo '%7B%22b%22:2,%20%22a%22:1%7D%0A' | urldecode_json +$ echo '%7B%22b%22:2,%20%22a%22:1%7D' | urldecode_json +{"b":2, "a":1} +``` + +- **pp_ndjson**: + +```console +# echo two separate json objects and pretty print both +$ echo '{"a": "b"}\n{"c": [1,2,3]}' | pp_ndjson +{ + "a": "b" +} +{ + "c": [ + 1, + 2, + 3 + ] +} ``` diff --git a/zsh/plugins/jsontools/jsontools.plugin.zsh b/zsh/plugins/jsontools/jsontools.plugin.zsh index 912c835..ed45cfa 100644 --- a/zsh/plugins/jsontools/jsontools.plugin.zsh +++ b/zsh/plugins/jsontools/jsontools.plugin.zsh @@ -1,42 +1,113 @@ # JSON Tools # Adds command line aliases useful for dealing with JSON -if [[ $(whence $JSONTOOLS_METHOD) = "" ]]; then - JSONTOOLS_METHOD="" +# Check that user-defined method is installed +if [[ -n "$JSONTOOLS_METHOD" ]]; then + (( $+commands[$JSONTOOLS_METHOD] )) || unset JSONTOOLS_METHOD fi -if [[ $(whence node) != "" && ( "x$JSONTOOLS_METHOD" = "x" || "x$JSONTOOLS_METHOD" = "xnode" ) ]]; then - alias pp_json='xargs -0 node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, 4));"' - alias is_json='xargs -0 node -e "try {json = JSON.parse(process.argv[1]);} catch (e) { console.log(false); json = null; } if(json) { console.log(true); }"' - alias urlencode_json='xargs -0 node -e "console.log(encodeURIComponent(process.argv[1]))"' - alias urldecode_json='xargs -0 node -e "console.log(decodeURIComponent(process.argv[1]))"' -elif [[ $(whence python) != "" && ( "x$JSONTOOLS_METHOD" = "x" || "x$JSONTOOLS_METHOD" = "xpython" ) ]]; then - alias pp_json='python -c "import sys; del sys.path[0]; import runpy; runpy._run_module_as_main(\"json.tool\")"' - alias is_json='python -c " -import sys; del sys.path[0]; -import json; -try: - json.loads(sys.stdin.read()) -except ValueError, e: - print False -else: - print True -sys.exit(0)"' - alias urlencode_json='python -c " -import sys; del sys.path[0]; -import urllib, json; -print urllib.quote_plus(sys.stdin.read()) -sys.exit(0)"' - alias urldecode_json='python -c " -import sys; del sys.path[0]; -import urllib, json; -print urllib.unquote_plus(sys.stdin.read()) -sys.exit(0)"' -elif [[ $(whence ruby) != "" && ( "x$JSONTOOLS_METHOD" = "x" || "x$JSONTOOLS_METHOD" = "xruby" ) ]]; then - alias pp_json='ruby -e "require \"json\"; require \"yaml\"; puts JSON.parse(STDIN.read).to_yaml"' - alias is_json='ruby -e "require \"json\"; begin; JSON.parse(STDIN.read); puts true; rescue Exception => e; puts false; end"' - alias urlencode_json='ruby -e "require \"uri\"; puts URI.escape(STDIN.read)"' - alias urldecode_json='ruby -e "require \"uri\"; puts URI.unescape(STDIN.read)"' +# If method undefined, find the first one that is installed +if [[ ! -v JSONTOOLS_METHOD ]]; then + for JSONTOOLS_METHOD in node python ruby; do + # If method found, break out of loop + (( $+commands[$JSONTOOLS_METHOD] )) && break + # Otherwise unset the variable + unset JSONTOOLS_METHOD + done + + # If no methods were found, exit the plugin + [[ -v JSONTOOLS_METHOD ]] || return 1 fi +# Define json tools for each method +case "$JSONTOOLS_METHOD" in + node) + # node doesn't make it easy to deal with stdin, so we pass it as an argument with xargs -0 + function pp_json() { + xargs -0 node -e 'console.log(JSON.stringify(JSON.parse(process.argv[1]), null, 4));' + } + function is_json() { + xargs -0 node -e ' + try { + json = JSON.parse(process.argv[1]); + console.log("true"); + process.exit(0); + } catch (e) { + console.log("false"); + process.exit(1); + } + ' + } + function urlencode_json() { + xargs -0 node -e "console.log(encodeURIComponent(process.argv[1]))" + } + function urldecode_json() { + xargs -0 node -e "console.log(decodeURIComponent(process.argv[1]))" + } + ;; + python) + function pp_json() { + python -c 'import sys; del sys.path[0]; import runpy; runpy._run_module_as_main("json.tool")' + } + function is_json() { + python -c ' +import sys; del sys.path[0]; +import json +try: + json.loads(sys.stdin.read()) + print("true"); sys.exit(0) +except ValueError: + print("false"); sys.exit(1) + ' + } + function urlencode_json() { + python -c ' +import sys; del sys.path[0]; +from urllib.parse import quote_plus +print(quote_plus(sys.stdin.read())) + ' + } + function urldecode_json() { + python -c ' +import sys; del sys.path[0]; +from urllib.parse import unquote_plus +print(unquote_plus(sys.stdin.read())) + ' + } + ;; + ruby) + function pp_json() { + ruby -e ' + require "json" + require "yaml" + puts JSON.parse(STDIN.read).to_yaml + ' + } + function is_json() { + ruby -e ' + require "json" + begin + puts !!JSON.parse(STDIN.read); exit(0) + rescue JSON::ParserError + puts false; exit(1) + end + ' + } + function urlencode_json() { + ruby -e 'require "cgi"; puts CGI.escape(STDIN.read)' + } + function urldecode_json() { + ruby -e 'require "cgi"; puts CGI.unescape(STDIN.read)' + } + ;; +esac unset JSONTOOLS_METHOD + +## Add NDJSON support + +function {pp,is,urlencode,urldecode}_ndjson() { + local json jsonfunc="${0//ndjson/json}" + while read -r json; do + $jsonfunc <<< "$json" + done +} diff --git a/zsh/plugins/vi-mode/README.md b/zsh/plugins/vi-mode/README.md index b59d5f2..46bb6d0 100644 --- a/zsh/plugins/vi-mode/README.md +++ b/zsh/plugins/vi-mode/README.md @@ -64,7 +64,7 @@ NOTE: some of these key bindings are set by zsh by default when using a vi-mode - `vv` : Edit current command line in Vim -NOTE: this used to be bound to `v`. That is now the default (`visual-mode`) +NOTE: this used to be bound to `v`. That is now the default (`visual-mode`). ### Movement @@ -107,3 +107,21 @@ NOTE: this used to be bound to `v`. That is now the default (`visual-mode`) - `R` : Enter replace mode: Each character replaces existing one - `x` : Delete `count` characters under and after the cursor - `X` : Delete `count` characters before the cursor + +## Known issues + +### Low `$KEYTIMEOUT` + +A low `$KEYTIMEOUT` value (< 15) means that key bindings that need multiple characters, +like `vv`, will be very difficult to trigger. `$KEYTIMEOUT` controls the number of +milliseconds that must pass before a key press is read and the appropriate key binding +is triggered. For multi-character key bindings, the key presses need to happen before +the timeout is reached, so on low timeouts the key press happens too slow, and therefore +another key binding is triggered. + +We recommend either setting `$KEYTIMEOUT` to a higher value, or remapping the key bindings +that you want to trigger to a keyboard sequence. For example: + +```zsh +bindkey -M vicmd 'V' edit-command-line # this remaps `vv` to `V` (but overrides `visual-mode`) +``` diff --git a/zsh/plugins/vim-interaction/vim-interaction.plugin.zsh b/zsh/plugins/vim-interaction/vim-interaction.plugin.zsh index 53ec453..b73f9b4 100644 --- a/zsh/plugins/vim-interaction/vim-interaction.plugin.zsh +++ b/zsh/plugins/vim-interaction/vim-interaction.plugin.zsh @@ -4,8 +4,7 @@ # Derek Wyatt (derek@{myfirstnamemylastname}.org # -function callvim -{ +function callvim { if [[ $# == 0 ]]; then cat <} == $after ]]; then - after="$after" - fi - if [[ ${before#:} != $before && ${before%} == $before ]]; then - before="$before" - fi - local files - if [[ $# -gt 0 ]]; then - # absolute path of files resolving symlinks (:A) and quoting special chars (:q) - files=':args! '"${@:A:q}" - fi + + # If before or after commands begin with : and don't end with , append it + [[ ${after} = :* && ${after} != *\ ]] && after+="" + [[ ${before} = :* && ${before} != *\ ]] && before+="" + # Open files passed (:A means abs path resolving symlinks, :q means quoting special chars) + [[ $# -gt 0 ]] && files=':args! '"${@:A:q}" + # Pass the built vim command to gvim cmd="$before$files$after" - gvim --servername "$name" --remote-send "$cmd" - if typeset -f postCallVim > /dev/null; then - postCallVim - fi + + # Run the gvim command + gvim --servername "$name" --remote-send "$cmd" || return $? + + # Run postCallVim if defined (maybe to bring focus to gvim, see README) + (( ! $+functions[postCallVim] )) || postCallVim } alias v=callvim diff --git a/zsh/templates/zshrc.zsh-template b/zsh/templates/zshrc.zsh-template index 65d5ea6..4a998c2 100644 --- a/zsh/templates/zshrc.zsh-template +++ b/zsh/templates/zshrc.zsh-template @@ -45,8 +45,9 @@ ZSH_THEME="robbyrussell" # ENABLE_CORRECTION="true" # Uncomment the following line to display red dots whilst waiting for completion. -# Caution: this setting can cause issues with multiline prompts (zsh 5.7.1 and newer seem to work) -# See https://github.com/ohmyzsh/ohmyzsh/issues/5765 +# You can also set it to another string to have that shown instead of the default red dots. +# e.g. COMPLETION_WAITING_DOTS="%F{yellow}waiting...%f" +# Caution: this setting can cause issues with multiline prompts in zsh < 5.7.1 (see #5765) # COMPLETION_WAITING_DOTS="true" # Uncomment the following line if you want to disable marking untracked files diff --git a/zsh/tools/install.sh b/zsh/tools/install.sh index cfc2808..7704107 100755 --- a/zsh/tools/install.sh +++ b/zsh/tools/install.sh @@ -53,39 +53,133 @@ KEEP_ZSHRC=${KEEP_ZSHRC:-no} command_exists() { - command -v "$@" >/dev/null 2>&1 + command -v "$@" >/dev/null 2>&1 +} + +# The [ -t 1 ] check only works when the function is not called from +# a subshell (like in `$(...)` or `(...)`, so this hack redefines the +# function at the top level to always return false when stdout is not +# a tty. +if [ -t 1 ]; then + is_tty() { + true + } +else + is_tty() { + false + } +fi + +# This function uses the logic from supports-hyperlinks[1][2], which is +# made by Kat Marchán (@zkat) and licensed under the Apache License 2.0. +# [1] https://github.com/zkat/supports-hyperlinks +# [2] https://crates.io/crates/supports-hyperlinks +# +# Copyright (c) 2021 Kat Marchán +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +supports_hyperlinks() { + # $FORCE_HYPERLINK must be set and be non-zero (this acts as a logic bypass) + if [ -n "$FORCE_HYPERLINK" ]; then + [ "$FORCE_HYPERLINK" != 0 ] + return $? + fi + + # If stdout is not a tty, it doesn't support hyperlinks + is_tty || return 1 + + # DomTerm terminal emulator (domterm.org) + if [ -n "$DOMTERM" ]; then + return 0 + fi + + # VTE-based terminals above v0.50 (Gnome Terminal, Guake, ROXTerm, etc) + if [ -n "$VTE_VERSION" ]; then + [ $VTE_VERSION -ge 5000 ] + return $? + fi + + # If $TERM_PROGRAM is set, these terminals support hyperlinks + case "$TERM_PROGRAM" in + Hyper|iTerm.app|terminology|WezTerm) return 0 ;; + esac + + # kitty supports hyperlinks + if [ "$TERM" = xterm-kitty ]; then + return 0 + fi + + # Windows Terminal or Konsole also support hyperlinks + if [ -n "$WT_SESSION" ] || [ -n "$KONSOLE_VERSION" ]; then + return 0 + fi + + return 1 +} + +fmt_link() { + # $1: text, $2: url, $3: fallback mode + if supports_hyperlinks; then + printf '\033]8;;%s\a%s\033]8;;\a\n' "$2" "$1" + return + fi + + case "$3" in + --text) printf '%s\n' "$1" ;; + --url|*) fmt_underline "$2" ;; + esac +} + +fmt_underline() { + is_tty && printf '\033[4m%s\033[24m\n' "$*" || printf '%s\n' "$*" +} + +# shellcheck disable=SC2016 # backtick in single-quote +fmt_code() { + is_tty && printf '`\033[2m%s\033[22m`\n' "$*" || printf '`%s`\n' "$*" } fmt_error() { printf '%sError: %s%s\n' "$BOLD$RED" "$*" "$RESET" >&2 } -fmt_underline() { - printf '\033[4m%s\033[24m\n' "$*" -} - -fmt_code() { - # shellcheck disable=SC2016 # backtic in single-quote - printf '`\033[38;5;247m%s%s`\n' "$*" "$RESET" -} - setup_color() { - # Only use colors if connected to a terminal - if [ -t 1 ]; then - RED=$(printf '\033[31m') - GREEN=$(printf '\033[32m') - YELLOW=$(printf '\033[33m') - BLUE=$(printf '\033[34m') - BOLD=$(printf '\033[1m') - RESET=$(printf '\033[m') - else - RED="" - GREEN="" - YELLOW="" - BLUE="" - BOLD="" - RESET="" - fi + # Only use colors if connected to a terminal + if is_tty; then + RAINBOW=" + $(printf '\033[38;5;196m') + $(printf '\033[38;5;202m') + $(printf '\033[38;5;226m') + $(printf '\033[38;5;082m') + $(printf '\033[38;5;021m') + $(printf '\033[38;5;093m') + $(printf '\033[38;5;163m') + " + RED=$(printf '\033[31m') + GREEN=$(printf '\033[32m') + YELLOW=$(printf '\033[33m') + BLUE=$(printf '\033[34m') + BOLD=$(printf '\033[1m') + RESET=$(printf '\033[m') + else + RAINBOW="" + RED="" + GREEN="" + YELLOW="" + BLUE="" + BOLD="" + RESET="" + fi } setup_ohmyzsh() { @@ -114,6 +208,8 @@ setup_ohmyzsh() { -c fsck.zeroPaddedFilemode=ignore \ -c fetch.fsck.zeroPaddedFilemode=ignore \ -c receive.fsck.zeroPaddedFilemode=ignore \ + -c oh-my-zsh.remote=origin \ + -c oh-my-zsh.branch="$BRANCH" \ --depth=1 --branch "$BRANCH" "$REMOTE" "$ZSH" || { fmt_error "git clone of oh-my-zsh repo failed" exit 1 @@ -157,9 +253,9 @@ setup_zshrc() { sed "/^export ZSH=/ c\\ export ZSH=\"$ZSH\" " "$ZSH/templates/zshrc.zsh-template" > ~/.zshrc-omztemp - mv -f ~/.zshrc-omztemp ~/.zshrc + mv -f ~/.zshrc-omztemp ~/.zshrc - echo + echo } setup_shell() { @@ -241,6 +337,26 @@ EOF echo } +# shellcheck disable=SC2183 # printf string has more %s than arguments ($RAINBOW expands to multiple arguments) +print_success() { + printf '%s %s__ %s %s %s %s %s__ %s\n' $RAINBOW $RESET + printf '%s ____ %s/ /_ %s ____ ___ %s__ __ %s ____ %s_____%s/ /_ %s\n' $RAINBOW $RESET + printf '%s / __ \%s/ __ \ %s / __ `__ \%s/ / / / %s /_ / %s/ ___/%s __ \ %s\n' $RAINBOW $RESET + printf '%s/ /_/ /%s / / / %s / / / / / /%s /_/ / %s / /_%s(__ )%s / / / %s\n' $RAINBOW $RESET + printf '%s\____/%s_/ /_/ %s /_/ /_/ /_/%s\__, / %s /___/%s____/%s_/ /_/ %s\n' $RAINBOW $RESET + printf '%s %s %s %s /____/ %s %s %s %s....is now installed!%s\n' $RAINBOW $GREEN $RESET + printf '\n' + printf '\n' + printf "%s %s %s\n" "Before you scream ${BOLD}${YELLOW}Oh My Zsh!${RESET} look over the" \ + "$(fmt_code "$(fmt_link ".zshrc" "file://$HOME/.zshrc" --text)")" \ + "file to select plugins, themes, and options." + printf '\n' + printf '%s\n' "• Follow us on Twitter: $(fmt_link @ohmyzsh https://twitter.com/ohmyzsh)" + printf '%s\n' "• Join our Discord community: $(fmt_link "Discord server" https://discord.gg/ohmyzsh)" + printf '%s\n' "• Get stickers, t-shirts, coffee mugs and more: $(fmt_link "Planet Argon Shop" https://shop.planetargon.com/collections/oh-my-zsh)" + printf '%s\n' $RESET +} + main() { # Run as unattended if stdin is not a tty if [ ! -t 0 ]; then @@ -291,26 +407,7 @@ EOF setup_zshrc setup_shell - printf %s "$GREEN" - cat <<'EOF' - __ __ - ____ / /_ ____ ___ __ __ ____ _____/ /_ - / __ \/ __ \ / __ `__ \/ / / / /_ / / ___/ __ \ -/ /_/ / / / / / / / / / / /_/ / / /_(__ ) / / / -\____/_/ /_/ /_/ /_/ /_/\__, / /___/____/_/ /_/ - /____/ ....is now installed! - - -EOF - cat <