Persisted.nvim is a simple lua plugin for automated session management within Neovim
Forked from Persistence.nvim as active development has stopped
- Automatically saves the active session under
.local/share/nvim/sessions
on exiting Neovim - Supports sessions across multiple git branches
- Supports auto saving and loading of sessions with allowed/ignored directories
- Simple API to save/stop/restore/delete/list the current session(s)
- Telescope extension to list all sessions
- Neovim >= 0.7.0
Install the plugin with your preferred package manager:
-- Lua
use({
"olimorris/persisted.nvim",
--module = "persisted", -- For lazy loading
config = function()
require("persisted").setup()
require("telescope").load_extension("persisted") -- To load the telescope extension
end,
})
" Vim Script
Plug 'olimorris/persisted.nvim'
lua << EOF
require("persisted").setup {
-- your configuration comes here
-- or leave it empty to use the default settings
-- refer to the configuration section below
}
EOF
The plugin is designed to work with startup screens like vim-startify or dashboard out of the box. It will never load a session automatically by default.
However, to lazy load the plugin add the module = "persisted"
line to packer.
The plugin comes with a number of commands:
:SessionToggle
- Determines whether to load, start or stop a session:SessionStart
- Start recording a session. Useful ifautosave = false
:SessionStop
- Stop recording a session:SessionSave
- Save the current session:SessionLoad
- Load the session for the current directory and current branch ifgit_use_branch = true
:SessionLoadLast
- Load the last session:SessionDelete
- Delete the current session
Note: The author only binds
:SessionToggle
to a keymap for simplicity.
The Telescope extension may be opened via :Telescope persisted
.
Once opened, the available keymaps are:
<CR>
- Source the session file<C-d>
- Delete the session file
The plugin sets a global variable, vim.g.persisting
, which is set to true
when a session is started. The author uses this to display an icon in their statusline.
The plugin comes with the following defaults:
require("persisted").setup({
save_dir = vim.fn.expand(vim.fn.stdpath("data") .. "/sessions/"), -- directory where session files are saved
command = "VimLeavePre", -- the autocommand for which the session is saved
silent = false, -- silent nvim message when sourcing session file
use_git_branch = false, -- create session files based on the branch of the git enabled repository
autosave = true, -- automatically save session files when exiting Neovim
should_autosave = nil, -- function to determine if a session should be autosaved
autoload = false, -- automatically load the session for the cwd on Neovim startup
on_autoload_no_session = nil, -- function to run when `autoload = true` but there is no session to load
follow_cwd = true, -- change session file name to match current working directory if it changes
allowed_dirs = nil, -- table of dirs that the plugin will auto-save and auto-load from
ignored_dirs = nil, -- table of dirs that are ignored when auto-saving and auto-loading
before_save = nil, -- function to run before the session is saved to disk
after_save = nil, -- function to run after the session is saved to disk
after_source = nil, -- function to run after the session is sourced
telescope = { -- options for the telescope extension
before_source = nil, -- function to run before the session is sourced via telescope
after_source = nil, -- function to run after the session is sourced via telescope
reset_prompt_after_deletion = true, -- whether to reset prompt after session deleted
},
})
As the plugin uses Vim's :mksession
command then you may change the vim.o.sessionoptions
value to determine what to write into the session. Please see :h sessionoptions
for more information.
Note: The author uses
vim.o.sessionoptions = "buffers,curdir,folds,winpos,winsize"
The location of the session files may be changed by altering the save_dir
configuration option. For example:
require("persisted").setup({
save_dir = vim.fn.expand(vim.fn.stdpath("data") .. "/sessions/"), -- Resolves to ~/.local/share/nvim/sessions/
})
Note: The plugin may be unable to find existing sessions if the
save_dir
value is changed
By default, a session is saved to disk when the VimLeavePre
autocommand is triggered. This can be modified by:
require("persisted").setup({
command = "VimLeavePre",
})
Note: See
:h autocmds
for more information on possible autocmds
One of the plugin's core features is the ability to have multiple sessions files for a given project, by using git branches. To enable git branching:
require("persisted").setup({
use_git_branch = true,
})
Note: If git branching is enabled on a non git enabled repo, then
main
will be used as the default branch
By default, the plugin will automatically save a Neovim session to disk when the VimLeavePre
autocommand is triggered. Autosaving can be turned off by:
require("persisted").setup({
autosave = false,
})
Autosaving can be further controlled for certain directories by specifying allowed_dirs
and ignored_dirs
.
There may be occasions when you do not wish to autosave; perhaps when a dashboard or terminal are open. To control this,
a callback function, should_autosave
, may be specified. This function should return a boolean value.
require("persisted").setup({
should_autosave = function()
-- do not autosave if the alpha dashboard is the current filetype
if vim.bo.filetype == "alpha" then
return false
end
return true
end,
})
The plugin can be enabled to automatically load sessions when Neovim is started. Whilst off by default, this can be turned on by:
require("persisted").setup({
autoload = true,
})
You can also provide a function to run when autoload = true
but there is no session to be loaded:
require("persisted").setup({
autoload = true,
on_autoload_no_session = function()
vim.notify("No existing session to load.")
end
})
Autoloading can be further controlled for certain directories by specifying allowed_dirs
and ignored_dirs
.
Note: Autoloading will not occur if a user opens Neovim with arguments. For example:
nvim some_file.rb
There may be a need to change the working directory to quickly access files in other directories without changing the current session's name on save. This behavior can be configured with follow_cwd = false
.
By default, the session name will match the current working directory:
require("persisted").setup({
follow_cwd = true,
})
Note: If
follow_cwd = false
the session name is stored upon loading under the global variablevim.g.persisting_session
. This variable can be manually adjusted if changes to the session name are needed. Alternatively, iffollow_cwd = true
thenvim.g.persisting_session = nil
.
You may specify a table of directories for which the plugin will autosave and/or autoload from. For example:
require("persisted").setup({
allowed_dirs = {
"~/.dotfiles",
"~/Code",
},
})
Specifying ~/Code
will autosave and autoload from that directory as well as all its sub-directories.
Note: If
allowed_dirs
is left at its default value andautosave
and/orautoload
are set totrue
, then the plugin will autoload/autosave from any directory
You may specify a table of directories for which the plugin will never autosave and autoload from. For example:
require("persisted").setup({
ignored_dirs = {
"~/.config",
"~/.local/nvim"
},
})
Specifying ~/.config
will prevent any autosaving and autoloading from that directory as well as all its sub-directories.
The plugin allows for before and after callbacks to be executed in relation to a session being saved. This is achieved via the before_save
and after_save
configuration options:
require("persisted").setup({
before_save = function()
pcall(vim.cmd, "bw minimap")
end,
after_save = function()
print("Session was saved!")
end,
})
Note: The author uses a before callback to ensure that minimap.vim is not written into the session. Its presence prevents the exact buffer and cursor position from being restored when loading a session
The plugin allows for before and after callbacks to be executed in relation to a session being sourced:
require("persisted").setup({
before_source = function()
print("Sourcing...")
end,
after_source = function()
-- Reload the LSP servers
vim.lsp.stop_client(vim.lsp.get_active_clients())
end
})
The plugin contains an extension for telescope.nvim which allows the user to list all of the saved session files and source them via :Telescope persisted
.
The plugin allows for before and after callbacks to be used when sourcing a session via Telescope. For example:
require("persisted").setup({
telescope = {
before_source = function()
-- Close all open buffers
-- Thanks to https://github.com/avently
vim.api.nvim_input("<ESC>:%bd<CR>")
end,
after_source = function(session)
print("Loaded session " .. session.name)
end,
},
})
The callbacks can accept a session parameter which is a table that has the following properties:
name
- The filename of the sessionfile_path
- The file path to the sessionbranch
- The git branch of the session