Skip to content

Shell & frameworks

shell: zsh # the simple form, and it still means what it did
shell:
name: zsh
framework: oh-my-zsh
theme: agnoster
plugins: [git, docker, fzf]

On a fresh machine you are usually running bash while installing and configuring zsh. The shell Bedouin detects is the one you are about to stop using, so shell.rc_dir, the PATH file and every rc block key off the one you declare. shell.detected is still there if you need it.

The framework is installed if absent, and never updated — the same shape as brew or rustup: fetch the installer, run it as a file, argv only.

The ordering, which is the whole difficulty

Section titled “The ordering, which is the whole difficulty”

oh-my-zsh reads ZSH_THEME and plugins as it loads. Every other Bedouin block is appended at the end of your rc file — and a framework block there would be set after omz had already loaded, so the theme would not change, the plugins would not load, and nothing would say why.

So the framework block is anchored: written immediately above the line that sources the framework.

Terminal window
# >>> bedouin: framework >>>
ZSH_THEME='agnoster'
plugins=(git docker)
# <<< bedouin: framework <<<
source $ZSH/oh-my-zsh.sh # ← reads them, so it must come after

oh-my-zsh bundles most of what people list. The ones it does not — zsh-autosuggestions, zsh-syntax-highlighting — are git clones, so they are a repo:

shell:
name: zsh
framework: oh-my-zsh
plugins: [git, zsh-autosuggestions]
repos:
- url: https://github.com/zsh-users/zsh-autosuggestions
dest: "{{ home }}/.oh-my-zsh/custom/plugins/zsh-autosuggestions"

Listing one without a repo for it is a warning naming the entry to write — Bedouin will not pretend a name is an installation. The framework is installed before repos run, since a plugin clones into its directory.

framework: means oh-my-zsh, on zsh. Declaring it on bash or fish is an error naming what is supported, rather than a half-working port. fish’s own ecosystem can follow when someone wants it.