Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: comment statuscolumn & foldtext #555

Merged
merged 9 commits into from
Jun 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
262 changes: 103 additions & 159 deletions README.md

Large diffs are not rendered by default.

9 changes: 5 additions & 4 deletions lua/octo/autocmds.lua
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
local vim = vim
local create = vim.api.nvim_create_augroup
local define = vim.api.nvim_create_autocmd

Expand All @@ -17,8 +18,8 @@ function M.setup()
define({ "BufReadCmd" }, {
group = "octo_autocmds",
pattern = { "octo://*" },
callback = function()
require("octo").load_buffer()
callback = function(ev)
require("octo").load_buffer(ev.buf)
end,
})
define({ "BufWriteCmd" }, {
Expand Down Expand Up @@ -65,12 +66,12 @@ function M.setup()
})
end

function M.update_signcolumn(bufnr)
function M.update_signs(bufnr)
define({ "TextChanged", "TextChangedI" }, {
group = "octobuffer_autocmds",
buffer = bufnr,
callback = function()
require("octo").render_signcolumn()
require("octo").render_signs()
end,
})
end
Expand Down
10 changes: 9 additions & 1 deletion lua/octo/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ local M = {}

---@class OctoConfigUi
---@field use_signcolumn boolean
---@field use_statuscolumn boolean
---@field use_foldtext boolean

---@class OctoConfigIssues
---@field order_by OctoConfigOrderBy
Expand Down Expand Up @@ -114,7 +116,9 @@ function M.get_default_values()
projects_v2 = false,
},
ui = {
use_signcolumn = true,
use_signcolumn = false,
use_statuscolumn = true,
use_foldtext = true,
},
issues = {
order_by = {
Expand Down Expand Up @@ -408,6 +412,8 @@ function M.validate_config()
validate_type(config.default_merge_method, "default_merge_method", "string")
if validate_type(config.ui, "ui", "table") then
validate_type(config.ui.use_signcolumn, "ui.use_signcolumn", "boolean")
validate_type(config.ui.use_statuscolumn, "ui.use_statuscolumn", "boolean")
validate_type(config.ui.use_foldtext, "ui.use_foldtext", "boolean")
end
if validate_type(config.colors, "colors", "table") then
for k, v in pairs(config.colors) do
Expand Down Expand Up @@ -472,6 +478,8 @@ function M.setup(opts)
vim.log.levels.ERROR
)
end
M.values.ui.use_statuscolumn = M.values.ui.use_statuscolumn and vim.fn.has "nvim-0.9" == 1
M.values.ui.use_foldtext = M.values.ui.use_foldtext and vim.fn.has "nvim-0.10" == 1
end

return M
20 changes: 20 additions & 0 deletions lua/octo/folds.lua
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
local config = require "octo.config"

local M = {}

function M.setup() end

function M.create(bufnr, start_line, end_line, is_opened)
if config.values.ui.use_foldtext then
start_line = start_line - 1
end
vim.api.nvim_buf_call(bufnr, function()
vim.cmd [[setlocal foldmethod=manual]]
vim.cmd(string.format("%d,%dfold", start_line, end_line))
Expand All @@ -12,4 +17,19 @@ function M.create(bufnr, start_line, end_line, is_opened)
end)
end

--- Folds will already have correct highlighting, but the fold background will
--- extend over the entire line. This function will make sure the whitespace
--- before the fold icon is using no background.
function M.foldtext()
local buf = vim.api.nvim_get_current_buf()
local lnum = vim.v.foldstart
local extmark =
vim.api.nvim_buf_get_extmarks(buf, -1, { lnum - 1, 0 }, { lnum - 1, -1 }, { details = true, type = "virt_text" })[1]

local text = vim.tbl_get(extmark, 4, "virt_text", 1, 1)
if text then
return { { text:match "^%s+", "Normal" } }
end
end

return M
8 changes: 5 additions & 3 deletions lua/octo/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,9 @@ function M.load_buffer(bufnr)
return
end
M.load(repo, kind, number, function(obj)
M.create_buffer(kind, obj, repo, false)
vim.api.nvim_buf_call(bufnr, function()
M.create_buffer(kind, obj, repo, false)
end)
end)
end

Expand Down Expand Up @@ -119,10 +121,10 @@ function M.load(repo, kind, number, cb)
}
end

