Skip to content

quantumfate/ansible-role-zsh

Repository files navigation

quantumfate/ansible-role-zsh

This is a detached fork from viasite-ansible/ansible-role-zsh.

Build Status

Tested on Debian 10, Ubuntu 16.04, Ubuntu 18.04, Ubuntu 20.04, macOS 10.12, CentOS 8, ArchLinux 5.18.16.

Zero-knowledge install

If you using Ubuntu or Debian and not familiar with Ansible, you can just execute install.sh on target machine:

curl https://raw.githubusercontent.com/quantumfate/ansible-role-zsh/master/install.sh | bash

It will install pip3, ansible and setup zsh for root and current user.

if you are using Manjaro or Arch you can use the script install_arch.sh:

curl https://raw.githubusercontent.com/quantumfate/ansible-role-zsh/master/install_arch.sh | bash

Then configure terminal application.

Features

  • theming
  • customize powerlevel10k theme prompt segments and colors
  • default colors tested with solarized dark and default grey terminal in putty
  • add custom prompt elements from yml
  • custom zsh config with ~/.zshrc.local or /etc/zshrc.local
  • load /etc/profile.d scripts
  • install only plugins that useful for your machine. For example, plugin docker will not install if you have not Docker

Includes:

Install

Zero-knowledge install: see above.

Manual install

  1. Install Ansible. For Ubuntu:
sudo apt update
sudo apt install python3-pip -y
sudo pip3 install ansible
  1. Download role:
ansible-galaxy install quantumfate.zsh --force
  1. Write playbook or use playbook.yml:
- hosts: all
  vars:
    zsh_antigen_bundles_extras:
      - nvm
      - joel-porquet/zsh-dircolors-solarized
    zsh_autosuggestions_bind_key: "^U"
  roles:
    - quantumfate.zsh
  1. Provision playbook:
ansible-playbook -i "localhost," -c local -K playbook.yml

If you want to provision role for root user on macOS, you should install packages manually:

brew install zsh git wget

It will install zsh environment for ansible remote user. If you want to setup zsh for other users, you should define variable zsh_user:

Via playbook:

- hosts: all
  roles:
    - { role: quantumfate.zsh, zsh_user: otheruser }
    - { role: quantumfate.zsh, zsh_user: thirduser }

Or via command:

ansible-playbook -i hosts zsh.yml -e zsh_user=otheruser
  1. Install fzf without shell extensions, download binary or brew install fzf for macOS.

Note: I don't use tmux-fzf and don't tested work of it.

Multiuser shared install

If you have 10+ users on host, probably you don't want manage tens of configurations and thousands of files.

In this case you can deploy single zsh config and include it to all users.

It causes some limitations:

  • Users have read only access to zsh config
  • Users cannot disable global enabled bundles
  • Possible bugs such cache write permission denied
  • Possible bugs with oh-my-zsh themes

For install shared configuration you should set zsh_shared: yes. Configuration will install to /usr/share/zsh-config, then you just can include to user config:

source /usr/share/zsh-config/.zshrc

You can still provision custom configs for several users.

Theming

By default pk10 theme will be used. Follow their docs for additional theme configuration.

Using a different theme

You can use any theme. Just use the following variable and your theme will be applied after reloading your shell.

zsh_antigen_theme: <yourtheme>

Basic Configuration

You should not edit ~/.zshrc! Add your custom config to ~/.zshrc.local (per user) or /etc/zshrc.local (global). .zshrc.local will never touched by ansible.

Distros that make use of /etc/skel

By default this role will write everything to .zshrc and your changes belong into ~/.zshrc.local. Tho, there are some distros that use the script /etc/skel to configure your home directory. To keep your changes from being affected set the following variables:

zsh_personal_config: true
zsh_alternative_name: /.zshrc_personal # Optional | Use the value skel uses to load your personal configs

Hotkeys

You can view hotkeys in defaults/main.yml, zsh_hotkeys.

Sample hotkey definitions:

- { hotkey: '^r', action: 'fzf-history' }
# with dependency of bundle
- { hotkey: '`', action: autosuggest-accept, bundle: zsh-users/zsh-autosuggestions }

