diff --git a/plugins/default.nix b/plugins/default.nix index 49f84144..2156c3bc 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -75,6 +75,7 @@ ./utils/alpha.nix ./utils/auto-save.nix + ./utils/auto-session.nix ./utils/comment-nvim.nix ./utils/commentary.nix ./utils/conjure.nix diff --git a/plugins/utils/auto-session.nix b/plugins/utils/auto-session.nix new file mode 100644 index 00000000..5440724c --- /dev/null +++ b/plugins/utils/auto-session.nix @@ -0,0 +1,187 @@ +{ + pkgs, + config, + lib, + ... +}: +with lib; let + cfg = config.plugins.auto-session; + helpers = import ../helpers.nix {inherit lib;}; +in { + options.plugins.auto-session = + helpers.extraOptionsOptions + // { + enable = mkEnableOption "auto-session"; + + package = helpers.mkPackageOption "auto-session" pkgs.vimPlugins.auto-session; + + logLevel = + helpers.defaultNullOpts.mkEnum + ["debug" "info" "warn" "error"] + "error" + "Sets the log level of the plugin."; + + autoSession = { + enabled = helpers.defaultNullOpts.mkBool true '' + Enables/disables auto creating, saving and restoring. + ''; + + enableLastSession = helpers.defaultNullOpts.mkBool false '' + Whether to enable the "last session" feature. + ''; + + rootDir = + helpers.defaultNullOpts.mkNullable + (with types; either str helpers.rawType) + "{__raw = \"vim.fn.stdpath 'data' .. '/sessions/'\";}" + '' + Root directory for session files. + Can be either a string or lua code (using `{__raw = 'foo';}`). + ''; + + createEnabled = helpers.mkNullOrOption types.bool '' + Whether to enable auto creating new sessions + ''; + + suppressDirs = helpers.mkNullOrOption (with types; listOf str) '' + Suppress session create/restore if in one of the list of dirs. + ''; + + allowedDirs = helpers.mkNullOrOption (with types; listOf str) '' + Allow session create/restore if in one of the list of dirs. + ''; + + useGitBranch = helpers.mkNullOrOption types.bool '' + Include git branch name in session name to differentiate between sessions for different + git branches. + ''; + }; + + autoSave = { + enabled = helpers.defaultNullOpts.mkNullable types.bool "null" '' + Whether to enable auto saving session. + ''; + }; + + autoRestore = { + enabled = helpers.defaultNullOpts.mkNullable types.bool "null" '' + Whether to enable auto restoring session. + ''; + }; + + cwdChangeHandling = + helpers.defaultNullOpts.mkNullable + ( + with types; + either + (enum [false]) + (submodule { + options = { + restoreUpcomingSession = helpers.defaultNullOpts.mkBool true '' + Restore session for upcoming cwd on cwd change. + ''; + + preCwdChangedHook = helpers.mkNullOrOption types.str '' + lua function hook. + This is called after auto_session code runs for the `DirChangedPre` autocmd. + ''; + + postCwdChangedHook = helpers.mkNullOrOption types.str '' + lua function hook. + This is called after auto_session code runs for the `DirChanged` autocmd. + ''; + }; + }) + ) + "false" + '' + Config for handling the DirChangePre and DirChanged autocmds. + Set to `false` to disable the feature. + ''; + + bypassSessionSaveFileTypes = helpers.mkNullOrOption (with types; listOf str) '' + List of file types to bypass auto save when the only buffer open is one of the file types + listed. + ''; + + sessionLens = { + loadOnSetup = helpers.defaultNullOpts.mkBool true '' + If `loadOnSetup` is set to false, one needs to eventually call + `require("auto-session").setup_session_lens()` if they want to use session-lens. + ''; + + themeConf = + helpers.defaultNullOpts.mkNullable + types.attrs + "{winblend = 10; border = true;}" + "Theme configuration."; + + previewer = helpers.defaultNullOpts.mkBool false '' + Use default previewer config by setting the value to `null` if some sets previewer to + true in the custom config. + Passing in the boolean value errors out in the telescope code with the picker trying to + index a boolean instead of a table. + This fixes it but also allows for someone to pass in a table with the actual preview + configs if they want to. + ''; + + sessionControl = { + controlDir = + helpers.defaultNullOpts.mkNullable + (with types; either str helpers.rawType) + "\"vim.fn.stdpath 'data' .. '/auto_session/'\"" + '' + Auto session control dir, for control files, like alternating between two sessions + with session-lens. + ''; + + controlFilename = helpers.defaultNullOpts.mkStr "session_control.json" '' + File name of the session control file. + ''; + }; + }; + }; + + config = let + setupOptions = + { + log_level = cfg.logLevel; + auto_session_enable_last_session = cfg.autoSession.enableLastSession; + auto_session_root_dir = cfg.autoSession.rootDir; + auto_session_enabled = cfg.autoSession.enabled; + auto_session_create_enabled = cfg.autoSession.createEnabled; + auto_save_enabled = cfg.autoSave.enabled; + auto_restore_enabled = cfg.autoRestore.enabled; + auto_session_suppress_dirs = cfg.autoSession.suppressDirs; + auto_session_allowed_dirs = cfg.autoSession.allowedDirs; + auto_session_use_git_branch = cfg.autoSession.useGitBranch; + cwd_change_handling = + if isAttrs cfg.cwdChangeHandling + then + with cfg.cwdChangeHandling; { + restore_upcoming_session = restoreUpcomingSession; + pre_cwd_changed_hook = helpers.ifNonNull' preCwdChangedHook (helpers.mkRaw preCwdChangedHook); + post_cwd_changed_hook = helpers.ifNonNull' postCwdChangedHook (helpers.mkRaw postCwdChangedHook); + } + else cfg.cwdChangeHandling; + bypass_session_save_file_types = cfg.bypassSessionSaveFileTypes; + session_lens = with cfg.sessionLens; { + load_on_setup = loadOnSetup; + theme_conf = themeConf; + inherit previewer; + sessionControl = with sessionControl; { + control_dir = controlDir; + control_filename = controlFilename; + }; + }; + } + // cfg.extraOptions; + in + mkIf cfg.enable { + extraPlugins = [cfg.package]; + + extraConfigLua = '' + require('auto-session').setup(${helpers.toLuaObject setupOptions}) + ''; + }; +} diff --git a/tests/test-sources/plugins/utils/auto-session.nix b/tests/test-sources/plugins/utils/auto-session.nix new file mode 100644 index 00000000..ca8a1c6c --- /dev/null +++ b/tests/test-sources/plugins/utils/auto-session.nix @@ -0,0 +1,46 @@ +{ + empty = { + plugins.auto-session.enable = true; + }; + + example = { + plugins.auto-session = { + enable = true; + + logLevel = "error"; + autoSession = { + enabled = true; + enableLastSession = false; + rootDir = {__raw = "vim.fn.stdpath 'data' .. '/sessions/'";}; + createEnabled = true; + suppressDirs = null; + allowedDirs = []; + useGitBranch = true; + }; + autoSave = { + enabled = true; + }; + autoRestore = { + enabled = true; + }; + cwdChangeHandling = { + restoreUpcomingSession = true; + preCwdChangedHook = null; + postCwdChangedHook = null; + }; + bypassSessionSaveFileTypes = []; + sessionLens = { + loadOnSetup = true; + themeConf = { + winblend = 10; + border = true; + }; + previewer = false; + sessionControl = { + controlDir = "vim.fn.stdpath 'data' .. '/auto_session/'"; + controlFilename = "session_control.json"; + }; + }; + }; + }; +}