From 97195d4ab5667d9be40db4c240304a26f48faf75 Mon Sep 17 00:00:00 2001 From: Harrison Cramer Date: Sat, 12 Aug 2023 14:36:48 -0400 Subject: [PATCH] Feat: Configure discussion tree split width and position This MR improves the configurability of the plugin by using Nui's split system rather than managing the splits ourselves. This lets the user configure both the positioning of the discussion tree and it's width, and reduces overall maintenance of split management for the plugin. --- README.md | 3 +++ lua/gitlab/discussions.lua | 21 +++++++++++++++------ lua/gitlab/init.lua | 7 ++++++- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 926ac94..22dd927 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,9 @@ require("gitlab").setup({ delete_comment = "dd", reply_to_comment = "r", toggle_node = "t", + position = "left", -- "top", "right", "bottom" or "left" + size = "20%", -- Size of split + relative = "editor" -- Position relative to "editor" or "window" }, dialogue = { -- The confirmation dialogue for deleting comments focus_next = { "j", "", "" }, diff --git a/lua/gitlab/discussions.lua b/lua/gitlab/discussions.lua index b3a8e43..f46681f 100644 --- a/lua/gitlab/discussions.lua +++ b/lua/gitlab/discussions.lua @@ -1,5 +1,6 @@ local u = require("gitlab.utils") local NuiTree = require("nui.tree") +local NuiSplit = require("nui.split") local job = require("gitlab.job") local state = require("gitlab.state") local Job = require("plenary.job") @@ -57,11 +58,12 @@ M.list_discussions = function() return end - vim.cmd.tabnew() - local buf = vim.api.nvim_create_buf(false, true) - vim.api.nvim_command("aboveleft vsplit") - vim.api.nvim_buf_set_option(buf, 'filetype', 'markdown') - vim.api.nvim_set_current_buf(buf) + local splitState = state.DISCUSSION_SPLIT + splitState.buf_options = { modifiable = false } + local split = NuiSplit(splitState) + split:mount() + + local buf = split.bufnr local allDiscussions = {} for i, discussion in ipairs(data.discussions) do local discussionChildren = {} @@ -90,7 +92,6 @@ M.list_discussions = function() state.tree:render() vim.api.nvim_buf_set_option(buf, 'filetype', 'markdown') u.darken_metadata(buf, '') - M.jump_to_file() end) end end, @@ -105,6 +106,14 @@ M.jump_to_file = function() local node = state.tree:get_node() if node == nil then return end + local wins = vim.api.nvim_list_wins() + local discussion_win = vim.api.nvim_get_current_win() + for _, winId in ipairs(wins) do + if winId ~= discussion_win then + vim.api.nvim_set_current_win(winId) + end + end + local childrenIds = node:get_child_ids() -- We have selected a note node if node.file_name ~= nil then diff --git a/lua/gitlab/init.lua b/lua/gitlab/init.lua index 019d231..08d2759 100644 --- a/lua/gitlab/init.lua +++ b/lua/gitlab/init.lua @@ -134,9 +134,14 @@ M.setPluginConfiguration = function(args) error("The .gitlab.nvim project file's 'project_id' must be number") end - -- Configuration for the plugin, such as port of server + -- Configuration for the plugin, such as port of server, layout, etc state.PORT = args.port or 21036 state.LOG_PATH = args.log_path or (vim.fn.stdpath("cache") .. "/gitlab.nvim.log") + state.DISCUSSION_SPLIT = { + relative = args.discussion_tree and args.discussion_tree.relative or "editor", + position = args.discussion_tree and args.discussion_tree.position or "left", + size = args.discussion_tree and args.discussion_tree.size or "20%", + } return true end