function M.render_signcolumn()
function M.render_signs()
local bufnr = vim.api.nvim_get_current_buf()
local buffer = octo_buffers[bufnr]
buffer:render_signcolumn()
buffer:render_signs()
end

function M.on_cursor_hold()
Expand Down
35 changes: 22 additions & 13 deletions lua/octo/model/octo-buffer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ local graphql = require "octo.gh.graphql"
local signs = require "octo.ui.signs"
local writers = require "octo.ui.writers"
local utils = require "octo.utils"
local vim = vim

local M = {}

Expand Down Expand Up @@ -237,15 +238,22 @@ end
function OctoBuffer:configure()
-- configure buffer
vim.api.nvim_buf_call(self.bufnr, function()
local use_signcolumn = config.values.ui.use_signcolumn
vim.cmd [[setlocal filetype=octo]]
vim.cmd [[setlocal buftype=acwrite]]
vim.cmd [[setlocal omnifunc=v:lua.octo_omnifunc]]
vim.cmd [[setlocal conceallevel=2]]
vim.cmd [[setlocal nonumber norelativenumber nocursorline wrap]]
if use_signcolumn then

if config.values.ui.use_signcolumn then
vim.cmd [[setlocal signcolumn=yes]]
autocmds.update_signcolumn(self.bufnr)
autocmds.update_signs(self.bufnr)
end
if config.values.ui.use_statuscolumn then
vim.opt_local.statuscolumn = [[%!v:lua.require'octo.ui.statuscolumn'.statuscolumn()]]
autocmds.update_signs(self.bufnr)
end
if config.values.ui.use_foldtext then
vim.opt_local.foldtext = [[v:lua.require'octo.folds'.foldtext()]]
end
end)

Expand Down Expand Up @@ -389,7 +397,7 @@ function OctoBuffer:do_save_title_and_body()
self.bodyMetadata = desc_metadata
end

self:render_signcolumn()
self:render_signs()
utils.info "Saved!"
end
end,
Expand Down Expand Up @@ -421,7 +429,7 @@ function OctoBuffer:do_add_issue_comment(comment_metadata)
break
end
end
self:render_signcolumn()
self:render_signs()
end
end
end,
Expand Down Expand Up @@ -464,7 +472,7 @@ function OctoBuffer:do_add_thread_comment(comment_metadata)
review:update_threads(threads)
end

self:render_signcolumn()
self:render_signs()

-- update thread map
local thread_id
Expand Down Expand Up @@ -568,7 +576,7 @@ function OctoBuffer:do_add_new_thread(comment_metadata)
if review then
review:update_threads(threads)
end
self:render_signcolumn()
self:render_signs()
end
else
utils.error "Failed to create thread"
Expand Down Expand Up @@ -665,7 +673,7 @@ function OctoBuffer:do_add_new_thread(comment_metadata)
local threads = resp.comment.pullRequest.reviewThreads.nodes
review:update_threads(threads)
end
self:render_signcolumn()
self:render_signs()
end
else
utils.error "Failed to create thread"
Expand Down Expand Up @@ -713,7 +721,7 @@ function OctoBuffer:do_add_pull_request_comment(comment_metadata)
break
end
end
self:render_signcolumn()
self:render_signs()
end
else
utils.error "Failed to create thread"
Expand Down Expand Up @@ -765,7 +773,7 @@ function OctoBuffer:do_update_comment(comment_metadata)
break
end
end
self:render_signcolumn()
self:render_signs()
end
end
end,
Expand Down Expand Up @@ -797,10 +805,11 @@ function OctoBuffer:update_metadata()
end
end

