Add/Show/Delete Emojis on Notes (#181)

This MR adds the ability to view, add, and delete emojis from notes and comments.

This action can be performed by default with the `Ea` (emoji add) keybinding, and the `Ed` (emoji delete) keybinding. Only emojis added by the current user are eligible for deletion. The MR also implements a popup functionality which shows the user who added emojis on hover.

Implements #179
This commit is contained in:
Harrison (Harry) Cramer
2024-02-18 21:16:53 -05:00
committed by GitHub
parent 99741178f9
commit baee20b279
22 changed files with 11655 additions and 83 deletions

78
lua/gitlab/hover.lua Normal file
View File

@@ -0,0 +1,78 @@
local M = {}
M.show_popup = function(char)
-- Close existing popup if it's open
if M.popup_win_id and vim.api.nvim_win_is_valid(M.popup_win_id) then
vim.api.nvim_win_close(M.popup_win_id, true)
end
-- Create a buffer for the popup window
local buf = vim.api.nvim_create_buf(false, true)
-- Set the content of the popup buffer to the character
vim.api.nvim_buf_set_lines(buf, 0, -1, false, { char })
-- Define the popup window options
local opts = {
relative = "cursor",
row = -2,
col = 0,
width = 2, -- Width set to 2 to accommodate the border
height = 1,
style = "minimal",
border = "single",
}
-- Open the popup window and store its ID
M.popup_win_id = vim.api.nvim_open_win(buf, false, opts)
end
M.close_popup = function()
if M.popup_win_id and vim.api.nvim_win_is_valid(M.popup_win_id) then
vim.api.nvim_win_close(M.popup_win_id, true)
M.popup_win_id = nil -- Reset the window ID
end
end
M.init = function()
-- Set up autocommands
vim.api.nvim_create_autocmd({ "CursorHold" }, {
callback = function()
-- Get the current cursor position
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
row = row - 1 -- Adjust row because Lua is 1-indexed
col = col - 2 -- Adjust to account for > at front of line
if col < 1 then
return
end
-- Get the text of the current line
local line = vim.api.nvim_buf_get_lines(0, row, row + 1, false)[1]
-- Correctly handle multi-byte characters, such as emojis
local byteIndexStart = vim.str_byteindex(line, col)
local byteIndexEnd = vim.str_byteindex(line, col + 1)
-- Extract the character (or emoji) under the cursor
local char = line:sub(byteIndexStart + 1, byteIndexEnd)
-- Proceed only if char is not empty (to avoid empty popups)
if char == "" then
return
end
M.show_popup(char)
end,
buffer = vim.api.nvim_get_current_buf(),
})
vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, {
callback = function()
M.close_popup()
end,
buffer = vim.api.nvim_get_current_buf(),
})
end
return M