{ pkgs, ... }: {
  programs.neovim = {
    plugins = [{
      plugin = pkgs.vimPlugins.typst-preview-nvim;
      type = "lua";
      config = /*lua*/ ''
        require ('typst-preview').setup({
          open_cmd = "single-tab %s",
        })
      '';
    }];
    extraLuaConfig = /*lua*/ ''
      vim.lsp.enable('tinymist')
      vim.api.nvim_create_user_command("TypstExportPdfOnSaveToggle", function(args)
        if vim.lsp.get_clients({name="tinymist"})[1].settings.exportPdf ~= "onSave" then
          -- more settings see https://github.com/Myriad-Dreamin/tinymist/editors/neovim/Configuration.md
          vim.lsp.config("tinymist", {settings = {exportPdf = "onSave"}})
          -- compile and open pdf in evince
          local file_typ = vim.fn.expand('%:p')
          local file_pdf = vim.fn.expand('%:p:r') .. '.pdf'
          vim.system({'bash', '-c',
            'typst compile ' .. file_typ .. ' ' .. file_pdf .. ';' ..
            'evince ' .. file_pdf
          }, { text = true }, function()end)
          print("exportPdf = onSave")
        else
          vim.lsp.config("tinymist", {settings = {exportPdf = "never"}})
          print("exportPdf = never")
        end
        -- restart tinymist lsp, see `:h vim.lsp.enable`
        vim.lsp.enable("tinymist", false)
        vim.lsp.enable("tinymist", true)
      end, {})
    '';
    extraPackages = [ pkgs.tinymist ];
  };
  home.packages = [
    pkgs.typst
  ];
}