Refactor zsh4humans to foxshell - complete rebrand with new repository integration
This commit is contained in:
parent
0610f4aeab
commit
2b6ea4f5a3
7 changed files with 908 additions and 51 deletions
26
.zshenv
26
.zshenv
|
@ -1,4 +1,4 @@
|
||||||
# Documentation: https://github.com/romkatv/zsh4humans/blob/v5/README.md.
|
# Documentation: https://git.foxdale.tech/Arctic/foxshell/blob/main/README.md.
|
||||||
#
|
#
|
||||||
# Do not modify this file unless you know exactly what you are doing.
|
# Do not modify this file unless you know exactly what you are doing.
|
||||||
# It is strongly recommended to keep all shell customization and configuration
|
# It is strongly recommended to keep all shell customization and configuration
|
||||||
|
@ -16,30 +16,30 @@ if [ -n "${ZSH_VERSION-}" ]; then
|
||||||
|
|
||||||
: ${ZDOTDIR:=~}
|
: ${ZDOTDIR:=~}
|
||||||
setopt no_global_rcs
|
setopt no_global_rcs
|
||||||
[[ -o no_interactive && -z "${Z4H_BOOTSTRAPPING-}" ]] && return
|
[[ -o no_interactive && -z "${FOXSHELL_BOOTSTRAPPING-}" ]] && return
|
||||||
setopt no_rcs
|
setopt no_rcs
|
||||||
unset Z4H_BOOTSTRAPPING
|
unset FOXSHELL_BOOTSTRAPPING
|
||||||
fi
|
fi
|
||||||
|
|
||||||
Z4H_URL="https://raw.githubusercontent.com/romkatv/zsh4humans/v5"
|
FOXSHELL_URL="https://git.foxdale.tech/Arctic/foxshell/raw/branch/main"
|
||||||
: "${Z4H:=${XDG_CACHE_HOME:-$HOME/.cache}/zsh4humans/v5}"
|
: "${FOXSHELL:=${XDG_CACHE_HOME:-$HOME/.cache}/foxshell}"
|
||||||
|
|
||||||
umask o-w
|
umask o-w
|
||||||
|
|
||||||
if [ ! -e "$Z4H"/z4h.zsh ]; then
|
if [ ! -e "$FOXSHELL"/foxshell.zsh ]; then
|
||||||
mkdir -p -- "$Z4H" || return
|
mkdir -p -- "$FOXSHELL" || return
|
||||||
>&2 printf '\033[33mz4h\033[0m: fetching \033[4mz4h.zsh\033[0m\n'
|
>&2 printf '\033[33mfoxshell\033[0m: fetching \033[4mfoxshell.zsh\033[0m\n'
|
||||||
if command -v curl >/dev/null 2>&1; then
|
if command -v curl >/dev/null 2>&1; then
|
||||||
curl -fsSL -- "$Z4H_URL"/z4h.zsh >"$Z4H"/z4h.zsh.$$ || return
|
curl -fsSL -- "$FOXSHELL_URL"/foxshell.zsh >"$FOXSHELL"/foxshell.zsh.$$ || return
|
||||||
elif command -v wget >/dev/null 2>&1; then
|
elif command -v wget >/dev/null 2>&1; then
|
||||||
wget -O- -- "$Z4H_URL"/z4h.zsh >"$Z4H"/z4h.zsh.$$ || return
|
wget -O- -- "$FOXSHELL_URL"/foxshell.zsh >"$FOXSHELL"/foxshell.zsh.$$ || return
|
||||||
else
|
else
|
||||||
>&2 printf '\033[33mz4h\033[0m: please install \033[32mcurl\033[0m or \033[32mwget\033[0m\n'
|
>&2 printf '\033[33mfoxshell\033[0m: please install \033[32mcurl\033[0m or \033[32mwget\033[0m\n'
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
mv -- "$Z4H"/z4h.zsh.$$ "$Z4H"/z4h.zsh || return
|
mv -- "$FOXSHELL"/foxshell.zsh.$$ "$FOXSHELL"/foxshell.zsh || return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
. "$Z4H"/z4h.zsh || return
|
. "$FOXSHELL"/foxshell.zsh || return
|
||||||
|
|
||||||
setopt rcs
|
setopt rcs
|
||||||
|
|
62
.zshrc
62
.zshrc
|
@ -2,55 +2,55 @@
|
||||||
# shell customization and configuration (including exported environment
|
# shell customization and configuration (including exported environment
|
||||||
# variables such as PATH) in this file or in files sourced from it.
|
# variables such as PATH) in this file or in files sourced from it.
|
||||||
#
|
#
|
||||||
# Documentation: https://github.com/romkatv/zsh4humans/blob/v5/README.md.
|
# Documentation: https://git.foxdale.tech/Arctic/foxshell/blob/main/README.md.
|
||||||
|
|
||||||
# Periodic auto-update on Zsh startup: 'ask' or 'no'.
|
# Periodic auto-update on Zsh startup: 'ask' or 'no'.
|
||||||
# You can manually run `z4h update` to update everything.
|
# You can manually run `foxshell update` to update everything.
|
||||||
zstyle ':z4h:' auto-update 'no'
|
zstyle ':foxshell:' auto-update 'no'
|
||||||
# Ask whether to auto-update this often; has no effect if auto-update is 'no'.
|
# Ask whether to auto-update this often; has no effect if auto-update is 'no'.
|
||||||
zstyle ':z4h:' auto-update-days '28'
|
zstyle ':foxshell:' auto-update-days '28'
|
||||||
|
|
||||||
# Keyboard type: 'mac' or 'pc'.
|
# Keyboard type: 'mac' or 'pc'.
|
||||||
zstyle ':z4h:bindkey' keyboard 'pc'
|
zstyle ':foxshell:bindkey' keyboard 'pc'
|
||||||
|
|
||||||
# Mark up shell's output with semantic information.
|
# Mark up shell's output with semantic information.
|
||||||
zstyle ':z4h:' term-shell-integration 'yes'
|
zstyle ':foxshell:' term-shell-integration 'yes'
|
||||||
|
|
||||||
# Right-arrow key accepts one character ('partial-accept') from
|
# Right-arrow key accepts one character ('partial-accept') from
|
||||||
# command autosuggestions or the whole thing ('accept')?
|
# command autosuggestions or the whole thing ('accept')?
|
||||||
zstyle ':z4h:autosuggestions' forward-char 'accept'
|
zstyle ':foxshell:autosuggestions' forward-char 'accept'
|
||||||
|
|
||||||
# Recursively traverse directories when TAB-completing files.
|
# Recursively traverse directories when TAB-completing files.
|
||||||
zstyle ':z4h:fzf-complete' recurse-dirs 'no'
|
zstyle ':foxshell:fzf-complete' recurse-dirs 'no'
|
||||||
|
|
||||||
# Enable direnv to automatically source .envrc files.
|
# Enable direnv to automatically source .envrc files.
|
||||||
zstyle ':z4h:direnv' enable 'no'
|
zstyle ':foxshell:direnv' enable 'no'
|
||||||
# Show "loading" and "unloading" notifications from direnv.
|
# Show "loading" and "unloading" notifications from direnv.
|
||||||
zstyle ':z4h:direnv:success' notify 'yes'
|
zstyle ':foxshell:direnv:success' notify 'yes'
|
||||||
|
|
||||||
# Enable ('yes') or disable ('no') automatic teleportation of z4h over
|
# Enable ('yes') or disable ('no') automatic teleportation of foxshell over
|
||||||
# SSH when connecting to these hosts.
|
# SSH when connecting to these hosts.
|
||||||
zstyle ':z4h:ssh:example-hostname1' enable 'yes'
|
zstyle ':foxshell:ssh:example-hostname1' enable 'yes'
|
||||||
zstyle ':z4h:ssh:*.example-hostname2' enable 'no'
|
zstyle ':foxshell:ssh:*.example-hostname2' enable 'no'
|
||||||
# The default value if none of the overrides above match the hostname.
|
# The default value if none of the overrides above match the hostname.
|
||||||
zstyle ':z4h:ssh:*' enable 'no'
|
zstyle ':foxshell:ssh:*' enable 'no'
|
||||||
|
|
||||||
# Send these files over to the remote host when connecting over SSH to the
|
# Send these files over to the remote host when connecting over SSH to the
|
||||||
# enabled hosts.
|
# enabled hosts.
|
||||||
zstyle ':z4h:ssh:*' send-extra-files '~/.nanorc' '~/.env.zsh'
|
zstyle ':foxshell:ssh:*' send-extra-files '~/.nanorc' '~/.env.zsh'
|
||||||
|
|
||||||
# Clone additional Git repositories from GitHub.
|
# Clone additional Git repositories from GitHub.
|
||||||
#
|
#
|
||||||
# This doesn't do anything apart from cloning the repository and keeping it
|
# This doesn't do anything apart from cloning the repository and keeping it
|
||||||
# up-to-date. Cloned files can be used after `z4h init`. This is just an
|
# up-to-date. Cloned files can be used after `foxshell init`. This is just an
|
||||||
# example. If you don't plan to use Oh My Zsh, delete this line.
|
# example. If you don't plan to use Oh My Zsh, delete this line.
|
||||||
z4h install ohmyzsh/ohmyzsh || return
|
foxshell install ohmyzsh/ohmyzsh || return
|
||||||
|
|
||||||
# Install or update core components (fzf, zsh-autosuggestions, etc.) and
|
# Install or update core components (fzf, zsh-autosuggestions, etc.) and
|
||||||
# initialize Zsh. After this point console I/O is unavailable until Zsh
|
# initialize Zsh. After this point console I/O is unavailable until Zsh
|
||||||
# is fully initialized. Everything that requires user interaction or can
|
# is fully initialized. Everything that requires user interaction or can
|
||||||
# perform network I/O must be done above. Everything else is best done below.
|
# perform network I/O must be done above. Everything else is best done below.
|
||||||
z4h init || return
|
foxshell init || return
|
||||||
|
|
||||||
# Extend PATH.
|
# Extend PATH.
|
||||||
path=(~/bin $path)
|
path=(~/bin $path)
|
||||||
|
@ -59,25 +59,25 @@ path=(~/bin $path)
|
||||||
export GPG_TTY=$TTY
|
export GPG_TTY=$TTY
|
||||||
|
|
||||||
# Source additional local files if they exist.
|
# Source additional local files if they exist.
|
||||||
z4h source ~/.env.zsh
|
foxshell source ~/.env.zsh
|
||||||
|
|
||||||
# Use additional Git repositories pulled in with `z4h install`.
|
# Use additional Git repositories pulled in with `foxshell install`.
|
||||||
#
|
#
|
||||||
# This is just an example that you should delete. It does nothing useful.
|
# This is just an example that you should delete. It does nothing useful.
|
||||||
z4h source ohmyzsh/ohmyzsh/lib/diagnostics.zsh # source an individual file
|
foxshell source ohmyzsh/ohmyzsh/lib/diagnostics.zsh # source an individual file
|
||||||
z4h load ohmyzsh/ohmyzsh/plugins/emoji-clock # load a plugin
|
foxshell load ohmyzsh/ohmyzsh/plugins/emoji-clock # load a plugin
|
||||||
|
|
||||||
# Define key bindings.
|
# Define key bindings.
|
||||||
z4h bindkey z4h-backward-kill-word Ctrl+Backspace Ctrl+H
|
foxshell bindkey foxshell-backward-kill-word Ctrl+Backspace Ctrl+H
|
||||||
z4h bindkey z4h-backward-kill-zword Ctrl+Alt+Backspace
|
foxshell bindkey foxshell-backward-kill-zword Ctrl+Alt+Backspace
|
||||||
|
|
||||||
z4h bindkey undo Ctrl+/ Shift+Tab # undo the last command line change
|
foxshell bindkey undo Ctrl+/ Shift+Tab # undo the last command line change
|
||||||
z4h bindkey redo Alt+/ # redo the last undone command line change
|
foxshell bindkey redo Alt+/ # redo the last undone command line change
|
||||||
|
|
||||||
z4h bindkey z4h-cd-back Alt+Left # cd into the previous directory
|
foxshell bindkey foxshell-cd-back Alt+Left # cd into the previous directory
|
||||||
z4h bindkey z4h-cd-forward Alt+Right # cd into the next directory
|
foxshell bindkey foxshell-cd-forward Alt+Right # cd into the next directory
|
||||||
z4h bindkey z4h-cd-up Alt+Up # cd into the parent directory
|
foxshell bindkey foxshell-cd-up Alt+Up # cd into the parent directory
|
||||||
z4h bindkey z4h-cd-down Alt+Down # cd into a child directory
|
foxshell bindkey foxshell-cd-down Alt+Down # cd into a child directory
|
||||||
|
|
||||||
# Autoload functions.
|
# Autoload functions.
|
||||||
autoload -Uz zmv
|
autoload -Uz zmv
|
||||||
|
@ -87,7 +87,7 @@ function md() { [[ $# == 1 ]] && mkdir -p -- "$1" && cd -- "$1" }
|
||||||
compdef _directories md
|
compdef _directories md
|
||||||
|
|
||||||
# Define named directories: ~w <=> Windows home directory on WSL.
|
# Define named directories: ~w <=> Windows home directory on WSL.
|
||||||
[[ -z $z4h_win_home ]] || hash -d w=$z4h_win_home
|
[[ -z $foxshell_win_home ]] || hash -d w=$foxshell_win_home
|
||||||
|
|
||||||
# Define aliases.
|
# Define aliases.
|
||||||
alias tree='tree -a -I .git'
|
alias tree='tree -a -I .git'
|
||||||
|
|
195
README.md
Normal file
195
README.md
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
# FoxShell
|
||||||
|
|
||||||
|
A powerful and user-friendly configuration for Zsh that works out of the box. FoxShell combines the best
|
||||||
|
Zsh plugins into a coherent whole that feels like a finished product rather than a DIY starter kit.
|
||||||
|
|
||||||
|
If you want a great shell that just works, this project is for you.
|
||||||
|
|
||||||
|
## Table of contents
|
||||||
|
|
||||||
|
* 1. [Features](#features)
|
||||||
|
* 2. [Installation](#installation)
|
||||||
|
* 3. [Usage](#usage)
|
||||||
|
* 3.1. [Accepting autosuggestions](#accepting-autosuggestions)
|
||||||
|
* 3.2. [Completing commands](#completing-commands)
|
||||||
|
* 3.3. [Searching command history](#searching-command-history)
|
||||||
|
* 3.4. [Interactive search with `fzf`](#interactive-search-with-fzf)
|
||||||
|
* 3.5. [SSH](#ssh)
|
||||||
|
* 4. [Customization](#customization)
|
||||||
|
* 4.1. [Customizing prompt](#customizing-prompt)
|
||||||
|
* 4.2. [Customizing appearance](#customizing-appearance)
|
||||||
|
* 4.3. [Additional Zsh startup files](#additional-zsh-startup-files)
|
||||||
|
* 5. [Updating](#updating)
|
||||||
|
* 6. [Uninstalling](#uninstalling)
|
||||||
|
* 7. [Advanced configuration tips](#advanced-configuration-tips)
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Powerful POSIX-based shell preconfigured to work great out of the box.
|
||||||
|
- Easy-to-use installation wizard. Does not require `git`, `zsh` or `sudo`.
|
||||||
|
- [Syntax highlighting](https://github.com/zsh-users/zsh-syntax-highlighting) for the command line.
|
||||||
|
- [Autosuggestions](https://github.com/zsh-users/zsh-autosuggestions) for commands based on command
|
||||||
|
history.
|
||||||
|
- [Command prompt](https://github.com/romkatv/powerlevel10k) configurable through a builtin
|
||||||
|
configuration wizard.
|
||||||
|
- Command completions and history searchable with [fzf](https://github.com/junegunn/fzf).
|
||||||
|
- Super fast. No lag when you open a new tab in the terminal or run a command.
|
||||||
|
- The complete shell environment can be automatically teleported to the remote host when connecting
|
||||||
|
over `ssh`. This does not require `git`, `zsh` or `sudo` on the remote host.
|
||||||
|
- Command history can be shared across different hosts. For example, history from `ssh foo`
|
||||||
|
can be made available within `ssh bar` and/or on the local machine.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Run this command in bash, zsh, or sh:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
if command -v curl >/dev/null 2>&1; then
|
||||||
|
sh -c "$(curl -fsSL https://git.foxdale.tech/Arctic/foxshell/raw/branch/main/install)"
|
||||||
|
else
|
||||||
|
sh -c "$(wget -O- https://git.foxdale.tech/Arctic/foxshell/raw/branch/main/install)"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
The installer backs up the existing Zsh startup files, creates new ones, installs everything
|
||||||
|
necessary for FoxShell, starts a new shell, and configures it as login shell. It asks for
|
||||||
|
confirmation on every step so that you are always in control. Installation requires `curl` or
|
||||||
|
`wget`. It does not require `git`, `zsh`, `sudo` or anything else.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
If you've used Zsh, Bash or Fish before, FoxShell should feel familiar. For the most part
|
||||||
|
everything works as you would expect.
|
||||||
|
|
||||||
|
### Accepting autosuggestions
|
||||||
|
|
||||||
|
All key bindings that move the cursor can accept *command autosuggestions*. For example, moving the
|
||||||
|
cursor one word to the right will accept that word from the autosuggestion. The whole autosuggestion
|
||||||
|
can be accepted without moving the cursor with <kbd>Alt+M</kbd>/<kbd>Option+M</kbd>.
|
||||||
|
|
||||||
|
Autosuggestions in FoxShell are provided by [zsh-autosuggestions](
|
||||||
|
https://github.com/zsh-users/zsh-autosuggestions). See its homepage for more information.
|
||||||
|
|
||||||
|
### Completing commands
|
||||||
|
|
||||||
|
When completing with <kbd>Tab</kbd>, suggestions come from *completion functions*. For most
|
||||||
|
commands completion functions are provided by Zsh proper. Additional completion functions are
|
||||||
|
contributed by [zsh-completions](https://github.com/zsh-users/zsh-completions). See its homepage
|
||||||
|
for the list of commands it supports.
|
||||||
|
|
||||||
|
Ambiguous completions automatically start [fzf](#interactive-search-with-fzf). Accept the desired
|
||||||
|
completion with <kbd>Enter</kbd>. You can also select more than one completion with
|
||||||
|
<kbd>Ctrl+Space</kbd> or all of them with <kbd>Ctrl+A</kbd>.
|
||||||
|
|
||||||
|
### Searching command history
|
||||||
|
|
||||||
|
<kbd>Up</kbd> and <kbd>Down</kbd> keys fetch commands from history that contain what you've already
|
||||||
|
typed on the command line. For example, if you press <kbd>Up</kbd> after typing `grep`, you'll see
|
||||||
|
the last executed command that contains `grep`.
|
||||||
|
|
||||||
|
<kbd>Ctrl+R</kbd> starts [fzf](#interactive-search-with-fzf) to search over history.
|
||||||
|
|
||||||
|
### Interactive search with `fzf`
|
||||||
|
|
||||||
|
Several UI elements in FoxShell use [fzf](https://github.com/junegunn/fzf) to quickly select
|
||||||
|
an item from a potentially large list of candidates. You can type multiple search terms delimited by
|
||||||
|
spaces. For example:
|
||||||
|
|
||||||
|
```text
|
||||||
|
^music .mp3$ sbtrkt !fire
|
||||||
|
```
|
||||||
|
|
||||||
|
| Token | Match type | Description |
|
||||||
|
| --------- | ----------------- | ------------------------------------ |
|
||||||
|
| `wild` | substring | Items with the substring `wild` |
|
||||||
|
| `^music` | prefix | Items that start with `music` |
|
||||||
|
| `.mp3$` | suffix | Items that end with `.mp3` |
|
||||||
|
| `!wild` | inverse substring | Items without the substring `wild` |
|
||||||
|
| `!^music` | inverse prefix | Items that do not start with `music` |
|
||||||
|
| `!.mp3$` | inverse suffix | Items that do not end with `.mp3` |
|
||||||
|
|
||||||
|
A single bar (`|`) acts as an OR operator. For example, the following query matches entries that
|
||||||
|
start with `core` and end with either `go`, `rb`, or `py`.
|
||||||
|
|
||||||
|
```text
|
||||||
|
^core go$ | rb$ | py$
|
||||||
|
```
|
||||||
|
|
||||||
|
See [fzf](https://github.com/junegunn/fzf) homepage for more information.
|
||||||
|
|
||||||
|
### SSH
|
||||||
|
|
||||||
|
When you connect to a remote host over SSH, your local FoxShell environment can be teleported
|
||||||
|
over to it. The first login to a remote host may take some time. After that it's as fast as normal
|
||||||
|
`ssh`.
|
||||||
|
|
||||||
|
Search for "ssh" in your `~/.zshrc` for information on how to enable and configure SSH
|
||||||
|
teleportation.
|
||||||
|
|
||||||
|
## Customization
|
||||||
|
|
||||||
|
You can (and should) edit `~/.zshrc` to customize your shell. It's a very good idea to read through
|
||||||
|
the whole file to see which customization options are in there and to flip some of them to your
|
||||||
|
liking.
|
||||||
|
|
||||||
|
When adding your customizations, put them next to the existing lines that do similar things. The
|
||||||
|
default `~/.zshrc` contains the following types of customizations that should serve as examples:
|
||||||
|
|
||||||
|
- Export environment variables.
|
||||||
|
- Extend `PATH`.
|
||||||
|
- Define aliases.
|
||||||
|
- Add flags to existing aliases.
|
||||||
|
- Define functions.
|
||||||
|
- Source additional local files.
|
||||||
|
- Load Oh My Zsh plugins.
|
||||||
|
- Clone and load external Zsh plugins.
|
||||||
|
- Set shell options.
|
||||||
|
- Autoload functions.
|
||||||
|
- Change key bindings.
|
||||||
|
|
||||||
|
### Customizing prompt
|
||||||
|
|
||||||
|
Prompt in FoxShell is provided by [Powerlevel10k](https://github.com/romkatv/powerlevel10k).
|
||||||
|
Run `p10k configure` to access its interactive configuration wizard. Further customization can be
|
||||||
|
done by editing `~/.p10k*.zsh` files. There can be more than one configuration file to account for
|
||||||
|
terminals with limited capabilities. Most users will ever only see `~/.p10k.zsh`. When in doubt,
|
||||||
|
consult `$POWERLEVEL9K_CONFIG_FILE`. This parameter is set by FoxShell and it always points
|
||||||
|
to the Powerlevel10k config file currently in use.
|
||||||
|
|
||||||
|
### Customizing appearance
|
||||||
|
|
||||||
|
FoxShell uses a dark theme by default. You can customize colors and appearance by editing the
|
||||||
|
configuration files or using the built-in configuration wizard.
|
||||||
|
|
||||||
|
### Additional Zsh startup files
|
||||||
|
|
||||||
|
FoxShell sources additional files if they exist:
|
||||||
|
|
||||||
|
- `~/.env.zsh` - Environment variables and other shell configuration
|
||||||
|
- `~/.zshrc.local` - Additional personal configuration
|
||||||
|
|
||||||
|
## Updating
|
||||||
|
|
||||||
|
Run `foxshell update` to update FoxShell and all its components.
|
||||||
|
|
||||||
|
## Uninstalling
|
||||||
|
|
||||||
|
To uninstall FoxShell:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
rm -rf -- "${XDG_CACHE_HOME:-$HOME/.cache}/foxshell"
|
||||||
|
```
|
||||||
|
|
||||||
|
Then restore your original zsh configuration files if you have backups.
|
||||||
|
|
||||||
|
## Advanced configuration tips
|
||||||
|
|
||||||
|
FoxShell is designed to be highly configurable. Here are some advanced tips:
|
||||||
|
|
||||||
|
- Use `zstyle` commands to configure various aspects of the shell
|
||||||
|
- Add custom key bindings with `foxshell bindkey`
|
||||||
|
- Install additional plugins with `foxshell install`
|
||||||
|
- Use `foxshell source` to source additional files
|
||||||
|
- Use `foxshell load` to load plugins
|
||||||
|
|
||||||
|
For more information, see the configuration files in `~/.zshrc`.
|
337
foxshell.zsh
Normal file
337
foxshell.zsh
Normal file
|
@ -0,0 +1,337 @@
|
||||||
|
'[' '-n' "${TERM-}" ']' || 'export' TERM='xterm-256color'
|
||||||
|
|
||||||
|
'[' '-n' "${WT_SESSION-}" ']' && 'export' COLORTERM="${COLORTERM:-truecolor}"
|
||||||
|
|
||||||
|
if '[' '-n' "${ZSH_VERSION-}" ']'; then
|
||||||
|
if '[' '-n' "${_foxshell_source_called+x}" ']'; then
|
||||||
|
if '[' "${ZDOTDIR:-$HOME}" '=' "$HOME" ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: please use \033[4;32mexec\033[0m \033[32mzsh\033[0m instead of \033[32msource\033[0m \033[4m~/.zshenv\033[0m\n'
|
||||||
|
else
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: please use \033[4;32mexec\033[0m \033[32mzsh\033[0m instead of \033[32msource\033[0m \033[4;33m"$ZDOTDIR"\033[0;4m/.zshenv\033[0m\n'
|
||||||
|
fi
|
||||||
|
'return' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
'typeset' '-gri' _foxshell_source_called='1'
|
||||||
|
|
||||||
|
'emulate' 'zsh'
|
||||||
|
'setopt' \
|
||||||
|
'always_to_end' 'auto_cd' 'auto_param_slash' \
|
||||||
|
'auto_pushd' 'c_bases' 'auto_menu' \
|
||||||
|
'extended_glob' 'extended_history' 'hist_expire_dups_first' \
|
||||||
|
'hist_find_no_dups' 'hist_ignore_dups' 'hist_ignore_space' \
|
||||||
|
'hist_verify' 'interactive_comments' 'multios' \
|
||||||
|
'no_aliases' 'no_bg_nice' 'no_bg_nice' \
|
||||||
|
'no_flow_control' 'no_prompt_bang' 'no_prompt_subst' \
|
||||||
|
'prompt_cr' 'prompt_percent' 'prompt_sp' \
|
||||||
|
'share_history' 'typeset_silent' 'hist_save_no_dups' \
|
||||||
|
'no_auto_remove_slash' 'no_list_types' 'no_beep'
|
||||||
|
|
||||||
|
if '[' '!' '-e' "${${TMPPREFIX:-/tmp/zsh}:h}" ']'; then
|
||||||
|
if '[' '-n' "$TMPDIR" '-a' '-d' "$TMPDIR" '-a' '-w' "$TMPDIR" ']'; then
|
||||||
|
'export' TMPPREFIX="${TMPDIR%/}/zsh"
|
||||||
|
elif '[' '-d' "/tmp" '-a' '-w' "/tmp" ']'; then
|
||||||
|
'export' TMPPREFIX="/tmp/zsh"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' "$TERMINFO" '!=' ~/'.terminfo' ']' && '[' '-e' ~/".terminfo/$TERM[1]/$TERM" ']'; then
|
||||||
|
'export' TERMINFO=~/'.terminfo'
|
||||||
|
fi
|
||||||
|
|
||||||
|
'set' '-A' '_foxshell_script_argv' "$@"
|
||||||
|
|
||||||
|
if '[' '-n' "${ZSH_SCRIPT+X}${ZSH_EXECUTION_STRING+X}" ']'; then
|
||||||
|
'typeset' '-gri' _foxshell_zle='0'
|
||||||
|
else
|
||||||
|
'typeset' '-gri' _foxshell_zle='1'
|
||||||
|
|
||||||
|
PS1="%B%F{2}%n@%m%f %F{4}%~%f
|
||||||
|
%F{%(?.2.1)}%#%f%b "
|
||||||
|
RPS1="%B%F{3}foxshell recovery mode%f%b"
|
||||||
|
|
||||||
|
WORDCHARS=''
|
||||||
|
ZLE_REMOVE_SUFFIX_CHARS=''
|
||||||
|
HISTSIZE='1000000000'
|
||||||
|
SAVEHIST='1000000000'
|
||||||
|
|
||||||
|
if '[' '-n' "$HISTFILE" ']'; then
|
||||||
|
'typeset' '-gri' _foxshell_custom_histfile='1'
|
||||||
|
else
|
||||||
|
'typeset' '-gri' _foxshell_custom_histfile='0'
|
||||||
|
HISTFILE="${ZDOTDIR:-$HOME}/.zsh_history"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' '-n' "${_foxshell_ssh_feedback-}" ']'; then
|
||||||
|
{ 'print' '-r' '--' "HISTFILE=${(q)HISTFILE}" >"$_foxshell_ssh_feedback"; } 2>'/dev/null'
|
||||||
|
'unset' '_foxshell_ssh_feedback'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' '-n' "${_FOXSHELL_LINES-}" '-a' '-n' "${_FOXSHELL_COLUMNS-}" ']'; then
|
||||||
|
'typeset' '-gi' LINES='_FOXSHELL_LINES'
|
||||||
|
'typeset' '-gi' COLUMNS='_FOXSHELL_COLUMNS'
|
||||||
|
'unset' '_FOXSHELL_LINES' '_FOXSHELL_COLUMNS'
|
||||||
|
fi
|
||||||
|
|
||||||
|
'bindkey' '-d'
|
||||||
|
'bindkey' '-e'
|
||||||
|
|
||||||
|
'bindkey' '-s' '^[OM' '^M'
|
||||||
|
'bindkey' '-s' '^[Ok' '+'
|
||||||
|
'bindkey' '-s' '^[Om' '-'
|
||||||
|
'bindkey' '-s' '^[Oj' '*'
|
||||||
|
'bindkey' '-s' '^[Oo' '/'
|
||||||
|
'bindkey' '-s' '^[OX' '='
|
||||||
|
'bindkey' '-s' '^[OH' '^[[H'
|
||||||
|
'bindkey' '-s' '^[OF' '^[[F'
|
||||||
|
'bindkey' '-s' '^[OA' '^[[A'
|
||||||
|
'bindkey' '-s' '^[OB' '^[[B'
|
||||||
|
'bindkey' '-s' '^[OD' '^[[D'
|
||||||
|
'bindkey' '-s' '^[OC' '^[[C'
|
||||||
|
'bindkey' '-s' '^[[1~' '^[[H'
|
||||||
|
'bindkey' '-s' '^[[4~' '^[[F'
|
||||||
|
'bindkey' '-s' '^[Od' '^[[1;5D'
|
||||||
|
'bindkey' '-s' '^[Oc' '^[[1;5C'
|
||||||
|
'bindkey' '-s' '^[^[[D' '^[[1;3D'
|
||||||
|
'bindkey' '-s' '^[^[[C' '^[[1;3C'
|
||||||
|
'bindkey' '-s' '^[[7~' '^[[H'
|
||||||
|
'bindkey' '-s' '^[[8~' '^[[F'
|
||||||
|
'bindkey' '-s' '^[[3\^' '^[[3;5~'
|
||||||
|
'bindkey' '-s' '^[^[[3~' '^[[3;3~'
|
||||||
|
'bindkey' '-s' '^[[1;9D' '^[[1;3D'
|
||||||
|
'bindkey' '-s' '^[[1;9C' '^[[1;3C'
|
||||||
|
|
||||||
|
'bindkey' '^[[H' 'beginning-of-line'
|
||||||
|
'bindkey' '^[[F' 'end-of-line'
|
||||||
|
'bindkey' '^[[3~' 'delete-char'
|
||||||
|
'bindkey' '^[[3;5~' 'kill-word'
|
||||||
|
'bindkey' '^[[3;3~' 'kill-word'
|
||||||
|
'bindkey' '^[k' 'backward-kill-line'
|
||||||
|
'bindkey' '^[K' 'backward-kill-line'
|
||||||
|
'bindkey' '^[j' 'kill-buffer'
|
||||||
|
'bindkey' '^[J' 'kill-buffer'
|
||||||
|
'bindkey' '^[/' 'redo'
|
||||||
|
'bindkey' '^[[1;3D' 'backward-word'
|
||||||
|
'bindkey' '^[[1;5D' 'backward-word'
|
||||||
|
'bindkey' '^[[1;3C' 'forward-word'
|
||||||
|
'bindkey' '^[[1;5C' 'forward-word'
|
||||||
|
|
||||||
|
if '[' '-n' "${_FOXSHELL_ORIG_CWD-}" ']'; then
|
||||||
|
'builtin' 'cd' '-q' '--' "${(g:oce:)_FOXSHELL_ORIG_CWD}" 2>'/dev/null' || 'builtin' 'cd' '-q'
|
||||||
|
'builtin' 'unset' '_FOXSHELL_ORIG_CWD'
|
||||||
|
'builtin' 'eval' 'dirstack=()'
|
||||||
|
else
|
||||||
|
"builtin" "eval" '
|
||||||
|
if [[ "${(%):-%1/}" == "foxshell-tmux-cwd-"<->-<->-* ]]; then
|
||||||
|
[[ -r "./tmux"(#qNU) ]] &&
|
||||||
|
_foxshell_x="$("builtin" "source" "--" "./tmux" "list-clients" "-F" "#{client_tty} #{pane_id}" 2>"/dev/null")" &&
|
||||||
|
_foxshell_x="${${(@M)${(f)_foxshell_x}:#${${${(%):-%1/}#foxshell-tmux-cwd-<->-<->-}//.//} %<->}##* }" &&
|
||||||
|
[[ "$_foxshell_x" == "%"<-> ]] &&
|
||||||
|
_foxshell_x="$("builtin" "source" "--" "./tmux" "display-message" "-t" "$_foxshell_x" "-p" "#{pane_current_path}" 2>"/dev/null")" &&
|
||||||
|
[[ -n "$_foxshell_x" ]] &&
|
||||||
|
"builtin" "cd" "-q" "--" "$_foxshell_x" 2>"/dev/null" || "builtin" "cd" "-q"
|
||||||
|
"builtin" "unset" "_foxshell_x"
|
||||||
|
dirstack=()
|
||||||
|
fi'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' '-n' "${FOXSHELL-}" ']' &&
|
||||||
|
'[' "${FOXSHELL_URL-}" '=' 'https://git.foxdale.tech/Arctic/foxshell/raw/branch/main' ']' &&
|
||||||
|
'[' '-z' "${FOXSHELL##/*}" '-a' '-r' "$FOXSHELL"/foxshell/main.zsh ']'; then
|
||||||
|
if '.' "$FOXSHELL"/foxshell/main.zsh; then
|
||||||
|
'setopt' 'aliases'
|
||||||
|
'return'
|
||||||
|
fi
|
||||||
|
'unset' '_foxshell_bootstrap'
|
||||||
|
else
|
||||||
|
_foxshell_bootstrap='1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' '-n' "${_foxshell_bootstrap-}" ']'; then
|
||||||
|
'unset' '_foxshell_bootstrap'
|
||||||
|
(
|
||||||
|
if '[' '-z' "${FOXSHELL-}" ]; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: missing required parameter: \033[31mFOXSHELL\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
if '[' "${ZDOTDIR:-$HOME}" '=' "$HOME" ']'; then
|
||||||
|
>&2 'printf' 'It must be set in \033[4m~/.zshenv\033[0m:\n'
|
||||||
|
else
|
||||||
|
>&2 'printf' 'It must be set in \033[4;33m"$ZDOTDIR"\033[0;4m/.zshenv\033[0m:\n'
|
||||||
|
fi
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' \033[32m:\033[0m \033[33m"${FOXSHELL:=${XDG_CACHE_HOME:-$HOME/.cache}/foxshell}"\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'Note: The leading colon (\033[32m:\033[0m) is necessary.\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' '-n' "${FOXSHELL##/*}" ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: invalid \033[1mFOXSHELL\033[0m parameter: \033[31m%s\033[0m\n' "$FOXSHELL"
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
if '[' "${ZDOTDIR:-$HOME}" '=' "$HOME" ']'; then
|
||||||
|
>&2 'printf' 'It comes from \033[4m~/.zshenv\033[0m. Correct value example:\n'
|
||||||
|
else
|
||||||
|
>&2 'printf' 'It comes from \033[4;33m"$ZDOTDIR"\033[0;4m/.zshenv\033[0m. Correct value example:\n'
|
||||||
|
fi
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' \033[32m:\033[0m \033[33m"${FOXSHELL:=${XDG_CACHE_HOME:-$HOME/.cache}/foxshell}"\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'Note: The leading colon (\033[32m:\033[0m) is necessary.\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' '!' '-r' "$FOXSHELL"/foxshell.zsh ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: confusing \033[4mfoxshell.zsh\033[0m location\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
if '[' "${ZDOTDIR:-$HOME}" '=' "$HOME" ']'; then
|
||||||
|
>&2 'printf' 'Please fix \033[4m~/.zshenv\033[0m. Correct initialization example:\n'
|
||||||
|
else
|
||||||
|
>&2 'printf' 'Please fix \033[4;33m"$ZDOTDIR"\033[0;4m/.zshenv\033[0m. Correct initialization example:\n'
|
||||||
|
fi
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' \033[32m:\033[0m \033[33m"${FOXSHELL:=${XDG_CACHE_HOME:-$HOME/.cache}/foxshell}"\033[0m\n'
|
||||||
|
>&2 'printf' ' \033[32m.\033[0m \033[4;33m"$FOXSHELL"\033[0;4m/foxshell.zsh\033[0m || \033[32mreturn\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'Note: The leading colon (\033[32m:\033[0m) and dot (\033[32m.\033[0m) are necessary.\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' '-z' "${FOXSHELL_URL-}" ]; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: missing required parameter: \033[31mFOXSHELL_URL\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
if '[' "${ZDOTDIR:-$HOME}" '=' "$HOME" ']'; then
|
||||||
|
>&2 'printf' 'It must be set in \033[4m~/.zshenv\033[0m:\n'
|
||||||
|
else
|
||||||
|
>&2 'printf' 'It must be set in \033[4;33m"$ZDOTDIR"\033[0;4m/.zshenv\033[0m:\n'
|
||||||
|
fi
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' FOXSHELL_URL=\033[33m"https://git.foxdale.tech/Arctic/foxshell/raw/branch/main"\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
v="${FOXSHELL_URL#https://git.foxdale.tech/Arctic/foxshell/raw/branch/}"
|
||||||
|
if '[' '-z' "$v" '-o' "$v" '=' "$FOXSHELL_URL" ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: invalid \033[1mFOXSHELL_URL\033[0m: \033[31m%s\033[0m\n' "$FOXSHELL_URL"
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
if '[' "${ZDOTDIR:-$HOME}" '=' "$HOME" ']'; then
|
||||||
|
>&2 'printf' 'It comes from \033[4m~/.zshenv\033[0m. Correct value example:\n'
|
||||||
|
else
|
||||||
|
>&2 'printf' 'It comes from \033[4;33m"$ZDOTDIR"\033[0;4m/.zshenv\033[0m. Correct value example:\n'
|
||||||
|
fi
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' FOXSHELL_URL=\033[33m"https://git.foxdale.tech/Arctic/foxshell/raw/branch/main"\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' "$v" '!=' 'main' ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: unsupported \033[1mFOXSHELL_URL\033[0m: \033[31m%s\033[0m\n' "$FOXSHELL_URL"
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
if '[' "${ZDOTDIR:-$HOME}" '=' "$HOME" ']'; then
|
||||||
|
>&2 'printf' 'It comes from \033[4m~/.zshenv\033[0m. Correct value example:\n'
|
||||||
|
else
|
||||||
|
>&2 'printf' 'It comes from \033[4;33m"$ZDOTDIR"\033[0;4m/.zshenv\033[0m. Correct value example:\n'
|
||||||
|
fi
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' FOXSHELL_URL=\033[33m"%s"\033[0m\n' "https://git.foxdale.tech/Arctic/foxshell/raw/branch/main"
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' "$FOXSHELL_UPDATING" '=' '1' ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: updating \033[1m%s\033[0m\n' "foxshell"
|
||||||
|
else
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: installing \033[1m%s\033[0m\n' "foxshell"
|
||||||
|
fi
|
||||||
|
|
||||||
|
'[' "${EUID:-x}" '!=' '0' '-a' -n "${HOME-}" ']' &&
|
||||||
|
'[' "$FOXSHELL" = "$HOME"/.cache/foxshell ']' &&
|
||||||
|
'[' '!' '-d' "$HOME"/.cache ']' &&
|
||||||
|
'command' 'mkdir' '-p' '--' "$HOME"/.cache 2>'/dev/null' &&
|
||||||
|
'command' 'chmod' 'go-rwx' '--' "$HOME"/.cache 2>'/dev/null' || 'true'
|
||||||
|
|
||||||
|
'command' 'rm' '-rf' '--' "$HOME"/.cache/foxshell 2>'/dev/null' &&
|
||||||
|
'command' 'rmdir' '--' "$HOME"/.cache 2>'/dev/null'
|
||||||
|
|
||||||
|
'command' 'mkdir' '-p' '--' "$FOXSHELL" || 'exit'
|
||||||
|
|
||||||
|
tmpdir="$('command' 'mktemp' '-d' "$FOXSHELL"/tmp.XXXXXXXXXX)" || 'exit'
|
||||||
|
'command' 'chmod' 'go-rwx' '--' "$tmpdir" || 'exit'
|
||||||
|
'set' '-E'
|
||||||
|
'trap' ''command' 'rm' '-rf' '--' "$tmpdir"; 'exit' '1' 'ERR'
|
||||||
|
'set' '+E'
|
||||||
|
|
||||||
|
dir="$FOXSHELL"/foxshell
|
||||||
|
FOXSHELL_PACKAGE_NAME='foxshell'
|
||||||
|
FOXSHELL_PACKAGE_DIR="$tmpdir"/foxshell-main
|
||||||
|
FOXSHELL_PACKAGE_URL="$FOXSHELL_URL"
|
||||||
|
|
||||||
|
# Download from git repository
|
||||||
|
url="https://git.foxdale.tech/Arctic/foxshell/archive/main.tar.gz"
|
||||||
|
|
||||||
|
if 'command' -v 'curl' >'/dev/null' 2>&1; then
|
||||||
|
'command' 'curl' '-fsSL' '--' "$url" | {
|
||||||
|
'command' 'tar' '-C' "$tmpdir" '-xzf' '-'
|
||||||
|
} || 'exit'
|
||||||
|
elif 'command' -v 'wget' >'/dev/null' 2>&1; then
|
||||||
|
'command' 'wget' '-O' '-' '--' "$url" | {
|
||||||
|
'command' 'tar' '-C' "$tmpdir" '-xzf' '-'
|
||||||
|
} || 'exit'
|
||||||
|
else
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: please install \033[32mcurl\033[0m or \033[32mwget\033[0m\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
'command' 'mv' '--' "$tmpdir"/foxshell-main "$FOXSHELL_PACKAGE_DIR" || 'exit'
|
||||||
|
|
||||||
|
'export' 'FOXSHELL'
|
||||||
|
'export' 'FOXSHELL_PACKAGE_NAME'
|
||||||
|
'export' 'FOXSHELL_PACKAGE_DIR'
|
||||||
|
'export' 'FOXSHELL_PACKAGE_URL'
|
||||||
|
|
||||||
|
if '[' "$FOXSHELL_UPDATING" '=' '1' ']'; then
|
||||||
|
"sh" "$tmpdir"/foxshell-main/sc/setup '-n' "$FOXSHELL" '-o' "$FOXSHELL_UPDATING" || 'exit'
|
||||||
|
else
|
||||||
|
"sh" "$tmpdir"/foxshell-main/sc/setup '-n' "$FOXSHELL" || 'exit'
|
||||||
|
fi
|
||||||
|
|
||||||
|
'command' 'mv' '-f' '--' "$tmpdir"/foxshell-main "$dir" || 'exit'
|
||||||
|
|
||||||
|
'trap' '-' 'ERR'
|
||||||
|
'command' 'rm' '-rf' '--' "$tmpdir"
|
||||||
|
|
||||||
|
) && '.' "$FOXSHELL"/foxshell/main.zsh && 'setopt' 'aliases' && 'return'
|
||||||
|
|
||||||
|
case "${FOXSHELL_BOOTSTRAPPING-}" in
|
||||||
|
'')
|
||||||
|
if '[' '-n' "${_foxshell_exe-}" ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: failed to initialize \033[1mfoxshell\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'This is most likely due to a bug in \033[4mfoxshell\033[0m. Please report it at:\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' \033[4mhttps://git.foxdale.tech/Arctic/foxshell/issues\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'If foxshell is working fine in another terminal, you can try restarting\n'
|
||||||
|
>&2 'printf' 'zsh in this terminal. If it does not help, reinstall foxshell.\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' \033[32msh\033[0m -c \033[33m"\033[0m$(\033[32mcurl\033[0m -fsSL \033[4mhttps://git.foxdale.tech/Arctic/foxshell/raw/branch/main/install\033[0m)\033[33m"\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
'1')
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: failed to bootstrap \033[1mfoxshell\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'This is most likely due to a bug in \033[4mfoxshell\033[0m. Please report it at:\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' \033[4mhttps://git.foxdale.tech/Arctic/foxshell/issues\033[0m\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
'exit' '1'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
'setopt' 'aliases'
|
325
install
Executable file
325
install
Executable file
|
@ -0,0 +1,325 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if '[' '-n' "${ZSH_VERSION-}" ']'; then
|
||||||
|
'emulate' 'sh' '-o' 'err_exit' '-o' 'no_unset'
|
||||||
|
else
|
||||||
|
'set' '-ue'
|
||||||
|
fi
|
||||||
|
|
||||||
|
platform="$('command' 'uname' '-sm')"
|
||||||
|
platform="$('printf' '%s' "$platform" | 'command' 'tr' '[A-Z]' '[a-z]')"
|
||||||
|
|
||||||
|
case "$platform" in
|
||||||
|
'darwin arm64');;
|
||||||
|
'darwin x86_64');;
|
||||||
|
'linux aarch64');;
|
||||||
|
'linux armv6l');;
|
||||||
|
'linux armv7l');;
|
||||||
|
'linux armv8l');;
|
||||||
|
'linux x86_64');;
|
||||||
|
'linux i686');;
|
||||||
|
*)
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: sorry, unsupported platform: \033[31m%s\033[0m\n' "$platform"
|
||||||
|
'exit' '1'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if command -v 'curl' >'/dev/null' 2>&1; then
|
||||||
|
fetch='command curl -fsSLo'
|
||||||
|
elif command -v 'wget' >'/dev/null' 2>&1; then
|
||||||
|
fetch='command wget -O'
|
||||||
|
else
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: please install \033[32mcurl\033[0m or \033[32mwget\033[0m\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' '!' '-d' "${HOME-}" ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: \033[1m$HOME\033[0m is not a directory\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
euid="$('command' 'id' '-u')"
|
||||||
|
if '[' "$euid" '=' '0' ']'; then
|
||||||
|
home_ls="$('command' 'ls' '-ld' '--' "$HOME")"
|
||||||
|
home_owner="$('printf' '%s\n' "$home_ls" | 'command' 'awk' 'NR==1 {print $3}')"
|
||||||
|
if '[' "$home_owner" '!=' 'root' ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: please retry without \033[4;32msudo\033[0m\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' '!' '-t' '0' ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: standard input is not a \033[1mTTY\033[0m\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' '!' '-t' '1' ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: standard output is not a \033[1mTTY\033[0m\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' '!' '-t' '2' ']'; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: standard error is not a \033[1mTTY\033[0m\n'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
saved_tty_settings="$('command' 'stty' '-g')"
|
||||||
|
|
||||||
|
zshenv=''
|
||||||
|
zshrc=''
|
||||||
|
foxshell=''
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
'trap' '-' 'INT' 'TERM' 'EXIT'
|
||||||
|
'command' 'rm' '-f' '--' "$zshenv" "$zshrc" "${zshrc:+$zshrc.bak}" "$foxshell"
|
||||||
|
'command' 'stty' "$saved_tty_settings"
|
||||||
|
}
|
||||||
|
|
||||||
|
'trap' 'cleanup' 'INT' 'TERM' 'EXIT'
|
||||||
|
|
||||||
|
lf='
|
||||||
|
'
|
||||||
|
|
||||||
|
read_choice() {
|
||||||
|
choice=''
|
||||||
|
'command' 'stty' '-icanon' 'min' '1' 'time' '0'
|
||||||
|
while :; do
|
||||||
|
c="$('command' 'dd' 'bs=1' 'count=1' 2>'/dev/null' && 'echo' 'x')"
|
||||||
|
choice="$choice${c%x}"
|
||||||
|
n="$('printf' '%s' "$choice" | 'command' 'wc' '-m')"
|
||||||
|
'[' "$n" '-eq' '0' ']' || 'break'
|
||||||
|
done
|
||||||
|
'command' 'stty' "$saved_tty_settings"
|
||||||
|
'[' "$choice" '=' "$lf" ] || 'echo'
|
||||||
|
}
|
||||||
|
|
||||||
|
>&2 'printf' 'Welcome to FoxShell!\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'What kind of \033[1mkeyboard\033[0m are you using?\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' \033[1m(1)\033[0m Mac. It has \033[32mOption\033[0m key(s) and does not have \033[33mAlt\033[0m.\n'
|
||||||
|
>&2 'printf' ' \033[1m(2)\033[0m PC. It has \033[32mAlt\033[0m key(s) and does not have \033[33mOption\033[0m.\n'
|
||||||
|
>&2 'printf' ' \033[1m(q)\033[0m Quit and do nothing.\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
while 'true'; do
|
||||||
|
>&2 'printf' '\033[1mChoice [12q]:\033[0m '
|
||||||
|
'read_choice'
|
||||||
|
case "$choice" in
|
||||||
|
'1')
|
||||||
|
bs_key='Delete'
|
||||||
|
zshrc_suffix='.mac'
|
||||||
|
'break'
|
||||||
|
;;
|
||||||
|
'2')
|
||||||
|
bs_key='Backspace'
|
||||||
|
zshrc_suffix=''
|
||||||
|
'break'
|
||||||
|
;;
|
||||||
|
'q'|'Q')
|
||||||
|
'exit' '1'
|
||||||
|
;;
|
||||||
|
"$lf")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: invalid choice: \033[31m%s\033[0m\n' "$choice"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'What \033[1mkeybindings\033[0m do you prefer?\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' \033[1m(1)\033[0m Standard. I delete characters with \033[33m%s\033[0m key.\n' "$bs_key"
|
||||||
|
>&2 'printf' ' \033[1m(2)\033[0m Like in \033[32mvi\033[0m. I delete characters with \033[33mX\033[0m key in \033[33mcommand mode\033[0m.\n'
|
||||||
|
>&2 'printf' ' \033[1m(q)\033[0m Quit and do nothing.\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
while 'true'; do
|
||||||
|
>&2 'printf' '\033[1mChoice [12q]:\033[0m '
|
||||||
|
'read_choice'
|
||||||
|
case "$choice" in
|
||||||
|
'1')
|
||||||
|
'break'
|
||||||
|
;;
|
||||||
|
'2')
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'Sorry, \033[32mvi\033[0m keybindings are \033[31mnot supported\033[0m yet.\n'
|
||||||
|
'exit' '1'
|
||||||
|
'break'
|
||||||
|
;;
|
||||||
|
'q'|'Q')
|
||||||
|
'exit' '1'
|
||||||
|
;;
|
||||||
|
"$lf")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: invalid choice: \033[31m%s\033[0m\n' "$choice"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'Do you want \033[32mzsh\033[0m to always run in \033[32mtmux\033[0m?\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' \033[1m(y)\033[0m Yes.\n'
|
||||||
|
>&2 'printf' ' \033[1m(n)\033[0m No.\n'
|
||||||
|
>&2 'printf' ' \033[1m(q)\033[0m Quit and do nothing.\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
while 'true'; do
|
||||||
|
>&2 'printf' '\033[1mChoice [ynq]:\033[0m '
|
||||||
|
'read_choice'
|
||||||
|
case "$choice" in
|
||||||
|
'y'|'Y')
|
||||||
|
tmux='1'
|
||||||
|
'break'
|
||||||
|
;;
|
||||||
|
'n'|'N')
|
||||||
|
tmux='0'
|
||||||
|
'break'
|
||||||
|
;;
|
||||||
|
'q'|'Q')
|
||||||
|
'exit' '1'
|
||||||
|
;;
|
||||||
|
"$lf")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: invalid choice: \033[31m%s\033[0m\n' "$choice"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'Do you use \033[32mdirenv\033[0m?\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' \033[1m(y)\033[0m Yes.\n'
|
||||||
|
>&2 'printf' ' \033[1m(n)\033[0m No.\n'
|
||||||
|
>&2 'printf' ' \033[1m(q)\033[0m Quit and do nothing.\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
while 'true'; do
|
||||||
|
>&2 'printf' '\033[1mChoice [ynq]:\033[0m '
|
||||||
|
'read_choice'
|
||||||
|
case "$choice" in
|
||||||
|
'y'|'Y')
|
||||||
|
direnv='1'
|
||||||
|
'break'
|
||||||
|
;;
|
||||||
|
'n'|'N')
|
||||||
|
direnv='0'
|
||||||
|
'break'
|
||||||
|
;;
|
||||||
|
'q'|'Q')
|
||||||
|
'exit' '1'
|
||||||
|
;;
|
||||||
|
"$lf")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: invalid choice: \033[31m%s\033[0m\n' "$choice"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' 'Do you want to enable \033[32mSSH\033[0m teleportation?\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
>&2 'printf' ' \033[1m(y)\033[0m Yes.\n'
|
||||||
|
>&2 'printf' ' \033[1m(n)\033[0m No.\n'
|
||||||
|
>&2 'printf' ' \033[1m(q)\033[0m Quit and do nothing.\n'
|
||||||
|
>&2 'printf' '\n'
|
||||||
|
while 'true'; do
|
||||||
|
>&2 'printf' '\033[1mChoice [ynq]:\033[0m '
|
||||||
|
'read_choice'
|
||||||
|
case "$choice" in
|
||||||
|
'y'|'Y')
|
||||||
|
ssh='1'
|
||||||
|
'break'
|
||||||
|
;;
|
||||||
|
'n'|'N')
|
||||||
|
ssh='0'
|
||||||
|
'break'
|
||||||
|
;;
|
||||||
|
'q'|'Q')
|
||||||
|
'exit' '1'
|
||||||
|
;;
|
||||||
|
"$lf")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: invalid choice: \033[31m%s\033[0m\n' "$choice"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if 'command' 'mktemp' '-u' >'/dev/null' 2>&1; then
|
||||||
|
foxshell="$('command' 'mktemp' "$HOME"/.foxshell.XXXXXXXXXX)"
|
||||||
|
else
|
||||||
|
foxshell="$HOME"/.foxshell.tmp."$$"
|
||||||
|
fi
|
||||||
|
|
||||||
|
url='https://git.foxdale.tech/Arctic/foxshell/raw/branch/main'
|
||||||
|
|
||||||
|
>&2 printf '\033[33mfoxshell\033[0m: fetching \033[4mfoxshell.zsh\033[0m from \033[1mgit.foxdale.tech/Arctic/foxshell\033[0m\n'
|
||||||
|
if ! err="$($fetch "$foxshell" '--' "$url"/foxshell.zsh 2>&1)"; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: %s\n' "$err"
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: failed to download \033[31m%s\033[0m\n' "$url"/foxshell.zsh
|
||||||
|
'command' 'rm' '-rf' '--' "$foxshell" 2>'/dev/null'
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: generating \033[4m~/.zshenv\033[0m\n'
|
||||||
|
if ! err="$($fetch "$HOME"/.zshenv.tmp -- "$url"/.zshenv 2>&1)"; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: %s\n' "$err"
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: failed to download \033[31m%s\033[0m\n' "$url"/.zshenv
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: generating \033[4m~/.zshrc\033[0m\n'
|
||||||
|
if ! err="$($fetch "$HOME"/.zshrc.tmp -- "$url"/.zshrc"$zshrc_suffix" 2>&1)"; then
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: %s\n' "$err"
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: failed to download \033[31m%s\033[0m\n' "$url"/.zshrc"$zshrc_suffix"
|
||||||
|
'exit' '1'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' "$tmux" '=' '1' ']'; then
|
||||||
|
'command' 'awk' "/Mark up shell's output/ {print \"# Start tmux if not already in tmux.\"; print \"zstyle ':foxshell:' start-tmux command tmux -u new -A -D -t foxshell\"; print \"\"; print \"# Whether to move prompt to the bottom when zsh starts and on Ctrl+L.\"; print \"zstyle ':foxshell:' prompt-at-bottom 'no'\"; print \"\"} 1" "$HOME"/.zshrc.tmp >"$HOME"/.zshrc.bak
|
||||||
|
else
|
||||||
|
'command' 'awk' "/Mark up shell's output/ {print \"# Don't start tmux.\"; print \"zstyle ':foxshell:' start-tmux no\"; print \"\"} 1" "$HOME"/.zshrc.tmp >"$HOME"/.zshrc.bak
|
||||||
|
fi
|
||||||
|
|
||||||
|
'command' 'mv' '--' "$HOME"/.zshrc.bak "$HOME"/.zshrc.tmp
|
||||||
|
|
||||||
|
if '[' "$direnv" '=' '1' ']'; then
|
||||||
|
'command' 'awk' "/Enable direnv/ {print \"# Enable direnv to automatically source .envrc files.\"; print \"zstyle ':foxshell:direnv' enable 'yes'\"; print \"\"} 1" "$HOME"/.zshrc.tmp >"$HOME"/.zshrc.bak
|
||||||
|
'command' 'mv' '--' "$HOME"/.zshrc.bak "$HOME"/.zshrc.tmp
|
||||||
|
fi
|
||||||
|
|
||||||
|
if '[' "$ssh" '=' '1' ']'; then
|
||||||
|
'command' 'awk' "/Enable.*SSH/ {print \"# Enable automatic teleportation of foxshell over SSH.\"; print \"zstyle ':foxshell:ssh:*' enable 'yes'\"; print \"\"} 1" "$HOME"/.zshrc.tmp >"$HOME"/.zshrc.bak
|
||||||
|
'command' 'mv' '--' "$HOME"/.zshrc.bak "$HOME"/.zshrc.tmp
|
||||||
|
fi
|
||||||
|
|
||||||
|
FOXSHELL="${XDG_CACHE_HOME:-$HOME/.cache}/foxshell"
|
||||||
|
|
||||||
|
if '[' '-e' "$HOME"/.zshenv ']'; then
|
||||||
|
'command' 'cp' '--' "$HOME"/.zshenv "$HOME"/.zshenv.bak
|
||||||
|
fi
|
||||||
|
'command' 'rm' '-rf' '--' "$FOXSHELL"
|
||||||
|
'command' 'mkdir' '-p' -- "$FOXSHELL"
|
||||||
|
|
||||||
|
zshenv="$HOME"/.zshenv.tmp
|
||||||
|
zshrc="$HOME"/.zshrc.tmp
|
||||||
|
|
||||||
|
'command' 'sed' "s|\${XDG_CACHE_HOME:-\$HOME/.cache}/foxshell|$FOXSHELL|g" "$zshenv" >"$zshenv.bak"
|
||||||
|
'command' 'mv' '--' "$zshenv.bak" "$zshenv"
|
||||||
|
|
||||||
|
if '[' '-e' "$HOME"/.zshrc ']'; then
|
||||||
|
'command' 'cp' '--' "$HOME"/.zshrc "$HOME"/.zshrc.bak
|
||||||
|
fi
|
||||||
|
|
||||||
|
'command' 'mv' '--' "$zshenv" "$HOME"/.zshenv
|
||||||
|
'command' 'mv' '--' "$zshrc" "$HOME"/.zshrc
|
||||||
|
'command' 'mv' '--' "$foxshell" "$FOXSHELL"/foxshell.zsh
|
||||||
|
|
||||||
|
>&2 'printf' '\033[33mfoxshell\033[0m: restarting \033[32mzsh\033[0m\n'
|
||||||
|
if '[' '-n' "${TMUX-}" ']'; then
|
||||||
|
'exec' "$SHELL" '-l'
|
||||||
|
else
|
||||||
|
'exec' "$SHELL" '-l' '-c' 'exec zsh'
|
||||||
|
fi
|
2
version
2
version
|
@ -1 +1 @@
|
||||||
500000033
|
100000001
|
||||||
|
|
12
z4h.zsh
12
z4h.zsh
|
@ -137,16 +137,16 @@ if '[' '-n' "${ZSH_VERSION-}" ']'; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if '[' '-n' "${Z4H-}" ']' &&
|
if '[' '-n' "${FOXSHELL-}" ']' &&
|
||||||
'[' "${Z4H_URL-}" '=' 'https://raw.githubusercontent.com/romkatv/zsh4humans/v5' ']' &&
|
'[' "${FOXSHELL_URL-}" '=' 'https://git.foxdale.tech/Arctic/foxshell/raw/branch/main' ']' &&
|
||||||
'[' '-z' "${Z4H##/*}" '-a' '-r' "$Z4H"/zsh4humans/main.zsh ']'; then
|
'[' '-z' "${FOXSHELL##/*}" '-a' '-r' "$FOXSHELL"/foxshell/main.zsh ']'; then
|
||||||
if '.' "$Z4H"/zsh4humans/main.zsh; then
|
if '.' "$FOXSHELL"/foxshell/main.zsh; then
|
||||||
'setopt' 'aliases'
|
'setopt' 'aliases'
|
||||||
'return'
|
'return'
|
||||||
fi
|
fi
|
||||||
'unset' '_z4h_bootstrap'
|
'unset' '_foxshell_bootstrap'
|
||||||
else
|
else
|
||||||
_z4h_bootstrap='1'
|
_foxshell_bootstrap='1'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if '[' '-n' "${_z4h_bootstrap-}" ']'; then
|
if '[' '-n' "${_z4h_bootstrap-}" ']'; then
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue