157 lines
4.3 KiB
Lua
157 lines
4.3 KiB
Lua
-- mod-version:3
|
|
|
|
--[[
|
|
Author: techie-guy
|
|
|
|
Plugin to customize the caret in the editor
|
|
Thanks to @Guldoman for the initial example on Discord
|
|
|
|
Features
|
|
Change the Color and Opacity of the caret
|
|
Change the Shape of the caret, available shapes are Line, Block, Underline
|
|
|
|
Customizing the Caret: (this can be changed from the .config/lite-xl/init.lua
|
|
file or from the settings menu plugin)
|
|
config.plugins.custom_caret.shape - Change the shape of the caret [string]
|
|
style.caret - Change the rgba color of the caret [table]
|
|
|
|
Example Config(in the .config/lite-xl/init.lua)
|
|
style.caret = {0, 255, 255, 150}
|
|
config.plugins.custom_caret.shape = "block"
|
|
]]
|
|
|
|
local core = require "core"
|
|
local style = require "core.style"
|
|
local common = require "core.common"
|
|
local config = require "core.config"
|
|
local DocView = require "core.docview"
|
|
|
|
config.plugins.custom_caret = common.merge({
|
|
shape = "line",
|
|
custom_color = true,
|
|
color_r = style.caret[1],
|
|
color_g = style.caret[2],
|
|
color_b = style.caret[3],
|
|
opacity = style.caret[4]
|
|
}, config.plugins.custom_caret)
|
|
|
|
-- Reference to plugin config
|
|
local conf = config.plugins.custom_caret
|
|
|
|
-- Get real default caret color after everything is loaded up
|
|
core.add_thread(function()
|
|
if
|
|
conf.color_r == 147 and conf.color_g == 221
|
|
and
|
|
conf.color_b == 250 and conf.opacity == 255
|
|
and
|
|
(
|
|
style.caret[1] ~= conf.color_r or style.caret[2] ~= conf.color_g
|
|
or
|
|
style.caret[3] ~= conf.color_b or style.caret[4] ~= conf.opacity
|
|
)
|
|
then
|
|
conf.color_r = style.caret[1]
|
|
conf.color_g = style.caret[2]
|
|
conf.color_b = style.caret[3]
|
|
conf.opacity = style.caret[4]
|
|
end
|
|
|
|
local settings_loaded, settings = pcall(require, "plugins.settings")
|
|
if settings_loaded then
|
|
conf.config_spec = {
|
|
name = "Custom Caret",
|
|
{
|
|
label = "Shape",
|
|
description = "The Shape of the cursor.",
|
|
path = "shape",
|
|
type = "selection",
|
|
default = "line",
|
|
values = {
|
|
{"Line", "line"},
|
|
{"Block", "block"},
|
|
{"Underline", "underline"}
|
|
}
|
|
},
|
|
{
|
|
label = "Custom Color",
|
|
description = "Use a custom color for the caret as specified below.",
|
|
path = "custom_color",
|
|
type = "toggle",
|
|
default = true
|
|
},
|
|
{
|
|
label = "Red Component of Color",
|
|
description = "The color consists of 3 components RGB, "
|
|
.. "This modifies the 'R' component of the caret's color",
|
|
path = "color_r",
|
|
type = "number",
|
|
min = 0,
|
|
max = 255,
|
|
default = style.caret[1],
|
|
step = 1,
|
|
},
|
|
{
|
|
label = "Green Component of Color",
|
|
description = "The color consists of 3 components RGB, "
|
|
.. "This modifies the 'G' component of the caret's color",
|
|
path = "color_g",
|
|
type = "number",
|
|
min = 0,
|
|
max = 255,
|
|
default = style.caret[2],
|
|
step = 1,
|
|
},
|
|
{
|
|
label = "Blue Component of Color",
|
|
description = "The color consists of 3 components RGB, "
|
|
.. "This modifies the 'B' component of the caret's color",
|
|
path = "color_b",
|
|
type = "number",
|
|
min = 0,
|
|
max = 255,
|
|
default = style.caret[3],
|
|
step = 1,
|
|
},
|
|
{
|
|
label = "Opacity of the Cursor",
|
|
description = "The Opacity of the caret",
|
|
path = "opacity",
|
|
type = "number",
|
|
min = 0,
|
|
max = 255,
|
|
default = style.caret[4],
|
|
step = 1,
|
|
},
|
|
}
|
|
|
|
---@cast settings plugins.settings
|
|
settings.ui:enable_plugin("custom_caret")
|
|
end
|
|
end)
|
|
|
|
function DocView:draw_caret(x, y)
|
|
local caret_width = style.caret_width
|
|
local caret_height = self:get_line_height()
|
|
local current_caret_shape = conf.shape
|
|
local caret_color = conf.custom_color and {
|
|
conf.color_r,
|
|
conf.color_g,
|
|
conf.color_b,
|
|
conf.opacity
|
|
} or style.caret
|
|
|
|
if (current_caret_shape == "block") then
|
|
caret_width = math.ceil(self:get_font():get_width("a"))
|
|
elseif (current_caret_shape == "underline") then
|
|
caret_width = math.ceil(self:get_font():get_width("a"))
|
|
caret_height = style.caret_width*2
|
|
y = y+self:get_line_height()
|
|
else
|
|
caret_width = style.caret_width
|
|
caret_height = self:get_line_height()
|
|
end
|
|
|
|
renderer.draw_rect(x, y, caret_width, caret_height, caret_color)
|
|
end
|