Useful to set autosuggest-accept to ` hotkey, but it conflicts with Midnight Commander (break Ctrl+O subshell).

You can add your custom hotkeys without replace default hotkeys with zsh_hotkeys_extras variable:

zsh_hotkeys_extras:
  - { hotkey: '^[^[[D', action: backward-word } # alt+left
  - { hotkey: '^[^[[C', action: forward-word } # alt+right
  # Example <Ctrl+.><Ctrl+,> inserts 2nd argument from end of prev. cmd
  - { hotkey: '^[,', action: copy-earlier-word } # ctrl+,

Default hotkeys from plugins:

  • - accept autosuggestion
  • Ctrl+Z - move current application to background, press again for return to foreground
  • Ctrl+G - jump to bookmarked directory. Use mark in directory for add to bookmarks
  • Ctrl+R - show command history
  • Ctrl+@ - show all fzf-widgets
  • Ctrl+@,C - fzf-change-dir, press fast!
  • Ctrl+\ - fzf-change-recent-dir
  • Ctrl+@,G - fzf-change-repository
  • Ctrl+@,F - fzf-edit-files
  • Ctrl+@,. - fzf-edit-dotfiles
  • Ctrl+@,S - fzf-exec-ssh (using your ~/.ssh/config)
  • Ctrl+@,G,A - fzf-git-add-file
  • Ctrl+@,G,B - fzf-git-checkout-branch
  • Ctrl+@,G,D - fzf-git-delete-branches

Additional configuration

Aliases

You can use aliases for your command with easy deploy. Aliases config mostly same as hotkeys config:

zsh_aliases_extras:
  - { alias: 'dfh', action: 'df -h | grep -v docker' }
# with dependency of bundle and without replace default asiases
zsh_aliases_extras:
  - { alias: 'dfh', action: 'df -h | grep -v docker', bundle: }

Providing the name is not mandatory.

Sources

You can add more custom defined sources by setting the following variable:

zsh_sources_extras:
  - { name: 'Wal Colors', path: '$HOME/.cache/wal/colors.sh'}

Export Variable

You can add more expors by setting the following variable:

zsh_export_vars_extras:
  - { name: 'Default editor', variable: 'EDITOR', value: 'nvim'}

PATH Variable

Append your paths to the path variable:

zsh_paths_extras:
  - { name: 'Lua language server', path: '/usr/bin/lua-language-server'}

Configure bundles

You can check default bundles in defaults/main.yml. If you like default bundles, but you want to add your bundles, use zsh_antigen_bundles_extras variable (see example playbook above). If you want to remove some default bundles, you should use zsh_antigen_bundles variable.

Format of list matches antigen. All bellow variants valid:

- docker # oh-my-zsh plugin
- zsh-users/zsh-autosuggestions # plugin from github
- zsh-users/zsh-autosuggestions@v0.3.3 # plugin from github with fixed version
- ~/projects/zsh/my-plugin --no-local-clone # plugin from local directory

Note that bundles can use conditions for load. There are two types of conditions:

  1. Command conditions. Just add command to bundle:
- { name: docker, command: docker }
- name: docker-compose
  command: docker-compose

Bundles docker and docker-compose will be added to config only if commands exists on target system.

  1. When conditions. You can define any ansible conditions as you define in when in tasks:
# load only for zsh >= 4.3.17
- name: zsh-users/zsh-syntax-highlighting
  when: "{{ zsh_version is version_compare('4.3.17', '>=') }}"
# load only for macOS
- { name: brew, when: "{{ ansible_os_family != 'Darwin' }}" }

Note: you should wrap condition in "{{ }}"

Custom config

You can add any code in variable zsh_custom_before, zsh_custom_after.

  • zsh_custom_before - before include antigen.zsh
  • zsh_custom_after - before include ~/.zshrc.local

Notes

Midnight Commander Solarized Dark skin

If you using Solarized Dark scheme and mc, you should want to install skin, then set zsh_mc_solarized_skin: yes

Demo install in Vagrant

You can test work of role before install in real machine. Just execute vagrant up, then vagrant ssh for enter in virtual machine.

Note: you cannot install vagrant on VPS like Digital Ocean or in Docker. Use local machine for it. Download and install vagrant for your operating system.

Known bugs

su username caused errors

See antigen issue. If both root and su user using antigen, you should use su - username in place of su username.

Or you can use bundled alias suser.

Also, you can try to fix it, add to ~/.zshrc.local:

alias su='su -'

But this alias can break you scripts, that using su.