Lush without Lush ================= ```lua -- shipwright_build.lua local colorscheme = require("zenbones") local lushwright = require("shipwright.transform.lush") run(colorscheme, lushwright.to_vimscript, {overwrite, "colors/zenbones.vim"}) ``` - [What is Shipwright](#what-is-shipwright) - [Exporting a colorscheme to Lua](#exporting-a-colorscheme-to-configurable-lua) - [Exporting a colorscheme to Vim Script](#exporting-a-colorscheme-to-vim-script) - [Converting a Lush colorscheme into an Alacritty colorscheme](#converting-a-lush-colorscheme-into-an-alacritty-colorscheme) - [Branch transform](#branch-transform) - [Transform helpers](#transform-helpers) - [Transform list](#transform-list) ## What is Shipwright [Shipwright](https://github.com/rktjmp/shipwright.nvim) is flexible build system. To export your lush theme you will have to install Shipwright with your package manager first: ```lua use "rktjmp/shipwright.nvim" ``` It is recommended you read the Shipwright readme before continuing as this guide will build apon the concepts explained there. Shipwright can help you prepare your colorscheme for use with common terminal emulators and other tools. Lush provides some aditional Shipwright transforms for use with parsed lush specs: - `to_vimscript`, head, convert parsed spec into vimscript - `to_lua`, head, convert parsed spec into a table containing `Group = {attrs}` strings. - `vim_compatible_vimscript`, tail, remove vim-incompatible values from highlight rules You must `require("shipwright.transform.lush")` in your `shipwright_build.lua` to access these transforms. We will discuss the simplest example, where you have a colorscheme with no variations or configuration options and simply want to let non-lush users use your colorscheme. Exporting a colorscheme to Lua ------------------------------------------- The lua transform converts your Lush colorscheme into a table of `group-name = group-attributes` strings. The generated code is intentionally slim, containing only the group data. Applying this data is simple but left to the colorscheme creator. We will use the `patchwrite` transform so Shipwright will only update the group data when we run it, leaving our support code intact. First, lets create the build file:
```lua -- shipwright_build.lua local lushwright = require("shipwright.transform.lush") run(require("my.lush.colorscheme"), -- generate lua code lushwright.to_lua, -- write the lua code into our destination. -- you must specify open and close markers yourself to account -- for differing comment styles, patchwrite isn't limited to lua files. {patchwrite, "colors/colorscheme.lua", "-- PATCH_OPEN", "-- PATCH_CLOSE"}) ```
Before running this build file, we should prepare the destination for `patchwrite`:
```lua -- colors/colorscheme.lua local colors = { -- content here will not be touched -- PATCH_OPEN -- group data will be inserted here -- PATCH_CLOSE -- content here will not be touched } -- colorschemes generally want to do this vim.cmd("highlight clear") vim.cmd("set t_Co=256") vim.cmd("let g:colors_name='my_theme'") -- apply highlight groups for group, attrs in pairs(colors) do vim.api.nvim_set_hl(0, group, attrs) end ```
After running `:Shipwright`, our `colors` variable will be populated with `group = attributes` pairs. The attribute tables are ready-made to pass to `nvim_set_hl` though you could modify as desired. You could also incude different `patchwrite` markers to export multiple colorschemes (or parts of a colorscheme) to the same file. For example a base set of colors and a dark & light set, then selectively pass which groups you want to nvim_set_hl. You can also include multiple `run()` calls in your shipwright build file to export a set of colorschemes with one command. ## Exporting a colorscheme to Vim Script To ship our colorscheme as a vimscript file, we will need to: - load our colorscheme. - convert it to vimscript. - save the output to a file. We will use the `lush_to_vimscript` and `overwrite` transforms. Our build file would look something like this: ```lua -- shipwright_build.lua local colorscheme = require("my.lush.colorscheme") local lushwright = require("shipwright.transform.lush") -- we start by calling run and giving it our colorscheme as the first argument. -- any other arguments form the pipeline. run(colorscheme, -- now we will convert that colorscheme to a list of vimscript highlight commands lushwright.to_vimscript, -- we can pass the vimscript through a vim compatible transform if we want. -- note: this strips blending -- lushwright.vim_compatible_vimscript, -- the vimscript commands alone are generally not enough for a colorscheme, we -- will need to append a few housekeeping lines first. -- -- note how we are passing arguments to append by wrapping the transform in a table. -- {transform 1 2 3} ends up as transform(last_pipe_value, 1, 2, 3) -- -- append() accepts a table of values, or one value, so this call ends up being: -- append(last_pipe_value, {"set...", "let..."}) {append, {"set background=dark", "let g:colors_name=\"my_colorscheme\""}}, -- now we are ready to write our colors file. note: there is no reason this has -- to be written to the relative "colors" dir, you could write the file to an -- entirely different vim plugin. {overwrite, "colors/my_colorscheme.vim"}) -- and that is the whole build file ``` You can run `:Shipwright ` which will load and execute the given build file, or if no buildfile is specified, Shipwright will look for `shipwright_build.lua` in the current working directory. Transform helpers ----------------- Some helpers are provided to cover common transform tasks. These are a available under `shipwright.transform.lush.helpers`, see the module for an up to date list. ```lua return { -- is argument a lush spec is_lush_spec = is_lush_spec, } ``` Transform list -------------- Every transform accepts and returns a table, this is implied in the documentation, so "returns commands" means "returns a list of strings, where each string is a command". **`to_vimscript`** - Converts a parsed lush spec into highlight commands. - Accepts - `config`: table passed to `lush.compile` **`to_lua`** - Converts a parsed lush spec into `group = group-attributes` strings for insertion inside a lua table form. - Accepts - none **`vim_compatible_vimscript`** - Removes vim-incompatible attributes from highlight commands - Accepts - none