{
  lib,
  helpers,
  config,
  pkgs,
  ...
}:
with lib;
helpers.vim-plugin.mkVimPlugin config {
  name = "typst-vim";
  originalName = "typst.vim";
  defaultPackage = pkgs.vimPlugins.typst-vim;
  globalPrefix = "typst_";

  # Add the typst compiler to nixvim packages
  extraPackages = [ pkgs.typst ];

  maintainers = [ maintainers.GaetanLepage ];

  # TODO introduced 2024-02-20: remove 2024-04-20
  deprecateExtraConfig = true;
  optionsRenamedToSettings = [
    "cmd"
    "pdfViewer"
    "concealMath"
    "autoCloseToc"
  ];

  extraOptions = {
    keymaps = {
      silent = mkOption {
        type = types.bool;
        description = "Whether typst-vim keymaps should be silent.";
        default = false;
      };

      watch = helpers.mkNullOrOption types.str "Keymap to preview the document and recompile on change.";
    };
  };

  extraConfig = cfg: {
    keymaps =
      with cfg.keymaps;
      helpers.keymaps.mkKeymaps
        {
          mode = "n";
          options.silent = silent;
        }
        (
          optional (watch != null) {
            # mode = "n";
            key = watch;
            action = ":TypstWatch<CR>";
          }
        );
  };

  settingsOptions = {
    cmd = helpers.defaultNullOpts.mkStr "typst" ''
      Specifies the location of the Typst executable.
    '';

    pdf_viewer = helpers.mkNullOrOption types.str ''
      Specifies pdf viewer that `typst watch --open` will use.
    '';

    conceal_math = helpers.defaultNullOpts.mkBool false ''
      Enable concealment for math symbols in math mode (i.e. replaces symbols with their actual
      unicode character).
      Warning: this can affect performance
    '';

    auto_close_toc = helpers.defaultNullOpts.mkBool false ''
      Specifies whether TOC will be automatically closed after using it.
    '';
  };

  settingsExample = {
    cmd = "typst";
    conceal_math = true;
    auto_close_toc = true;
  };
}