---Renders the signcolumn
function OctoBuffer:render_signcolumn()
---Renders the signs in the signcolumn or statuscolumn
function OctoBuffer:render_signs()
local use_signcolumn = config.values.ui.use_signcolumn
if not use_signcolumn or not self.ready then
local use_statuscolumn = config.values.ui.use_statuscolumn
if not self.ready or (not use_statuscolumn and not use_signcolumn) then
return
end

Expand Down
3 changes: 2 additions & 1 deletion lua/octo/reviews/thread-panel.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
local OctoBuffer = require("octo.model.octo-buffer").OctoBuffer
local utils = require "octo.utils"
local vim = vim

local M = {}

Expand Down Expand Up @@ -108,7 +109,7 @@ function M.create_thread_buffer(threads, repo, number, side, path)
repo = repo,
}
buffer:render_threads(threads)
buffer:render_signcolumn()
buffer:render_signs()
elseif vim.api.nvim_buf_is_loaded(bufnr) then
buffer = octo_buffers[bufnr]
else
Expand Down
1 change: 1 addition & 0 deletions lua/octo/ui/colors.lua
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ local function get_hl_links()
CursorLine = "CursorLine",
VertSplit = "VertSplit",
SignColumn = "Normal",
StatusColumn = "SignColumn",
StatusLine = "StatusLine",
StatusLineNC = "StatusLineNC",
EndOfBuffer = "EndOfBuffer",
Expand Down
44 changes: 32 additions & 12 deletions lua/octo/ui/signs.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
local config = require "octo.config"
local vim = vim

local M = {}

Expand Down Expand Up @@ -28,31 +29,50 @@ function M.place(name, bufnr, line)
if not line then
return
end
pcall(vim.fn.sign_place, 0, "octo_ns", name, bufnr, { lnum = line + 1 })
-- sign column
if config.values.ui.use_signcolumn then
pcall(vim.fn.sign_place, 0, "octo_ns", name, bufnr, { lnum = line + 1 })
end
-- status column
-- TODO: implement status column support for thread signs
end

function M.unplace(bufnr)
bufnr = bufnr or vim.api.nvim_get_current_buf()
pcall(vim.fn.sign_unplace, "octo_ns", { buffer = bufnr })
-- sign column
if config.values.ui.use_signcolumn then
pcall(vim.fn.sign_unplace, "octo_ns", { buffer = bufnr })
end
-- status column
if config.values.ui.use_statuscolumn then
require("octo.ui.statuscolumn").reset(bufnr)
end
end

function M.place_signs(bufnr, start_line, end_line, is_dirty)
if not start_line or not end_line then
return
end
local dirty_mod = is_dirty and "dirty" or "clean"
-- sign column
if config.values.ui.use_signcolumn then
local dirty_mod = is_dirty and "dirty" or "clean"

if start_line == end_line or end_line < start_line then
M.place(string.format("octo_%s_line", dirty_mod), bufnr, start_line)
else
M.place(string.format("octo_%s_block_start", dirty_mod), bufnr, start_line)
M.place(string.format("octo_%s_block_end", dirty_mod), bufnr, end_line)
end
if start_line + 1 < end_line then
for j = start_line + 1, end_line - 1, 1 do
M.place(string.format("octo_%s_block_middle", dirty_mod), bufnr, j)
if start_line == end_line or end_line < start_line then
M.place(string.format("octo_%s_line", dirty_mod), bufnr, start_line)
else
M.place(string.format("octo_%s_block_start", dirty_mod), bufnr, start_line)
M.place(string.format("octo_%s_block_end", dirty_mod), bufnr, end_line)
end
if start_line + 1 < end_line then
for j = start_line + 1, end_line - 1, 1 do
M.place(string.format("octo_%s_block_middle", dirty_mod), bufnr, j)
end
end
end
-- status column
if config.values.ui.use_statuscolumn then
return require("octo.ui.statuscolumn").add(bufnr, start_line, end_line, is_dirty)
end
end

return M
Loading
Loading