rktjmp / lush.nvim

Create Neovim themes with real-time feedback, export anywhere.
MIT License
1.49k stars 47 forks source link

Blend property and Vim compatibility #29

Closed savq closed 3 years ago

savq commented 3 years ago

I recently found out that the blend property isn't available in Vim8. See savq/melange#4.

It was pretty easy to hack a solution, but this might need a better thought-out solution. Maybe add a compatibility flag to the compile function?

rktjmp commented 3 years ago

Hmm, technically Lush only supports Neovim. I think it's better that any compat layer is done outside of Lush. Wary of scope creep.

I would probably patch it before the make file since you already have a build system

function targets.vim8()
    local parsed = lush(melange)
    -- i forget how to write lua properly...
    for group, values in pairs(parsed) do
      values.gui = maybe_gui_without_blend(values.gui)
      -- I think you can abuse lua mutability here
      parsed[group] = values -- might muck up lua's pairs/next() iterator though
      -- you can see that compile does some basic type checking (for a __lushmeta key)
      -- https://github.com/rktjmp/lush.nvim/blob/02b79d4db6f61b23849b28f988e4f15683cdb4ee/lua/lush/compiler.lua#L37
      -- so just update the gui key, don't recreate the whole table
    end
    local compiled = lush.compile(parsed, {force_clean = true })
    table.insert(compiled, 4, "let g:colors_name = 'melange'")
    -- or you could just strip blend from the compiled list, just be careful to be order agnostic,
    -- blend is last right now, but that's not for any reason, a new key may appear after it at some point
    -- or existing keys may be reordered.
    -- your current fix may fail if this happens too I think, you might get extra ','.
    return table.concat(compiled, '\n')
end 

I think the real fix is getting vim to support blending :taco:

I had been thinking about a compiler plugin system, more around lush => alacritty than lush => vim8. Something that accepts a parsed spec and outputs external themes. Not sure how practical that is though when each theme probably wants to connect its colors to external theme parts differently (Normal -> bg vs g[n] -> bg, etc). If that existed, that's where vim8 compat would be.

savq commented 3 years ago

I would probably patch it before the make file since you already have a build system

Ehhh, yeah. Should have thought of that first.

I think I'll go with removing blend from the compiled list for now.

I had been thinking about a compiler plugin system...

I don't think it's urgent to add that to Lush. I haven't had much trouble with the "build" system I wrote. It's not fancy, but it does the job. The only alternative I've considered so far is to use a templating system like mustache 🤔

when each theme probably wants to connect its colors to external theme parts differently...

Yep. I don't have a "standard" 16 colors theme, so I'm still figuring out that one myself.

rktjmp commented 3 years ago

Now has option pass exclude_keys to compile,

See https://github.com/rktjmp/lush.nvim/issues/30#issuecomment-826881085