summary refs log tree commit diff stats
path: root/user/settings/zsh.nix
blob: 320705182b6452be8bf84e5a4e4400977a7f9bca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
{ config
, lib
, pkgs
, ...
}:
let
  inherit (pkgs) stdenv;
  zshrc = ".config/zsh/.zshrc";
  mkZshPlugin = attrs@{ name, file ? "${name}.plugin.zsh", ... }: {
    inherit name file;
    src = stdenv.mkDerivation {
      inherit (attrs) src;
      name = "zsh-plugin-${attrs.name}";
      buildInputs = [ pkgs.zsh ];
      buildPhase = ''
        zsh -c 'for f in **/*.zsh; zcompile "$f"'
      '';
      installPhase = ''
        cp -a $PWD $out/
      '';
    };
  };
in
{
  home.packages = with pkgs; [
    zsh-completions
  ];

  home.sessionVariables = {
    GHQ_ROOT = lib.mkDefault "${config.home.homeDirectory}/projects";
  };

  programs.zsh = {
    enable = true;

    enableAutosuggestions = true;
    enableCompletion = true;
    defaultKeymap = "emacs";

    dotDir = ".config/zsh";

    history = {
      expireDuplicatesFirst = true;
      extended = true;
      path = "${config.home.homeDirectory}/.local/share/zsh/history";
      save = 200000;
      size = 100000;
      share = false;
      ignorePatterns = [
        "rm *"
        "trash *"
        "pkill *"
        "* aria2c *"
      ];
    };

    localVariables = {
      ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE = "fg=8";
    };

    plugins = map mkZshPlugin [
      {
        name = "zsh-bd";
        file = "bd.plugin.zsh";
        src = pkgs.zsh-bd.src;
      }
      {
        name = "zsh-autopair";
        src = pkgs.zsh-autopair.src;
      }
      {
        name = "anyframe";
        src = pkgs.fetchFromGitHub {
          owner = "mollifier";
          repo = "anyframe";
          rev = "598675303044df8e9d04722f3adff4f63a238922";
          # date = 2017-07-19T21:59:49+09:00;
          sha256 = "08bjm1dd2mpv8rk8x6yvm6gj490rgimmiq7ln4jr5hik2k3mm82r";
        };
      }
      {
        name = "zsh-powerlevel10k";
        src = pkgs.zsh-powerlevel10k.src;
        file = "dummy";
      }
    ];

    # Put this in /etc/paths.d/ on Darwin instead
    envExtra = lib.optionalString (!stdenv.isDarwin) ''
      if [[ ''${path[(I)$HOME/.local/bin ]} ]]
      then
        path=($HOME/.local/bin $path)
      fi
    '';

    initExtraFirst = ''
      if [[ $TERM != "dumb" ]]
      then
        if [[ -r "${config.xdg.cacheHome}/p10k-instant-prompt-''${(%):-%n}.zsh" ]]; then
          source "${config.xdg.cacheHome}/p10k-instant-prompt-''${(%):-%n}.zsh"
        fi
        typeset -g POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true
        source $ZDOTDIR/plugins/zsh-powerlevel10k/powerlevel10k.zsh-theme
      fi
    '';
    initExtra =
      ''
        typeset -T GHQ_ROOT ghq_root

        function hist-freq-subcommands () {
          fc -l -m "$1*" -10000 | cut -d' ' -f4- | sort | uniq -c | sort -gr | head -n100 | less
        }

        source ${pkgs.fzf}/share/fzf/key-bindings.zsh
        source ${pkgs.fzf}/share/fzf/completion.zsh

      ''
      + builtins.readFile ../zsh/zshrc
      + (
        if stdenv.isDarwin
        then builtins.readFile ../zsh/zshrc.darwin
        else ""
      );
  };

  home.file."${config.xdg.configHome}/zsh/.p10k.zsh".source = ../zsh/p10k.zsh;
}