96 lines
2.4 KiB
Lua
96 lines
2.4 KiB
Lua
local M = {}
|
|
|
|
local ns_id = vim.api.nvim_create_namespace('private_mode')
|
|
local enabled = false
|
|
local concealed_char = '•' -- Character to show instead of text
|
|
|
|
local function conceal_buffer()
|
|
local buf = vim.api.nvim_get_current_buf()
|
|
local line_count = vim.api.nvim_buf_line_count(buf)
|
|
|
|
vim.api.nvim_buf_clear_namespace(buf, ns_id, 0, -1)
|
|
|
|
for i = 0, line_count - 1 do
|
|
local line = vim.api.nvim_buf_get_lines(buf, i, i + 1, false)[1]
|
|
if line and #line > 0 then
|
|
-- Conceal each character individually
|
|
for col = 0, #line - 1 do
|
|
vim.api.nvim_buf_set_extmark(buf, ns_id, i, col, {
|
|
end_col = col + 1,
|
|
conceal = concealed_char,
|
|
})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function reveal_current_line()
|
|
local buf = vim.api.nvim_get_current_buf()
|
|
local cursor = vim.api.nvim_win_get_cursor(0)
|
|
local current_line = cursor[1] - 1
|
|
|
|
-- Clear concealment for current line only
|
|
vim.api.nvim_buf_clear_namespace(buf, ns_id, current_line, current_line + 1)
|
|
end
|
|
|
|
local function update_display()
|
|
if not enabled then return end
|
|
|
|
conceal_buffer()
|
|
local mode = vim.fn.mode()
|
|
|
|
-- Reveal current line in insert mode
|
|
if mode == 'i' or mode == 'R' then
|
|
reveal_current_line()
|
|
end
|
|
end
|
|
|
|
function M.toggle()
|
|
enabled = not enabled
|
|
|
|
if enabled then
|
|
-- Set concealment options
|
|
vim.opt_local.conceallevel = 2
|
|
vim.opt_local.concealcursor = 'nvc'
|
|
|
|
-- Initial concealment
|
|
update_display()
|
|
|
|
-- Set up autocommands
|
|
local group = vim.api.nvim_create_augroup('PrivateMode', { clear = true })
|
|
|
|
vim.api.nvim_create_autocmd({'ModeChanged', 'CursorMoved', 'CursorMovedI', 'TextChanged', 'TextChangedI'}, {
|
|
group = group,
|
|
callback = update_display,
|
|
})
|
|
|
|
print("Private mode enabled")
|
|
else
|
|
-- Clear all concealment
|
|
local buf = vim.api.nvim_get_current_buf()
|
|
vim.api.nvim_buf_clear_namespace(buf, ns_id, 0, -1)
|
|
|
|
-- Clear autocommands
|
|
vim.api.nvim_create_augroup('PrivateMode', { clear = true })
|
|
|
|
print("Private mode disabled")
|
|
end
|
|
end
|
|
|
|
function M.setup(opts)
|
|
opts = opts or {}
|
|
concealed_char = opts.conceal_char or '•'
|
|
|
|
-- Create user command
|
|
vim.api.nvim_create_user_command('PrivateMode', function()
|
|
M.toggle()
|
|
end, {})
|
|
|
|
-- Optional: Set up a keybinding
|
|
if opts.keymap then
|
|
vim.keymap.set('n', opts.keymap, M.toggle, { desc = 'Toggle private mode' })
|
|
end
|
|
end
|
|
|
|
return M
|