Zsh: Difference between revisions

From NixOS Wiki
Klinger (talk | contribs)
Layer-09 (talk | contribs)
I divided the information into more manageable sections and formatted the code using Alejandra. Additionally, I added references and some other options.
Line 1: Line 1:
[https://www.zsh.org/ Zsh] is a powerful [[Command Shell|shell]] that operates as both an interactive shell and as a scripting language interpreter. While being compatible with the POSIX sh (not by default, only if issuing {{ic|emulate sh}}), it offers advantages such as improved [http://zsh.sourceforge.net/Guide/zshguide06.html tab completion] and [http://zsh.sourceforge.net/Doc/Release/Expansion.html globbing].
[https://www.zsh.org/ Zsh] is a powerful Unix [https://wiki.nixos.org/wiki/Command_Shell shell] that functions both as an interactive shell and a scripting language interpreter. It extends the Bourne Shell (sh) with features from bash, ksh, and tcsh, offering [http://zsh.sourceforge.net/Guide/zshguide06.html advanced tab completion], improved [http://zsh.sourceforge.net/Doc/Release/Expansion.html globbing], and extensive customization options. Though not POSIX sh-compatible by default, it can be configured to be so with <code>emulate sh</code>.
 
Key features include highly customizable prompts, enhanced command history, spelling correction, and robust job control. The Oh My Zsh framework simplifies managing plugins and themes. Zsh is cross-platform, available on Unix-like systems including Linux and macOS, and is popular among developers and system administrators for its advanced features and user-friendly enhancements.


The [http://zsh.sourceforge.net/FAQ/zshfaq01.html#l4 Zsh FAQ] offers more reasons to use Zsh.
The [http://zsh.sourceforge.net/FAQ/zshfaq01.html#l4 Zsh FAQ] offers more reasons to use Zsh.
Line 7: Line 9:


== Configuration ==
== Configuration ==
Zsh can be configured with [[Home Manager]].


Full list of home-manager options for zsh can be found [https://nix-community.github.io/home-manager/options.xhtml#opt-programs.zsh.enable here.]
==== 3.1 Basic ====
<syntaxhighlight lang="nix">
programs.zsh = {
    enable = true;
};
</syntaxhighlight>


=== Example Configuration ===
==== 3.2 Advanced ====
{{file|~/.config/nixpkgs/home.nix|nix|<nowiki>
The configuration below is using home manager, but a more limited version of it can be achieved if system-wide.<syntaxhighlight lang="nix">
programs.zsh = {
programs.zsh = {
  enable = true;
    enable = true;
  enableCompletion = true;
    enableCompletion = true;
  autosuggestions.enable = true;
    autosuggestions.enable = true;
  syntaxHighlighting.enable = true;
    syntaxHighlighting.enable = true;
 
    shellAliases = {
      ll = "ls -l";
      edit = "sudo -e";
      update = "sudo nixos-rebuild switch";
    };


  shellAliases = {
     history.size = 10000;
     ll = "ls -l";
     history.ignoreAllDups = true;
     update = "sudo nixos-rebuild switch";
    history.path = "$HOME/.zsh_history";
  };
    history.ignorePatterns = ["rm *" "pkill *" "cp *"];
  history.size = 10000;
  history.path = "${config.xdg.dataHome}/zsh/history";
};
};
</nowiki>}}
</syntaxhighlight>


=== Plugin Management ===
== Tips and Tricks ==
Home manager has three ways of managing plugins: Zplug, Oh-My-Zsh and manual.


==== Zplug ====
==== 4.1 Where to see a list of options? ====
{{file|~/.config/nixpkgs/home.nix|nix|<nowiki>
The home manager options are defined in the following [https://nix-community.github.io/home-manager/options.xhtml#opt-programs.zsh.enable Home Manager Options Manual].
 
The system-wide options are listed on [https://mynixos.com/search?q=zsh MyNixOS].
 
==== 4.2 How to use plugins? ====
Home manager has three ways of managing plugins: '''Zplug''', '''Oh-My-Zsh''' and '''Manual'''.<syntaxhighlight lang="nix">
programs.zsh = {
programs.zsh = {
   ... # Your zsh config
   enable = true;
 
   zplug = {
   zplug = {
     enable = true;
     enable = true;
     plugins = [
     plugins = [
       { name = "zsh-users/zsh-autosuggestions"; } # Simple plugin installation
       {name = "zsh-users/zsh-autosuggestions";} # Simple plugin installation
       { name = "romkatv/powerlevel10k"; tags = [ as:theme depth:1 ]; } # Installations with additional options. For the list of options, please refer to Zplug README.
       {
        name = "romkatv/powerlevel10k";
        tags = [as:theme depth:1];
      } # Installations with additional options. For the list of options, please refer to Zplug README.
     ];
     ];
   };
   };
};
 
</nowiki>}}
==== Oh-My-Zsh ====
<code>oh-my-zsh</code> is a framework to manage your ZSH configuration including completion scripts for several CLI tools or custom prompt themes. It is documented in the [https://nixos.org/manual/nixos/stable/#module-programs-zsh-ohmyzsh NixOS manual].{{file|~/.config/nixpkgs/home.nix|nix|<nowiki>
programs.zsh = {
  ... # Your zsh config
   ohMyZsh = {
   ohMyZsh = {
     enable = true;
     enable = true;
     plugins = [ "git" "thefuck" ];
     plugins = ["git" "thefuck"];
     theme = "robbyrussell";
     theme = "robbyrussell";
   };
   };
};
</nowiki>}}


==== Manual ====
{{file|~/.config/nixpkgs/home.nix|nix|<nowiki>
programs.zsh = {
  ... # Your zsh config
   plugins = [
   plugins = [
     {
     {
      # will source zsh-autosuggestions.plugin.zsh
       name = "zsh-autocomplete";
       name = "zsh-autosuggestions";
       src = pkgs.fetchFromGitHub {
       src = pkgs.fetchFromGitHub {
         owner = "zsh-users";
         owner = "marlonrichert";
         repo = "zsh-autosuggestions";
         repo = "zsh-autocomplete";
         rev = "v0.4.0";
         rev = "23.07.13";
         sha256 = "0z6i9wjjklb4lvr7zjhbphibsyx51psv50gm07mbb0kj9058j6kc";
         sha256 = "sha256-/6V6IHwB5p0GT1u5SAiUa20LjFDSrMo731jFBq/bnpw=";
       };
       };
     }
     }
     {
     {
       name = "enhancd";
       name = "powerlevel10k";
       file = "init.sh";
      src = pkgs.zsh-powerlevel10k;
      file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme";
    }
    {
      name = "powerlevel10k-config";
      src = ./p10k-config;
       file = "p10k.zsh";
    }
    {
      name = "zsh-syntax-highlighting";
       src = pkgs.fetchFromGitHub {
       src = pkgs.fetchFromGitHub {
         owner = "b4b4r07";
         owner = "zsh-users";
         repo = "enhancd";
         repo = "zsh-syntax-highlighting";
         rev = "v2.2.1";
         rev = "0.8.0";
         sha256 = "0iqa9j09fwm6nj5rpip87x3hnvbbz9w9ajgm6wkrd5fls8fn8i5g";
         sha256 = "sha256-iJdWopZwHpSyYl5/FQXEW7gl/SrKaYDEtTH9cGP7iPo=";
       };
       };
     }
     }
   ];
   ];
};
};
</nowiki>}}
</syntaxhighlight>


== Troubleshooting ==
== Troubleshooting ==
=== Zsh-autocomplete not working ===
 
==== 5.1 Zsh-autocomplete not working ====
You may have some issues with the {{ic|marlonrichert/zsh-autocomplete}} plugin on NixOS. That's because the default NixOS configuration overrides keybinds for up and down arrow keys. To fix this issue, you need to add this somewhere in your .zshrc (either manually if your .zshrc is not managed by Nix, or with {{ic|packages.zsh.initExtra}})
You may have some issues with the {{ic|marlonrichert/zsh-autocomplete}} plugin on NixOS. That's because the default NixOS configuration overrides keybinds for up and down arrow keys. To fix this issue, you need to add this somewhere in your .zshrc (either manually if your .zshrc is not managed by Nix, or with {{ic|packages.zsh.initExtra}})
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Line 92: Line 108:
</syntaxhighlight>
</syntaxhighlight>


=== SHA Mismatch during manual plugin installation ===
==== 5.2 SHA Mismatch during manual plugin installation ====
If manual plugin installation fails with SHA mismatch, generating a valid hash as part of the error message can be achieved by temporarily switching to:
If manual plugin installation fails with SHA mismatch, generating a valid hash as part of the error message can be achieved by temporarily switching to:
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
Line 101: Line 117:
Redoing this is mandatory if one wants to update to a newer commit of the targeted plugin repository.  
Redoing this is mandatory if one wants to update to a newer commit of the targeted plugin repository.  


=== GDM does not show user when zsh is the default shell ===
==== 5.3 GDM does not show user when zsh is the default shell ====
GDM only shows users that have their default shell set to a shell listed in /etc/shells. Setting the default shell using the following does not update /etc/shells.
GDM only shows users that have their default shell set to a shell listed in /etc/shells. Setting the default shell using the following does not update /etc/shells.
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
Line 111: Line 127:
</syntaxhighlight>
</syntaxhighlight>


== See also ==
== References ==
* [[Command Shell]]
 
# https://www.zsh.org/
# http://zsh.sourceforge.net/Guide/zshguide06.html
# http://zsh.sourceforge.net/Doc/Release/Expansion.html
# http://zsh.sourceforge.net/FAQ/zshfaq01.html#l4
# https://nix-community.github.io/home-manager/options.xhtml#opt-programs.zsh.enable
# https://mynixos.com/search?q=zsh
 
[[Category:Shell]]
[[Category:Shell]]
[[Category:NixOS Manual]]
[[Category:NixOS Manual]]

Revision as of 09:22, 20 June 2024

Zsh is a powerful Unix shell that functions both as an interactive shell and a scripting language interpreter. It extends the Bourne Shell (sh) with features from bash, ksh, and tcsh, offering advanced tab completion, improved globbing, and extensive customization options. Though not POSIX sh-compatible by default, it can be configured to be so with emulate sh.

Key features include highly customizable prompts, enhanced command history, spelling correction, and robust job control. The Oh My Zsh framework simplifies managing plugins and themes. Zsh is cross-platform, available on Unix-like systems including Linux and macOS, and is popular among developers and system administrators for its advanced features and user-friendly enhancements.

The Zsh FAQ offers more reasons to use Zsh.

Installation

See Command Shell.

Configuration

3.1 Basic

programs.zsh = {
    enable = true;
};

3.2 Advanced

The configuration below is using home manager, but a more limited version of it can be achieved if system-wide.

programs.zsh = {
    enable = true;
    enableCompletion = true;
    autosuggestions.enable = true;
    syntaxHighlighting.enable = true;

    shellAliases = {
      ll = "ls -l";
      edit = "sudo -e";
      update = "sudo nixos-rebuild switch";
    };

    history.size = 10000;
    history.ignoreAllDups = true;
    history.path = "$HOME/.zsh_history";
    history.ignorePatterns = ["rm *" "pkill *" "cp *"];
};

Tips and Tricks

4.1 Where to see a list of options?

The home manager options are defined in the following Home Manager Options Manual.

The system-wide options are listed on MyNixOS.

4.2 How to use plugins?

Home manager has three ways of managing plugins: Zplug, Oh-My-Zsh and Manual.

programs.zsh = {
  enable = true;

  zplug = {
    enable = true;
    plugins = [
      {name = "zsh-users/zsh-autosuggestions";} # Simple plugin installation
      {
        name = "romkatv/powerlevel10k";
        tags = [as:theme depth:1];
      } # Installations with additional options. For the list of options, please refer to Zplug README.
    ];
  };

  ohMyZsh = {
    enable = true;
    plugins = ["git" "thefuck"];
    theme = "robbyrussell";
  };

  plugins = [
    {
      name = "zsh-autocomplete";
      src = pkgs.fetchFromGitHub {
        owner = "marlonrichert";
        repo = "zsh-autocomplete";
        rev = "23.07.13";
        sha256 = "sha256-/6V6IHwB5p0GT1u5SAiUa20LjFDSrMo731jFBq/bnpw=";
      };
    }
    {
      name = "powerlevel10k";
      src = pkgs.zsh-powerlevel10k;
      file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme";
    }
    {
      name = "powerlevel10k-config";
      src = ./p10k-config;
      file = "p10k.zsh";
    }
    {
      name = "zsh-syntax-highlighting";
      src = pkgs.fetchFromGitHub {
        owner = "zsh-users";
        repo = "zsh-syntax-highlighting";
        rev = "0.8.0";
        sha256 = "sha256-iJdWopZwHpSyYl5/FQXEW7gl/SrKaYDEtTH9cGP7iPo=";
      };
    }
  ];
};

Troubleshooting

5.1 Zsh-autocomplete not working

You may have some issues with the marlonrichert/zsh-autocomplete plugin on NixOS. That's because the default NixOS configuration overrides keybinds for up and down arrow keys. To fix this issue, you need to add this somewhere in your .zshrc (either manually if your .zshrc is not managed by Nix, or with packages.zsh.initExtra)

bindkey "''${key[Up]}" up-line-or-search

5.2 SHA Mismatch during manual plugin installation

If manual plugin installation fails with SHA mismatch, generating a valid hash as part of the error message can be achieved by temporarily switching to:

sha256 = lib.fakeSha256;

This will print a valid SHA to the console and then can be used as final value for the sha256 field. Redoing this is mandatory if one wants to update to a newer commit of the targeted plugin repository.

5.3 GDM does not show user when zsh is the default shell

GDM only shows users that have their default shell set to a shell listed in /etc/shells. Setting the default shell using the following does not update /etc/shells.

users.defaultUserShell = pkgs.zsh;

To add the zsh package to /etc/shells you must update environment.shells.

environment.shells = with pkgs; [ zsh ];

References

  1. https://www.zsh.org/
  2. http://zsh.sourceforge.net/Guide/zshguide06.html
  3. http://zsh.sourceforge.net/Doc/Release/Expansion.html
  4. http://zsh.sourceforge.net/FAQ/zshfaq01.html#l4
  5. https://nix-community.github.io/home-manager/options.xhtml#opt-programs.zsh.enable
  6. https://mynixos.com/search?q=zsh