local api = vim.api local DEFAULT_GASLIGHTING_CHANCE = 5 -- 5% chance per line local MIN_LINE_LENGTH = 10 -- minimum trimmed line length to apply gaslighting local GASLIGHTING_MESSAGES = { "Are you sure this will pass the code quality checks? 🤔", "Is this line really covered by unit tests? 🧐", "I wouldn't commit that line without double checking... 💭", "Your tech lead might have questions about this one 🤔", "That's an... interesting way to solve this 🤯", "Did you really mean to write it this way? 🤔", "Maybe add a comment explaining why this isn't as bad as it looks? 📝", "Bold choice! Very... creative 💡", "Please. Tell me Copilot wrote this one... 🤖", "Totally not a memory leak... 🚽", "I'd be embarrassed to push this to git if I were you. 😳", } -- Plugin state local is_enabled = true local gaslighting_chance_percentage = DEFAULT_GASLIGHTING_CHANCE local ns = api.nvim_create_namespace("syntax_gaslighting") vim.cmd("highlight default link GaslightingUnderline Comment") local function createHash(str) local hash1, hash2 = 0, 0 for i = 1, #str do local byte = str:byte(i) hash1 = (hash1 * 31 + byte) % 0xFFFFFFFF hash2 = (hash2 * 37 + byte) % 0xFFFFFFFF end return string.format("%08x%08x", hash1, hash2) end -- Given a line of code, decide if a gaslighting message should be applied -- and return the selected message if so. local function getGaslightingMessageForLineContent(line) local hash = createHash(line) local selectionNum = tonumber(hash:sub(1, 8), 16) local messageNum = tonumber(hash:sub(-8), 16) if (selectionNum % 100) < gaslighting_chance_percentage then local messageIndex = (messageNum % #GASLIGHTING_MESSAGES) + 1 return GASLIGHTING_MESSAGES[messageIndex] end return nil end -- Update the gaslighting decorations in the current buffer. local function update_gaslighting_decorations() if not is_enabled then return end local bufnr = api.nvim_get_current_buf() -- Clear previous extmarks in our namespace api.nvim_buf_clear_namespace(bufnr, ns, 0, -1) local lines = api.nvim_buf_get_lines(bufnr, 0, -1, false) for i, line in ipairs(lines) do local trimmed = vim.trim(line) if #trimmed >= MIN_LINE_LENGTH then -- Skip dummy comment lines (detection based on starting patterns) -- There can be some native API for integration, but I'm not sure. if not (trimmed:find("^//") or trimmed:find("^#") or trimmed:find("^/%*") or trimmed:find("^%*") or trimmed:find("^