The ultimate theme manager for Neovim
The goals of this plugin are:
- Find a theme without using google
- Be able to preview a theme in neovim (including its Tree-sitter support)
- Install a theme and change the colorscheme without touching the config
- Neovim 0.8.0 or greater
Pineapple is not designed to:
- Find a theme that works with Tree-sitter, though you can find some of those themes by a text filter of "treesitter" or "Treesitter"
- Manage the installation for your theme, that is the package manager's job
- Find a theme for your lualine or anything else that needs to be seperately themed
- Manage any local themes in development you might be using
Pineapple has only been tested with lazy.nvim as a package manager, though it probably would work with others.
Here's the quick setup:
- Create an empty file in your ~/.config/nvim/lua/YOUR_LUA_DIRECTORY directory (or C:\Users_\AppData\Local\Nvim if you're a Windows user). This file is for storing your installed themes.
- Create an empty file in the ~/.config/nvim/after/plugin folder (called theme.lua). This file is for setting the colorscheme.
- Then for setup, put this in your config:
{
"CWood-sdf/pineapple",
dependencies = require("YOUR_LUA_DIRECTORY.pineapple"),
opts = {
installedRegistry = "YOUR_LUA_DIRECTORY.pineapple",
colorschemeFile = "after/plugin/theme.lua"
},
cmd = "Pineapple",
}
Note that opts.installedRegistry and colorschemeFile are in different file formats. This is so that opts.installedRegistry can be put in a variable at the top of your lazy config file. The directory that both installedRegistry and colorschemeFile are assumed to be in is $HOME.config\nvim (or %USERPROFILE%\AppData\Local\Nvim if you're a Windows user)
Some distros have their own way of setting the colorscheme. For example, LunarVim uses the 'lvim.colorscheme' variable to change the colorscheme. To accomodate this, there is a setup option called colorschemeSet, which is a function that determines what to write to colorschemeFile.
Here's an example with it set for LunarVim:
{
colorschemeSet = function(scheme)
return "vim.cmd('colorscheme " .. scheme .. "')\n lvim.colorscheme = '" .. scheme .. "'"
end
}
Here's an example of my config:
option | description |
---|---|
installedRegistry |
A lua require able string that holds the location of the file where the themes to be installed will be stored |
colorschemeFile |
A string that holds the location of the file that will be sourced to set the colorscheme |
colorschemeSet |
A function that takes a string and returns a string that will be written to colorschemeFile |
The plugin can be opened with the command Pineapple
This is what the plugin looks like when it is first opened:
All the remaps are shown at the top of the screen.
To preview a plugin, just hit v
while hovering over it. To install a plugin, hit i
while hovering over it. To uninstall a plugin, hit x
while hovering over it in the "Installed" screen. To set the colorscheme, hit u
while hovering over it in the Installed screen.
Due to lazy.nvim's lazy loading of themes, calling the telescope picker for themes will not return any of the pineapple installed themes. However, pineapple provides an easy way to still use telescope to find a theme.
Just run the code:
require('telescope').load_extension('pineapple')
require('telescope').extensions.pineapple.colorschemes()
Pineapple is designed to minimally interrupt your startup time. Nothing is loaded until the plugin is opened with the command Pineapple
(at least with lazy.nvim).
This whole idea is from the vimcolorschemes website, and I wanted to put that in a neovim extension.
A rewritten version of the vimcolorschemes worker was used to generate the theme data.
The preview doesn't account for screen size, so it can look pretty ugly on a small screen.
The VimResize autocmd is not implemented yet, so the preview will not resize with the window.
The filtering capabilities are minimal, and the sorting capabilities are non-existent.
The UX design is currently not great. I am not a great UX designer, so please submit an issue or a pull request with suggestions/fixes!
Name | Description |
---|---|
getInstalledThemes() |
Returns the list of installed themes |
uninstall(theme) |
Uninstalls the theme from the config file |
install(theme) |
Installs the theme to the config file |
setColorScheme(theme) |
Sets the colorscheme to the given parameter |
getInstalledColorData() |
Returns the color data for the installed themes |
getAllData() |
Returns all the data for all the themes |
Pineapple is designed to be removed as easily as possible. The steps to remove it are pretty simple:
Add the installation line for whatever your current theme is to your lazy.nvim config file. All your downloaded themes can be seen at ~/.config/nvim/YOUR_LUA_DIRECTORY/YOUR_PINEAPPLE_FILE.lua. After this, you can remove the pineapple install line and run Lazy sync
.
Pineapple fires several events that you can attach autocmds to:
Event Name | Description | Parameters |
---|---|---|
PineappleUninstallPre |
Fired before a theme is uninstalled | The theme's GitHub id |
PineappleUninstallPost |
Fired after a theme is uninstalled | The theme's GitHub id |
PineappleInstallPre |
Fired before a theme is installed | The theme's GitHub id |
PineappleInstallPost |
Fired after a theme is installed | The theme's GitHub id |
PineappleColorschemePre |
Fired before a theme is set as the colorscheme | The theme |
PineappleColorschemePost |
Fired after a theme is set as the colorscheme | The theme |
Using the autocmds is very simple, the name of the event is just passed as the pattern argument to the User
autocmd, like this:
vim.api.nvim_create_autocmd("User", {
pattern = "PineappleColorschemePost",
callback = function(ev)
print("The colorscheme was set to " .. ev.data[1])
end,
})