Zsh/HOWTO

From Gentoo Wiki
< Zsh
Revision as of 20:36, 23 July 2013 by SwifT (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Installation

Installing zsh

To install zsh under Gentoo, we need to emerge the app-shells/zsh (zsh itself) and app-shells/zsh-completion (zsh completion scripts) packages.

root # emerge --ask zsh zsh-completion

Entering zsh

When you start zsh for the first time, you get the following message. You can skip this menu as we will create an init file later in this guide.

user $ zsh
This is the Z Shell configuration function for new users, zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses --- q


Configuration

Introduction

To start zsh for a single session, run zsh . For a more permanent solution, please refer to the chapter on #Saving_settings. After the installation, zsh seems to be very simple and rather limited in the area of functionality. To change this, several configuration changes need to be performed.

Advanced Tab-completion

To enable the famous zsh tab-completion system, you need to run the following commands:

user $ autoload -U compinit
user $
compinit

Default completion style is quite plain and ugly. If you want to improve its appearance, enter the following commands:

user $ zstyle ':completion:*:descriptions' format '%U%B%d%b%u'
user $
zstyle ':completion:*:warnings' format '%BSorry, no matches for: %d%b'

Command correction

It is also a good idea to enable the auto-correction of the commands typed:

user $ setopt correctall

Prompts

The prompt may seem quite boring however, but we can fix it easily in several steps. First, we need to initialize advanced prompt support:

user $ autoload -U promptinit
user $
promptinit

Available prompts samples may be printed via the prompt -p command. Now we can activate our favorite one:

user $ prompt gentoo>
gentoo> ls
Note
If you're playing around with the different prompts, and you don't want to see a sample of every one, you can use prompt -l to list the prompts available.

Another option is to create your own prompt. To do this you will need to set the PS1 environment variable.

user $ export PS1="[Test Prompt] > "
[Test Prompt] > ls

While it is good to be able to create a custom text prompt, zsh also provides many escape sequences that allow system information to be inserted into the prompt. Some of the escape sequences available are:

Sequence Printed
 %T System time (HH:MM)
 %* System time (HH:MM:SS)
 %D System date (YY-MM-DD)
 %n Your username
 %B - %b Begin - end bold print
 %U - %u Begin - end underlining
 %d Your current working directory
 %~ Your current working directory, relative to ~
 %M The computer's hostname
 %m The computer's hostname (truncated before the first period)
 %l Your current tty

These escape sequences may simply be inserted into the environment variable, PS1, and zsh will parse them automatically.

user $ export PS1="[%* - %D] %d %% "
[08:44:23 - 06-02-18] /home/username % ls

History

Unfortunately, the default zsh configuration in Gentoo does not include command history support. As working with a shell without history is very frustrating, we should enter the following commands:

user $ export HISTSIZE=2000
user $
export HISTFILE="$HOME/.history"

History won't be saved without the following command:

user $ export SAVEHIST=$HISTSIZE

To prevent history from recording duplicated entries (such as ls -l entered many times during single shell session), you can set the hist_ignore_all_dups option:

user $ setopt hist_ignore_all_dups

A useful trick to prevent particular entries from being recorded into a history by preceding them with at least one space.

user $ setopt hist_ignore_space

The following command won't be recorded. Note the extra space before it:

user $ cat /proc/cpuinfo

Miscellaneous settings

You can set the autocd option if you want to avoid tedious typing of cd command while changing current directory (for example /etc instead of cd /etc ).

user $ setopt autocd

If standard bash-like globbing does not satisfy you, extendedglob option may be set to enable extended globbing (one similar to regular expressions).

user $ setopt extendedglob

When option above is set, you are able to use extended globbing queries such as cp ^*.(tar|bz2|gz) .

Saving settings

Saving zsh settings

Once we have customized zsh the way we like it, it is a good idea to save these options as the zsh defaults for the system. One possible way to achieve this is to write our settings in the /etc/zsh/zshrc script. Alternatively, we could make them the defaults for our account only be editing ~/.zshrc .

CodeAn example zshrc

#!/bin/zsh

# completion
autoload -U compinit
compinit

# correction
setopt correctall

# prompt
autoload -U promptinit
promptinit
prompt gentoo


Making zsh default shell

Option for users with root privileges

We can change shell for given user with usermod command.

root # usermod -s /bin/zsh userlogin


Alternative for non-root users

If your system administrator (despite gentle requests, that is) refuses to set the shell to zsh for you, you can set bash to execute zsh on startup, all you need to do is make a slight modification to your ~/.bashrc .

CodeSample ~/.bashrc

## (Add the following to your ~/.bashrc)
exec zsh

Another method of changing shells is to use the chsh command (a utility used to change a user's login shell). A normal user may only change the login shell for his own account. As root, you can change the login shell of any user.

user $ chsh -s /bin/zsh username

Acknowledgements

We would like to thank the following authors and editors for their contributions to this guide:

  • Henryk Konsek
  • Andrew Morritt
  • Chris White
  • Peter Weller