feat: toggle docs view instead of just showing it

This commit is contained in:
amrbashir
2022-05-14 13:53:41 +02:00
parent bd033385d2
commit e30462dff6
3 changed files with 55 additions and 48 deletions

View File

@@ -8,7 +8,7 @@ A neovim plugin to display lsp hover documentation in a side panel.
Using [vim-plug](https://github.com/junegunn/vim-plug) Using [vim-plug](https://github.com/junegunn/vim-plug)
```viml ```viml
Plug 'amrbashir/nvim-docs-view' Plug 'amrbashir/nvim-docs-view', { 'on': 'DocsViewToggle'}
lua << EOF lua << EOF
require("docs-view").setup { require("docs-view").setup {
@@ -23,6 +23,8 @@ Using [packer.nvim](https://github.com/wbthomason/packer.nvim)
```lua ```lua
use { use {
"amrbashir/nvim-docs-view", "amrbashir/nvim-docs-view",
opt = true,
cmd = { "DocsViewToggle" },
config = function() config = function()
require("docs-view").setup { require("docs-view").setup {
position = "right", position = "right",
@@ -34,7 +36,7 @@ use {
## Usage ## Usage
Use `:DocsViewShow` to open the docs view side panel Use `:DocsViewToggle` to open/close the docs view side panel
## LICENSE ## LICENSE

View File

@@ -14,53 +14,58 @@ M.setup = function(conf)
end end
end end
local buf, win, start_win local buf, win, prev_win
M.show = function() M.toggle = function()
if win and vim.api.nvim_win_is_valid(win) then return end if win and vim.api.nvim_win_is_valid(win) then
vim.api.nvim_win_close(win, true)
start_win = vim.api.nvim_get_current_win() win = nil
buf = nil
if config.position == "left" then prev_win = nil
vim.api.nvim_command("topleft vnew")
else else
vim.api.nvim_command("botright vnew") prev_win = vim.api.nvim_get_current_win()
if config.position == "left" then
vim.api.nvim_command("topleft vnew")
else
vim.api.nvim_command("botright vnew")
end
win = vim.api.nvim_get_current_win()
buf = vim.api.nvim_get_current_buf()
vim.api.nvim_win_set_width(win, math.ceil(config.width))
vim.api.nvim_buf_set_name(buf, "Docs View")
vim.api.nvim_buf_set_option(buf, "buftype", "nofile")
vim.api.nvim_buf_set_option(buf, "swapfile", false)
vim.api.nvim_buf_set_option(buf, "bufhidden", "wipe")
vim.api.nvim_buf_set_option(buf, "filetype", "nvim-docs-view")
vim.api.nvim_set_current_win(prev_win)
vim.api.nvim_create_autocmd(
{ "CursorHold" },
{ pattern = "*", callback = function()
local l,c = unpack(vim.api.nvim_win_get_cursor(0))
vim.lsp.buf_request(0, "textDocument/hover", {
textDocument = { uri = "file://"..vim.api.nvim_buf_get_name(0) },
position = { line = l - 1, character = c }
}, function(err, result, ctx, config)
if not (result and result.contents) then return end
local md_lines = vim.lsp.util.convert_input_to_markdown_lines(result.contents)
md_lines = vim.lsp.util.trim_empty_lines(md_lines)
if vim.tbl_isempty(md_lines) then return end
vim.api.nvim_buf_set_option(buf, "modifiable", true)
vim.lsp.util.stylize_markdown(buf, md_lines)
vim.api.nvim_buf_set_option(buf, "modifiable", false)
end
)
end
}
)
end end
win = vim.api.nvim_get_current_win()
buf = vim.api.nvim_get_current_buf()
vim.api.nvim_win_set_width(win, math.ceil(config.width))
vim.api.nvim_buf_set_name(buf, "Docs View")
vim.api.nvim_buf_set_option(buf, "buftype", "nofile")
vim.api.nvim_buf_set_option(buf, "swapfile", false)
vim.api.nvim_buf_set_option(buf, "bufhidden", "wipe")
vim.api.nvim_buf_set_option(buf, "filetype", "nvim-docs-view")
vim.api.nvim_set_current_win(start_win)
vim.api.nvim_create_autocmd(
{ "CursorHold" },
{ pattern = "*", callback = function()
local l,c = unpack(vim.api.nvim_win_get_cursor(0))
vim.lsp.buf_request(0, "textDocument/hover", {
textDocument = { uri = "file://"..vim.api.nvim_buf_get_name(0) },
position = { line = l - 1, character = c }
}, function(err, result, ctx, config)
if not (result and result.contents) then return end
local md_lines = vim.lsp.util.convert_input_to_markdown_lines(result.contents)
md_lines = vim.lsp.util.trim_empty_lines(md_lines)
if vim.tbl_isempty(md_lines) then return end
vim.api.nvim_buf_set_option(buf, "modifiable", true)
vim.lsp.util.stylize_markdown(buf, md_lines)
vim.api.nvim_buf_set_option(buf, "modifiable", false)
end
)
end
}
)
end end
return M return M

View File

@@ -3,5 +3,5 @@ if exists('g:loaded_docs_view')
endif endif
let g:loaded_docs_view = 1 let g:loaded_docs_view = 1
command! -nargs=0 DocsViewShow lua require("docs-view").show() command! -nargs=0 DocsViewToggle lua require("docs-view").toggle()